Java 客户端 SSL 套接字 unknown_ca

标签 java ssl smartcard

我希望能够连接到需要智能卡个人证书进行身份验证的 https 站点。我想我已经非常接近它的工作了,但不确定如何克服这个异常:

javax.net.ssl.SSLHandshakeException: Recieved fatal alert: unknown_ca

由于契约(Contract)原因,我无法分享我的代码,但这里有一个摘要:

我创建了一个 keystore ,其中包含我从浏览器导出的所有证书。我使用这个 keystore 作为 SSLContext 的信任库。我很确定这个 keystore 包含正确的 CA 证书来验证远程站点的证书,因为它修复了“无法找到请求目标的有效证书路径”异常。

我可以使用智能卡读卡器作为提供程序以编程方式创建 keystore ,类似于此处描述的技术:Common Access Card (CAC) Authentication Using Java .从智能卡创建的 keystore 包含我的个人证书。当我将它用作 SSLContext 的 keystore 时,这会解决错误消息:“收到致命警报:handshake_failure”。

所以,看来我越来越近了!但我看到的最新堆栈跟踪是:

javax.net.ssl.SSLHandshakeException: Recieved fatal alert: unknown_ca

我添加了 jvm 标志 -Djavax.net.debug=ssl 并且我看到了良好的 ssl 调试信息,但不确定如何读取调试跟踪以找出哪个 ca 是未知的?

一个问题:信任库 keystore 包含所有 CA 证书。然而,从智能卡创建的 keystore 不包含任何 CA 证书(它只包含在智能卡上找到的个人证书)。也许我需要将 CA 添加到 keystore ?

Andy 关于我可能遗漏的内容和/或如何解释 ssl 调试输出的其他建议/想法?

最佳答案

从智能卡创建 keystore 时,我似乎需要通过提供程序。

为了从智能卡创建 keystore ,我创建了一个 card.config 文件,然后使用此处描述的代码:Common Access Card (CAC) Authentication Using Java :

Provider provider = new sun.security.pkcs11.SunPKCS11("card.config");
Security.addProvider(provider);

然后,我使用这样的代码来创建 keystore :

KeyStore ks = KeyStore.getInstance("PKCS11");

将该行更改为以下内容似乎已解决“unknown_ca”问题:

KeyStore ks = KeyStore.getInstance("PKCS11", provider);

更新:将提供程序添加为第二个参数后,它工作了一段时间,但现在我又看到了 unknown_ca 错误?!

关于Java 客户端 SSL 套接字 unknown_ca,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20999561/

相关文章:

smartcard - 为什么真正的 POS 终端不使用 PSE(2PAY 或 1PAY)?

Java SimpleDateFormat 不会使用 setLenient(false) 解析 2013 年的特定时间

Java - 尝试计算来自 Getter 的值的平均值

ssl - Alamofire 测试包括自签名证书?

ssl - 来自 Mule 的 IBM MQ 连接问题 - UNSUPPORTED_CIPHER_SUITE 并且没有 mqjbnd 错误

c++ - 智能卡获取响应返回状态 6D00

android - 如何在智能卡读卡器中实现被动认证?

java - Spring JMS ActiveMQ 跟踪作业状态

java - 静态字段覆盖在 Java 7 中工作得很好

Solace MQTT 上的 SSL 连接抛出未知协议(protocol)错误