收到致命警报:bad_certificate

我正在尝试建立SSL套接字连接(并在客户端上执行以下操作)

  1. 我生成了证书签名请求以获取签名的客户证书

  2. 现在,我有一个私钥(在CSR中使用),一个签名的客户端证书和根证书(带外获得)。

  3. 我将私钥和签名的客户端证书添加到证书链中,并将其添加到密钥管理器中。和根证书到信任管理器。但是我收到了错误的证书错误。

我很确定自己使用的证书正确。是否也应该将签名的客户端证书添加到信任管理器?试了一下,仍然没有运气。

//I add the private key and the client cert to KeyStore ks

FileInputStream certificateStream = new FileInputStream(clientCertFile);

CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

java.security.cert.Certificate[] chain = {};

chain = certificateFactory.generateCertificates(certificateStream).toArray(chain);

certificateStream.close();

String privateKeyEntryPassword = "123";

ks.setEntry("abc", new KeyStore.PrivateKeyEntry(privateKey, chain),

new KeyStore.PasswordProtection(privateKeyEntryPassword.toCharArray()));

//Add the root certificate to keystore jks

FileInputStream is = new FileInputStream(new File(filename));

CertificateFactory cf = CertificateFactory.getInstance("X.509");

java.security.cert.X509Certificate cert = (X509Certificate) cf.generateCertificate(is);

System.out.println("Certificate Information: ");

System.out.println(cert.getSubjectDN().toString());

jks.setCertificateEntry(cert.getSubjectDN().toString(), cert);

//Initialize the keymanager and trustmanager and add them to the SSL context

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

kmf.init(ks, "123".toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

tmf.init(jks);

我需要在这里创建某种证书链吗?

我也有一个包含这些组件的p12,并且使用了非常相似的代码,将私钥添加到密钥管理器中,并将根证书从p12添加到了信任管理器中,我可以使它工作。但是现在我需要使它在没有p12的情况下工作。

编辑:请求堆栈跟踪。希望这足够了。(注意:我屏蔽了文件名)

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)

at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)

at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)

at client.abc2.openSocketConnection(abc2.java:33)

at client.abc1.runClient(abc1.java:63)

at screens.app.abc.validateLogin(abc.java:197)

... 32 more

回答:

您还需要将根证书添加到密钥库中。

以上是 收到致命警报:bad_certificate 的全部内容, 来源链接: utcz.com/qa/427322.html

回到顶部