【问题标题】:Java client SSL Socket unknown_caJava 客户端 SSL 套接字 unknown_ca
【发布时间】:2014-01-26 18:49:29
【问题描述】:

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

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

由于合同原因,我无法分享我的代码,但这里有一个摘要:

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

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

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

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

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

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

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

【问题讨论】:

    标签: java ssl smartcard


    【解决方案1】:

    从智能卡创建密钥库时,我似乎需要传递提供程序。

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

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

    然后,我使用这样的代码来创建密钥库:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多