我正在尝试使用Java Applet在基于Web的应用程序中签署一些数据(POST表单)。用户的x509证书将在加密/智能卡中。签名需要附加pkcs#7格式。
我使用本教程/代码作为构建applet的起点 - http://www.developer.com/java/other/article.php/3587361/Java-Applet-for-Signing-with-a-Smart-Card.htm
对我来说,最大的问题似乎是applet要求用户提供pkcs#11实现库的位置。这对我来说是一个很大的禁忌,因为我的典型用户不会知道他的pkcs#11库的位置。
从Oracle的Java文档 - http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html看来,Java并没有附带它自己的实现。
有没有办法在不向用户询问此位置的情况下进行此签名。我没有一个只能在Windows上使用IE和Firefox的解决方案。
我使用了一些智能卡/密码,我注意到插入它的那一刻,我可以在IE& Firefox的个人证书选项卡。这可能意味着加密令牌在插入卡时会注册它包含的所有证书,并在删除卡时将其取消注册。因此,它必须在操作系统/浏览器时暴露一些接口 - 这不能用于签名吗?
答案 0 :(得分:3)
我们做了你想现在做的事(分布式与客户端模块签名)分布式加密添加为我们SecureBlackox产品,我们提供ActiveX控件的IE浏览器和Java小程序的其他浏览器中。
不幸的是,PKCS#11 DLL未在任何地方注册,因此您无法避免向用户询问此DLL的位置。
大多数硬件设备都支持PKCS#11和CryptoAPI接口。在CryptoAPI接口中,CSP DLL将基于硬件的证书暴露给CryptoAPI引擎,从而暴露给应用程序。在这种情况下,您可以使用与Windows CryptoAPI一起使用的Java类。
PKCS#11是一个由硬件供应商实现的接口,因此Java无法实现它自己--JVM不是硬件而且不包含证书(即使它确实存在,也无法解决您的问题)。我需要注意的是,Firefox内置了PKCS#11驱动程序,Firefox可以通过它访问自己的证书。这样做是为了统一支持软件和硬件存储的证书。
答案 1 :(得分:0)
智能卡或令牌驱动程序(PKCS#11)库具有称为CSP(加密服务提供程序)的附加层,其作用类似于设备驱动程序和OS加密服务之间的桥梁。令牌驱动程序(一旦安装)也会添加此CSP,因此插入令牌或智能卡后,证书中的证书将可用(充当安全存储在加密设备上的私钥的句柄)。
从浏览器作为客户端签名时,现代浏览器不再支持applet。您可以将浏览器扩展用于在浏览器后面运行本机应用程序的目的,以访问证书存储并通过浏览器中的JavaScript提供签名功能。 Signer数字浏览器扩展使用JavaScript提供了各种类型的签名表单浏览器。请参阅页面Digitally Signing From Browser上的3个不同的SO解答链接,以了解使用Web浏览器扩展要实现的各种操作。