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

Posted

技术标签:

【中文标题】如何使用通用访问卡连接到 HTTPS 服务器【英文标题】:How to connect to HTTPS server using Common Access Card 【发布时间】:2010-10-19 16:02:27 【问题描述】:

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

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

我说的对吗?以前有人做过吗?任何建议或意见将不胜感激。

【问题讨论】:

看看***.com/questions/544056/…它可能会给你一些指导。 【参考方案1】:

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

然后,按照PKCS #11 Reference Guide, 中的说明设置SunPKCS11 提供程序。我必须在我的设置中提供的唯一属性是已安装的本机“库”的位置,以及此提供程序的“名称”后缀。 “name”属性附加到“SunPKCS11-”,因此如果您为名称指定“CAC”,您可以稍后使用Security.getProvider("SunPKCS11-CAC") 查找Provider

然后,您可以使用标准 JSSE 系统属性javax.net.ssl.keyStore(值为"NONE")和javax.net.ssl.keyStoreType(值为"PKCS11")让JSSE 访问CAC 上的密钥材料.您不需要设置密码属性,因为本机代码会在需要时提示用户输入 PIN。

需要注意的是,只有用户的“最终实体”证书可从 CAC 获得。为了构建可信链,大多数服务器都希望客户端发送任何中间证书。解决这个问题是可能的,但很复杂,因为它涉及实现您自己的javax.net.ssl.X509KeyManager。如果您正在使用的服务器需要完整的链,请发布后续问题。

【讨论】:

以上是关于如何使用通用访问卡连接到 HTTPS 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何使 http-proxy-middleware 从 create-react-app 连接到 localhost 服务器

如何使 datagridview 实时连接到本地存储在 VB.NET 中的访问数据库?

如何使 Quarkus 服务器在其 DataSource 无法连接到数据库或即使数据库已关闭时启动

从通用浏览器访问智能卡的架构?或者:如何弥合从浏览器到 PC/SC 堆栈的差距?

Java如何使服务器允许连接到套接字端口?

如何使客户端-服务器套接字应用程序以同步的方式访问数据并对其进行测试