SSLContext未使用来自JVM TrustStore的证书

jyztefdp  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(114)

我需要向使用TLS客户端身份验证的服务器发送一个请求,为此,我创建了一个包含证书和私钥的PKCS 12文件,并在SSLContext中将其设置为KeyManager。

KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystoreInputStream = new FileInputStream("C:/Users/PC/Desktop/certprivate.p12");
keystore.load(keystoreInputStream, "password".toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore, "password".toCharArray());

SSLContext sc = SSLContext.getInstance("TLSv1.3");
sc.init(kmf.getKeyManagers(), null, null);

我还使用keytool从cacerts存储中的服务器添加证书,虽然这不起作用,但我使用InstallCerts下载了我猜所有的中间证书并在cacerts中安装了这些证书。
我不知道为什么会出现这种情况,据我所知,如果TrustManager设置为null,它将使用默认的TrustManager,在本例中为:

String certificatesTrustStorePath = "C:/Program Files/Java/jdk-15.0.2/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

编辑:我不明白为什么TLS握手已经完成了,请求却失败了。否则我会得到一些其他的错误/异常。

ibps3vxo

ibps3vxo1#

添加-Djavax .NET.debug=all到你的java启动命令行,你会得到更多的信息。在你可以诊断你的问题之后。JC

nhaq1z21

nhaq1z212#

我可能会晚一点给出一个可能的答案。但是我遇到了同样的问题,根据我的经验,由于在设置SSLContext时的一些问题,假设在Java 11中没有专门为我选择trustStore和keyStore。所以我必须使用JVM参数来设置它们。但是设置trustStore和keyStore是不够的,请为他们两个设置密码。2这对我很有效。3另外我还设置了TLSv1.2的TLS协议。4我希望这能有所帮助。

相关问题