为什么 java 使用 JAVA_HOME/lib/security/cacerts 的默认位置 keystore/truststore 尽管我提供了 -Djavax.net.ssl.trustStore 属性
Why java uses default location keystore/truststore of JAVA_HOME/lib/security/cacerts though I have supplied -Djavax.net.ssl.trustStore properties
在我的 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/standalone/lib/asm-5.0.3.jar:/myapp/standalone/lib/castor-1.3.2-core.jar:/myapp/standalone/lib/myAPP_final.jar
但是 java 没有使用来自自定义路径的自定义密钥库的证书。默认情况下会转到 $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 位置导入相同的证书,它对我来说工作正常。
我需要更改的位置和内容以配置不同的密钥库以避免上述异常。
看到 this Post 后,我配置并提供了以下系统属性 -D 选项,它为我解决了问题。希望它能对其他人有所帮助,所以我发布它。
-Dweblogic.security.CustomTrustKeyStoreFileName=/myapp/app.jks
-Dweblogic.security.TrustKeyStore=CustomTrust
-Dweblogic.security.CustomTrustKeyStorePassPhrase=XXXXXPWD
-Dweblogic.security.CustomTrustKeyStoreType=jks
我已经理解了以下我在 -Dweblogic.security.TrustKeyStore
参数的注释中保留的内容。
注1:-Dweblogic.security.TrustKeyStore会有如下选项和内部解释
-Dweblogic.security.TrustKeyStore=JavaStandardTrust
(我们应该在 JDK 的 cacerts 中使用受信任的 CA,指定这个)
-Dweblogic.security.TrustKeyStore=DemoTrust
(我们应该在 DemoTrust.jks 和 JDK 的 cacerts 中使用受信任的 CA,指定这个)
-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
以查看更详细的日志视图。通常没有该参数我们将无法看到更多详细信息日志。
在我的 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/standalone/lib/asm-5.0.3.jar:/myapp/standalone/lib/castor-1.3.2-core.jar:/myapp/standalone/lib/myAPP_final.jar
但是 java 没有使用来自自定义路径的自定义密钥库的证书。默认情况下会转到 $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 位置导入相同的证书,它对我来说工作正常。
我需要更改的位置和内容以配置不同的密钥库以避免上述异常。
看到 this Post 后,我配置并提供了以下系统属性 -D 选项,它为我解决了问题。希望它能对其他人有所帮助,所以我发布它。
-Dweblogic.security.CustomTrustKeyStoreFileName=/myapp/app.jks
-Dweblogic.security.TrustKeyStore=CustomTrust
-Dweblogic.security.CustomTrustKeyStorePassPhrase=XXXXXPWD
-Dweblogic.security.CustomTrustKeyStoreType=jks
我已经理解了以下我在 -Dweblogic.security.TrustKeyStore
参数的注释中保留的内容。
注1:-Dweblogic.security.TrustKeyStore会有如下选项和内部解释
-Dweblogic.security.TrustKeyStore=JavaStandardTrust
(我们应该在 JDK 的 cacerts 中使用受信任的 CA,指定这个)-Dweblogic.security.TrustKeyStore=DemoTrust
(我们应该在 DemoTrust.jks 和 JDK 的 cacerts 中使用受信任的 CA,指定这个)-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
以查看更详细的日志视图。通常没有该参数我们将无法看到更多详细信息日志。