Я бы хотел контролировать, к каким общедоступным IP-адресам может подключаться мое приложение, чтобы я мог внести в черный список небольшой набор IP-адресов для исходящих подключений для всего приложения.
Развертывая Java-приложение Tomcat в Heroku, я указал пользовательскую конфигурацию безопасности Java, переопределив «java.security.properties»
web: java $JAVA_OPTS -Djava.security.properties=java.security -jar target/dependency/webapp-runner.jar --port $PORT target/*.war
В этой конфигурации я дал собственный класс SSLSocketFactory
ssl.SocketFactory.provider=security.MyCustomSocketFactory
Это позволяет MyCustomSocketFactory проверять каждый IP-адрес и хост на наличие исходящих соединений в небольшом примере приложения. Тем не менее, это не работает для моего полного приложения после развертывания в Heroku. Класс не найден, даже если он упакован в файл .war.
Caused by: java.lang.ClassNotFoundException: security.MyCustomSocketFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at java.base/javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:105)
at java.base/javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:335)
at java.base/javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:292)
Я думаю, что должен указать, что мой отдельный класс загружается по-разному, потому что мое приложение инициализируется webapp-runner.jar. Есть ли другой подход, который я должен использовать?
Я знаю, что мой класс доступен для какого-то загрузчика классов, потому что я могу вызвать Class.forName()
из своего собственного кода, не получая исключения. Но он просто не может быть загружен с SSLSocketFactory.getDefault()
.