【问题标题】:How can I set a custom SSLSocketFactory on a Heroku app?如何在 Heroku 应用程序上设置自定义 SSLSocketFactory?
【发布时间】:2019-01-05 17:45:14
【问题描述】:

我想控制我的应用可以连接到哪些公共 IP 地址,以便我可以将一小组 IP 列入黑名单,用于整个应用的传出连接。

将 Tomcat Java 应用程序部署到 Heroku,我通过覆盖“java.security.properties”指定了自定义 Java 安全配置

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()加载。

【问题讨论】:

  • 也许类需要在战争之外的类路径上?您可以尝试添加Procfile 与:web: java $JAVA_OPTS -Djava.security.properties=java.security -cp target/classes/:target/dependency/webapp-runner.jar webapp.runner.launch.Main --port $PORT target/*.war
  • 你明白了!感谢您为我指明这条路。我会写下我的最终解决方案作为答案。

标签: java heroku sslsocketfactory


【解决方案1】:

作为评论中的codefinger suggested,我需要将 MyCustomSocketFactory 包含在 war 文件之外的类路径中。

我将 MyCustomSocketFactory 移至单独的 Maven 项目,并将其构建为单独的 jar。

然后,我在主项目中添加了一个构建步骤,将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2018-01-03
    • 2022-06-23
    相关资源
    最近更新 更多