我希望能够连接到需要智能卡个人证书进行身份验证的https网站。我认为我非常接近它的工作,但不知道如何通过这个例外:
javax.net.ssl.SSLHandshakeException: Recieved fatal alert: unknown_ca
由于合同,我无法分享我的代码,但这里有一个摘要:
我创建了一个密钥库,其中包含我从浏览器中导出的所有证书。我使用此密钥库作为SSLContext的信任库。我非常确定这个密钥库包含正确的CA证书来验证远程站点的证书,因为它修复了“无法找到有效的证书路径到请求的目标”异常。
我可以使用智能卡读卡器以编程方式创建密钥库,类似于此处描述的技术:Common Access Card (CAC) Authentication Using Java。从智能卡创建的密钥库包含我的个人证书。当我将其用作SSLContext的密钥库时,这将解决错误消息:“Received fatal alert: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 :(得分: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错误了?!