java - 为什么 java 使用 JAVA_HOME/lib/security/cacerts 的默认位置 keystore /信任库,尽管我提供了 -Djavax.net.ssl.trustStore 属性

标签 java weblogic keystore

在我的 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 位置导入相同的证书,它对我来说工作正常。

我需要更改的位置和内容以配置不同的 keystore 以避免上述异常。

最佳答案

看到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(我们应该使用来自另一个 keystore 的受信任的 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 - 为什么 java 使用 JAVA_HOME/lib/security/cacerts 的默认位置 keystore /信任库,尽管我提供了 -Djavax.net.ssl.trustStore 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33821785/

相关文章:

java - EJB Home 接口(interface)上的 WebLogic 类转换

java - Spring MVC POST 提交不起作用

weblogic - WLST 脚本错误 - 必须激活更改错误

Android:将 keystore 移交给不同的开发人员

amazon-web-services - 受信任域之间的 Active Directory LDAPS

java - 在 Ant 脚本中记录 Java EE 组件

java - 测试期间如何在 Android 设备之间切换

java - 如何进行数据库查询的 JUNIT 测试

react-native - react-native android项目中keystores文件夹的用途是什么

java - 线程上下文类加载器可以为空吗?