2014-01-08 138 views
0

我希望能够连接到需要通过智能卡进行身份验证的个人证书的https站点。我觉得我非常接近拥有它的工作,但不知道如何让过去这个异常:Java客户端SSL套接字unknown_ca

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是未知的?

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

Andy有关我可能会丢失什么和/或如何解释ssl调试输出的其他建议/想法?

回答

0

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

若要从智能卡密钥库,我创建了一个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错误?!