我们正在开发一个新的安全项目。 我们希望启用服务器端和客户端身份验证。 为了允许客户端身份验证,我们希望创建可以放入“读卡器”并使用指纹解锁的卡。
现在,我们目前有一些A公司的读卡器,为了我们的客户端(java - 不是浏览器,而是我们自己的小软件)使用该卡上的证书,java程序使用本机打电话给一个允许我们联系它的dll。
我正在寻找一种方法来连接读卡器通用,以防我们将读卡器更换为B公司。
我的问题是:
是否有更好的方法来访问证书的读卡器?例如,使用纯Java代码(或纯JDK代码),仍然以某种方式检索证书和所需的所有其他操作。
鉴于没有纯粹的java方式,有没有一种通用的方法可以帮助我不依赖于特定的.dll?
您认为这有多安全?也许,在没有读卡器的情况下,有一种相同的安全方式来进行客户端身份验证?
答案 0 :(得分:2)
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肯定需要一些努力和审查才能称之为“安全”。
答案 1 :(得分:0)
一种选择是位于读卡器设备驱动程序和Java应用程序之间的中间件。这样,您的应用程序只与中间件库交互,您无需关心直接访问DLL或您正在使用的硬件类型甚至是sun PKCS11提供程序。如果安装了新的读卡器,则中间件将与驱动器进行交互。您可以访问您的证书,但如果生物识别数据(指纹)存储在智能卡上(而不是存储在您的服务器上),则中间件可以帮助您访问它。制造此类中间件的一家公司是Active Identity。