如何使用通用访问卡连接到HTTPS服务器

时间:2009-04-15 17:40:41

标签: java security jaas cac

我需要编写一个java程序来连接到HTTPS服务器(DoD网站)。该网站需要CAC(DoD通用访问卡)身份验证。如果您通过浏览器访问此站点,则先插入CAC,然后输入PIN。

我需要在java中以编程方式完成身份验证过程(有点像浏览器)。如何从CAC检索信息?我一直在谷歌上搜索Java PKCS#11参考指南。看起来像Sun PKCS#11 Provider可以做到这一点,但您需要本机PKCS#11令牌实现。

我是对的吗?有没有人这样做过?任何建议或评论将不胜感激。

1 个答案:

答案 0 :(得分:4)

首先,您需要安装PKCS#11支持。这是您的读卡器可能附带的一些本机代码,它提供了一个提供PKCS#11接口的.dll(或.so)。系统上的其他软件,如Mozilla产品和Sun的PKCS#11提供程序,使用此库。 (Microsoft产品通常使用不同的界面“CAPI”。)

然后,按照PKCS #11 Reference Guide,中的说明设置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。如果您正在使用的服务器需要一个完整的链,请发布一个后续问题。