Как я могу установить пользовательский SSLSocketFactory в приложении Heroku? - PullRequest
0 голосов
/ 05 января 2019

Я бы хотел контролировать, к каким общедоступным 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().

1 Ответ

0 голосов
/ 07 января 2019

Поскольку codefinger предложил в комментарии, мне нужно было включить MyCustomSocketFactory в путь к классам вне файла war.

Я переместил MyCustomSocketFactory в отдельный проект Maven и построил его в виде отдельного фляги.

Затем я добавил встроенный шаг в свой основной проект, чтобы скопировать JAR в тот же каталог, что и webapp-runner.jar.

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>copy-socketblocker</id>
            <phase>package</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
  <outputDirectory>${basedir}/target/dependency</outputDirectory>
                <resources>
                    <resource>
                        <directory>jars</directory>
                        <includes>socketblocker-1.0.jar</includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

Наконец, я изменил свой Procfile, чтобы использовать сопоставление с подстановочными знаками, и добавил и webapp-runner.jar, и мой пользовательский JAR в качестве записей пути к классам.

web: java $JAVA_OPTS -Djava.security.properties=java.security -cp "target/dependency/*" webapp.runner.launch.Main --port $PORT target/*.war
...