我需要编写一个java程序来连接到HTTPS服务器(DoD网站).该网站需要CAC(DoD通用访问卡)身份验证.如果您通过浏览器访问此站点,则先插入CAC,然后输入PIN.
我需要在java中以编程方式完成身份验证过程(有点像浏览器).如何从CAC检索信息?我一直在谷歌上搜索Java PKCS#11参考指南.看起来像Sun PKCS#11 Provider可以做到这一点,但您需要本机PKCS#11令牌实现.
我对吗?有没有人这样做过?任何建议或评论将不胜感激.
首先,您需要安装 PKCS #11 支持。这是读卡器可能附带的一些本机代码,它提供了 .dll(或 .so),该 .dll(或 .so)提供了 PKCS #11 接口。系统上的其他软件(例如 Mozilla 产品和 Sun 的 PKCS #11 提供程序)使用此库。(微软产品经常使用不同的接口,“CAPI”。)
然后,按照PKCS #11 参考指南中的说明设置SunPKCS11
提供商。我必须在设置中提供的唯一属性是安装的本机“库”的位置以及该提供程序的“名称”后缀。“name”属性附加到“SunPKCS11-”,因此如果您指定“CAC”作为名称,则可以使用 查找Provider
后者Security.getProvider("SunPKCS11-CAC")
。
然后,您可以使用标准 JSSE 系统属性javax.net.ssl.keyStore
(值为"NONE"
)和javax.net.ssl.keyStoreType
(值为"PKCS11"
)来让 JSSE 访问 CAC 上的密钥材料。您不需要设置密码属性,因为本机代码应在需要时提示用户输入 PIN。
需要注意的是,CAC 只能提供用户的“最终实体”证书。为了构建可信链,大多数服务器希望客户端发送任何中间证书。解决这个问题是可能的,但很复杂,因为它涉及实现您自己的javax.net.ssl.X509KeyManager
. 如果您使用的服务器需要完整的链,请发布后续问题。