java - 在 Java Applet 中实现数字签名

标签 java digital-signature jce pkcs#7 pkcs#11

我正在尝试使用 Java Applet 在基于 Web 的应用程序中签署一些数据(POST 表单)。用户的 x509 证书将位于加密 token /智能卡中。签名需要采用附加的 pkcs#7 格式。

我使用本教程/代码作为构建小程序的起点 - http://www.developer.com/java/other/article.php/3587361/Java-Applet-for-Signing-with-a-Smart-Card.htm

这里对我来说最大的问题似乎是小程序要求用户提供 pkcs#11 实现库的位置。这对我来说是一个很大的禁忌,因为我的典型用户不会知道他的 pkcs#11 库的位置。

来自 Oracle 的 Java 文档 - http://docs.oracle.com/javase/6/docs/technotes/guides/security/p11guide.html Java 似乎没有自带实现。

有没有办法在不询问用户位置的情况下进行签名。我可以接受仅适用于 Windows 上的 IE 和 Firefox 的解决方案。

我使用过一些智能卡/加密 token ,我注意到当我插入它时,我可以在 IE 和 Firefox 的个人证书选项卡中看到证书。这可能意味着加密 token 会在您插入卡时向操作系统注册它包含的所有证书,并在您移除卡时注销它。所以当它这样做时,它一定可能向操作系统/浏览器公开了一些接口(interface)——这不能用于签名吗?

最佳答案

我们在 SecureBlackox 产品的分布式加密附加组件中完成了您现在尝试做的事情(使用客户端模块进行分布式签名),并且我们为 IE 提供 ActiveX 控件,为其他浏览器提供 Java applet。

不幸的是,PKCS#11 DLL 没有在任何地方注册,因此您无法避免向用户询问此 DLL 的位置。

大多数硬件设备都支持 PKCS#11 和 CryptoAPI 接口(interface)。在 CryptoAPI 接口(interface)中,CSP DLL 将基于硬件的证书公开给 CryptoAPI 引擎,从而公开给应用程序。在这种情况下,您可以使用适用于 Windows CryptoAPI 的 Java 类。

PKCS#11 是一个接口(interface),由硬件供应商实现,因此 Java 无法实现它自己的 - JVM 不是硬件并且不包含证书(即使它包含,也不能解决您的问题)。我需要注意,Firefox 有内置的 PKCS#11 驱动程序,Firefox 可以通过它访问自己的证书。这样做是为了统一支持软件和硬件存储的证书。

关于java - 在 Java Applet 中实现数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18072356/

相关文章:

java - Tomcat JDBCRealm 身份验证在部署后不起作用

java - RSA Java 投诉签名和验证

安卓工作室 : Installation failed since APK was not signed

java - JsafeJCE 对 KeyManagerFactory 支持的算法有哪些?

java - 使用 javax.crypto.Cipher 与 java.security.Signature 签名

java - Spring Boot 禁用 Actuator root

java - 自定义 JTabbedPane 中的选项卡渲染顺序

java - 创建的文件没有父项?

php - 调用未定义函数 openssl_pkcs7_sign()

java - 这种基于 Java 的多密码加密格式实现安全吗?