正在使用哪个cacert?

which cacert is in use?

我有一个来自供应商的示例命令行 java 应用程序;它取决于 SSL 身份验证。我有供应商的证书,我可以在我的 java 7 cacerts 文件中看到它们(windows,c:\program files\java\jdk1.7.0_07\jre\lib\security\cacerts)。如果我打开 java 8 cacerts 文件,它们不存在 (c:\program files\java\jre1.8.0_66\lib\security\cacerts)

如果我设置一个路径,使 java 8 位于第一个,程序就可以运行。如果我更改路径,使 java 7 位于第一个,程序将失败并出现认证错误:

C:\project\tryCerts\Demo2>path=c:\program files\java\jdk1.7.0_07\bin;c:\program files\java\jre1.8.0_66\bin


C:\project\tryCerts\Demo2>java -jar vendorCmd.jar user1 password2 environment3
Dec 22, 2015 11:11:35 AM [com.sun.xml.ws.policy.jaxws.PolicyConfigParser]  parse
INFO: WSP5018: Loaded WSIT configuration from file: jar:file:/C:/project/tryCerts/Demo2/vendorCmd/dist/vendorCmd.jar!/META-INF/wsit-client.xml.
Unable to log in: com.sun.xml.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.Va
lidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to re
quested target

C:\project\tryCerts\Demo2>path=c:\program files\java\jre1.8.0_66\bin;c:\program files\java\jdk1.7.0_07\bin

C:\project\tryCerts\Demo2>java -jar vendorCmd.jar acc03\acc03_ws_user accwbS3rv!ceS acc03_p_production
Dec 22, 2015 11:21:34 AM [com.sun.xml.ws.policy.jaxws.PolicyConfigParser]  parse
INFO: WSP5018: Loaded WSIT configuration from file: jar:file:/C:/project/tryCerts/Demo2/vendorCmd/dist/vendorCmd.jar!/META-INF/wsit-client.xml.
logged in
Dec 22, 2015 11:21:35 AM [com.sun.xml.ws.policy.jaxws.PolicyConfigParser]  parse
INFO: WSP5018: Loaded WSIT configuration from file: jar:file:/C:/project/tryCerts/Demo2/vendorCmd/dist/vendorCmd.jar!/META-INF/wsit-client.xml.
Signed Info:org.jcp.xml.dsig.internal.dom.DOMSignedInfo@3f071328
AccountNumber: 279105/ Firstname: null/ LastName: null
AccountNumber: 1005118/ Firstname: null/ LastName: COMPANY1
AccountNumber: 2102765/ Firstname: null/ LastName: COMPANY2
AccountNumber: 2101373/ Firstname: null/ LastName: COMPANY3
AccountNumber: 2119664/ Firstname: null/ LastName: COMPANY4
AccountNumber: 2119668/ Firstname: null/ LastName: ET CETERA

C:\project\tryCerts\Demo2>dir/s cacerts
 Volume in drive C is OS
 Volume Serial Number is 9896-211D
File Not Found

C:\project\tryCerts\Demo2>

这与我的预期完全相反——java 7 个文件夹中的 cacerts 文件具有供应商证书链,而 java 8 个文件夹中没有。然而 运行 Java 7 上的程序因认证错误而失败,而 运行 8 上的程序成功。

任何人都可以告诉我我应该寻找什么来解释这个吗?

要确定正在使用的信任库,而不必求助于 strace (linux) 和 process explorer (windows) 之类的工具,您可以通过调试标志 -Djavax.net.debug=ssl 到 java 命令行,它会转储所有与 ssl 相关的调试信息(我在原始评论中提到了 all,但这给输出增加了更多噪音):

java -Djavax.net.debug=ssl -jar vendorCmd.jar user1 password2 environment3

在调试输出的前 10 行中,将是一行:

trustStore is: <path to>cacerts

这表示正在使用的信任库。

使用 =ssl 选项,它还会转储所有被添加到 JVM 认为受信任的证书列表中的受信任证书。这可用于验证您认为在信任库中的证书实际上在信任库中 - 在这种情况下,您应该能够在列表中看到供应商的证书。

the debug options for javax.net.debug 的完整列表详见 JSSE 参考指南。