我们正在研究一个新的担保项目。
我们希望同时启用服务器和客户端身份验证。
为了允许客户端身份验证,我们希望创建可以放入“读卡器”并使用指纹解锁的卡。
现在,当前我们有一些公司A的读卡器,并且为了让我们的客户端(java-不是浏览器,而是我们自己的小型软件)使用该卡上的证书,java程序使用了对允许我们连接的dll。
我正在寻找一种建立与读卡器的通用连接的方式,以防我们将读卡器更改为公司B。
我的问题是:
有更好的方法来访问读卡器以获取证书吗?例如,使用纯Java代码(或纯JDK代码)并且仍然以某种方式获取证书和所需的所有其他操作。
鉴于没有做到这一点的纯Java方法,是否有一种通用方法可以帮助我不依赖特定的.dll?
您认为这有多安全?也许,有一种没有卡读取器的平等安全的方式来进行客户端身份验证?
最佳答案
Oracle JRE带有Sun PKCS#11 provider,它将允许您插入实现PKCS#11 API的DLL。
就Java而言,这绝对是“标准”方式。您的智能卡可以作为KeyStore
实例加载。如果无法从智能卡中提取密钥,则仍将创建一个PrivateKey
对象以在您的应用程序签名/解密中使用,但是您将无法提取私有指数(此处为RSA):它委托按照设计对卡的操作。
(过去我曾在Linux机器上使用OpenSC / OpenCT成功地尝试过它。我相信PKCS#11在Windows上更为罕见,但某些智能卡提供程序可能仍为其提供接口。)
此方法的安全性取决于您使用的PKCS#11实现。调整自己的DLL以使其适合PKCS#11肯定需要付出一些努力并进行检查,然后才能将其称为“安全”。