gpt4 book ai didi

java - 客户端证书握手失败的 TLS

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:17 26 4
gpt4 key购买 nike

我很困惑我到底需要在哪里包含客户端证书。现在,我的第一个问题是我不信任服务器。我尝试使用默认的 Java keystore 文件 (cacerts),其中包含 Thawte 和 Digicert,它们是我尝试与之通信的服务器的根权限。我使用 System.setProperty("javax.net.ssl.keyStore", "...") 将该 cacerts 文件设置为 keystore ,它没有用,我将它设置为信任库,它没有工作。我还有

unable to find valid certification path to requested target

所以我使用 AlwaysTrustSSLConnectionFactory() 暂时解决了这个问题。

现在的问题是服务器不信任我。我有一个客户端证书,我尝试将它添加到 keystore 和信任库中,但无论我做什么,在 ServerHelloDone 之后我都得到了

Warning: no suitable certificate found - continuing without client authentication

在 Java 的 SSL 调试消息和 secret 和 key 消息之后的握手失败。这是我的日志的结尾:

http-bio-8080-exec-3, WRITE: TLSv1.2 Handshake, length = 40
http-bio-8080-exec-3, READ: TLSv1.2 Alert, length = 2
http-bio-8080-exec-3, RECV TLSv1.2 ALERT: fatal, handshake_failure
%% Invalidated: [Session-7, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384]
http-bio-8080-exec-3, called closeSocket()
http-bio-8080-exec-3, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)

这是我当前的代码:

System.setProperty("javax.net.ssl.keyStore", "C:/Users/Lovro/Desktop/certs/api/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "pass");

URL url = new URL(urlRequest);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(new AlwaysTrustSSLContextFactory());
conn.connect();

我从 API 开发人员那里收到格式为 .p12 的客户端证书,因此我将其转换为 .crt 并使用 Keytool。有谁知道可能是什么问题,我的握手失败是因为我没有正确包含客户端证书,或者我没有正确地将它添加到 keystore ?据我了解,truststore 需要包含受信任的根权限的公钥,并且 keystore 应该有我的客户端证书。它是否正确?我如何实现这一点?

欢迎任何建议,我是 TLS/HTTPS 的新手,不知道我在做什么。

最佳答案

I recieved my client certificate from API developers in format .p12, so I converted it to .crt and added that to keystore with Keytool

这是你出错的地方。将其转换为 .crt 可提取公共(public)证书。您需要做的是将 .p12 文件转换为 java keystore 。网上有很多例子。参见 this SO answer如何。

要确认它是否有效,请运行 keytool -list -keystore <yourkeystore>.jks并检查您是否有 PrivateKeyEntry在那里。

在检查内容时,添加 -v标志到 keytool -list命令并检查 Issuer 字段是否为 CN=test, O=test因为我们可以从您的日志文件中看到您的服务器需要由该机构颁发的客户端证书。

同时检查您的 JDK 是否配置了 Unlimited Strength Jurisdiction Policy Files因为要求您使用的密码需要它。

关于java - 客户端证书握手失败的 TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com