【问题标题】:Why java uses default location keystore/truststore of JAVA_HOME/lib/security/cacerts though I have supplied -Djavax.net.ssl.trustStore properties尽管我提供了 -Djavax.net.ssl.trustStore 属性,但为什么 java 使用 JAVA_HOME/lib/security/cacerts 的默认位置 keystore/truststore
【发布时间】:2015-11-20 08:07:02
【问题描述】:

在我的 java 应用程序中,我使用提供的 -Djavax.net.ssl.trustStore 系统属性运行,如下所示。

-Djavax.net.ssl.trustStore=/myapp/app.jks -Djavax.net.ssl.trustStorePassword=XXXXX -Djavax.net.ssl.trustStoreType=jks -Djavax.net.debug=ssl

这是我的完整命令行:

$JAVA_HOME/bin/java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Xms512m -Xmx1024m -XX:MaxPermSize=192m -Djavax.net.ssl.trustStore=/myapp/app.jks -Djavax.net.ssl.keyStore=/myapp/app.jks -Djavax.net.ssl.trustStorePassword=XXXXX -Djavax.net.ssl.keyStorePassword=XXXXX -Dweblogic.security.SSL.ignoreHostnameVerification=true -Djavax.net.debug=ssl -Djavax.net.ssl.trustStoreType=jks -cp /Oracle/Middleware/Oracle_Home/wlserver/server/lib/wlfullclient.jar:/myapp/stand‌​alone/lib/asm-5.0.3.jar:/myapp/standalone/lib/castor-1.3.2-core.jar:/myapp/standa‌​lone/lib/myAPP_final.jar

但是 java 没有使用来自自定义路径的自定义 keyStore 的证书。默认情况下会转到$JAVA_HOME/lib/security/cacerts,但我遇到了异常:

java.net.ConnectException: t3s://myapphost.com:7500: Destination 10.243.155.222, 7900 unreachable; nested exception is:
        javax.net.ssl.SSLHandshakeException: General SSLEngine problem; No available router to destination

当我在 $JAVA_HOME/lib/security/cacerts 中导入和添加相同的证书时,它不会给出任何异常。

我参考了这个post 并尝试在$JAVA_HOME/jre/lib/security/java.security 中配置相同的东西并添加了以下条目:

javax.net.ssl.trustStore=/myapp/app.jks
javax.net.ssl.trustStorePassword=XXXXX
javax.net.ssl.trustStoreType=jks

我仍然面临同样的问题。

我的问题和问题是,为什么 java 总是使用 java 默认 keyStore 位置:$JAVA_HOME/lib/security/cacerts 尽管我已经提供并配置了我自己的自定义 keyStore,但使用的是:-Djavax.net.ssl.trustStore=/myapp/app.jks -Djavax.net.ssl.trustStorePassword=XXXXX -Djavax.net.ssl.trustStoreType=jks -Djavax.net.debug=ssl

如果我在默认的 java keyStore loation 中导入相同的证书,它对我来说工作正常。

我需要更改的位置和所有内容以配置不同的密钥库以避免上述异常。

【问题讨论】:

  • 请发布整个命令行,并解释为什么您认为 Java 使用默认的信任库位置。我在这里没有看到任何实际证据。
  • $JAVA_HOME/bin/java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -Xms512m -Xmx1024m -XX:MaxPermSize=192m -Djavax.net.ssl.trustStore=/myapp/app. jks -Djavax.net.ssl.keyStore=/myapp/app.jks -Djavax.net.ssl.trustStorePassword=XXXXX -Djavax.net.ssl.keyStorePassword=XXXXX -Dweblogic.security.SSL.ignoreHostnameVerification=true -Djavax.net .debug=ssl -Djavax.net.ssl.trustStoreType=jks -cp /Oracle/Middleware/Oracle_Home/wlserver/server/lib/wlfullclient.jar:/myapp/standalone/lib/asm-5.0.3.jar:/myapp /standalone/lib/castor-1.3.2-core.jar:/myapp/standalone/lib/myAPP_final.jar
  • 以上是我完整的命令行。我正在使用:java 版本“1.7.0_79”Java(TM) SE 运行时环境(构建 1.7.0_79-b15)Java HotSpot(TM) 64 位服务器 VM(构建 24.79-b02,混合模式)
  • 我注意到如果我在类路径中没有 /Oracle_Home/wlserver/server/lib/wlfullclient.jar:我得到不同的异常:如下所示:ExecuteThread:'5' for queue:' default',处理异常:java.net.SocketTimeoutException:读取超时 ExecuteThread:'5' for queue:'default',处理异常:java.net.SocketTimeoutException:读取超时 - 2015-11-20 04:54:02,645 [AT_230SMyApp:AutoLog] INFO 关于自定义证书系统参数docs.oracle.com/middleware/1221/wls/SACLT/security.htm#SACLT221,我也尝试了以下 URL,我遇到了同样的错误
  • 这些都表明与信任库无关。这一切似乎都与网络连接有关。

标签: java weblogic keystore


【解决方案1】:

看到this Post 后,我已经配置并提供了以下系统属性-D 选项,它为我解决了问题。希望对其他人有所帮助,所以我将其发布。

-Dweblogic.security.CustomTrustKeyStoreFileName=/myapp/app.jks 
 -Dweblogic.security.TrustKeyStore=CustomTrust 
 -Dweblogic.security.CustomTrustKeyStorePassPhrase=XXXXXPWD
 -Dweblogic.security.CustomTrustKeyStoreType=jks 

我已经了解了以下我在 Note: of -Dweblogic.security.TrustKeyStore 参数中保留的内容。

注意1: -Dweblogic.security.TrustKeyStore会有以下选项和内部解释

  1. -Dweblogic.security.TrustKeyStore=JavaStandardTrust我们应该在JDK的cacerts中使用受信任的CA时,指定这个
  2. -Dweblogic.security.TrustKeyStore=DemoTrust我们应该在 DemoTrust.jks 和 JDK 的 cacerts 中指定受信任的 CA 时使用,指定此
  3. -Dweblogic.security.TrustKeyStore=CustomTrust我们应该使用来自另一个密钥库的受信任 CA,指定此)。

注2

任何时候如果您遇到异常,这意味着您的 java 应用程序没有在指定的信任库中找到证书。

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
        at sun.security.validator.Validator.validate(Validator.java:260)

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:unable to find valid certification path to requested target,It is telling the same.

注意 3: 重要的事情尝试识别-Djavax.net.debug=ssl 以查看更多详细的日志视图。通常没有该参数,我们将无法查看更多详细信息日志。

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 2016-01-31
    • 2023-03-25
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多