我最近inheritance了一个项目,用最less量的文档来执行文档的数字签名,而且我收到了一个让我有点困惑的更改请求。
该应用程序是基于Java的,并使用Java密钥库(JKS),并使用指定别名的私钥作为命令行操作对input文档进行数字签名。 这一切对我来说都是相当直接的,但是变更请求让我感到困惑。
客户要求能够使用“Windows”密钥库(更具体地说,就我所知,与个人证书有关的Windows-MY密钥库)。 现在,我最初的假设是,客户端请求的东西根本不可能,因为这个密钥存储区将只包含证书,不能用于以任何身份签署文档。 我是不正确的,还是将Windows-MY密钥库只包含公共证书? 我不相信一个私钥会embedded到这些证书之中。
不幸的是,有一些沟通困难,所以我想确保我的推理是正确的,然后再继续。
这里有更多的证据支持我的案例(来自客户的沟通):
创buildWindows密钥库(从Java密钥库导出)步骤在这里 –
生成RSA密钥
keytool -genkey -alias mykey -keyalg RSA -keystore my.jks -keysize 2048
从上面的密钥库导出证书:
keytool -export -alias mykey -file mykey.crt -keystore my.jks Enter keystore password: temp123 Certificate stored in file <mykey.crt>
在Windows密钥库中安装上述证书。
一个。 双击“mykey.crt”并点击安装证书
湾 select“将所有证书放在下面的商店”单选button,然后单击“浏览”button将其添加到Windows证书存储区。 C。 在WindowsMy商店中检查这个证书。
除非我错了,否则keytool将只生成一个证书types而不是实际的公钥/私钥对?
任何援助,甚至肯定将不胜感激,道歉的问题不明确,但不幸的是,这是我现在必须与之合作。 Java或Windows的具体答案将是有益的,但即使只是确认的基本原则,将不胜感激。
提前致谢
也许你想看看SunMSCAPI
提供商的Oracle文档[ 1 ],它可以用来访问存储在Windows-MY
(个人)和Windows-ROOT
(受信任的根证书颁发机构)商店中的证书和密钥。
还有一些代码片段,这似乎很合理地匹配你的需求:
KeyStore ks = KeyStore.getInstance("Windows-MY"); // Note: When a security manager is installed, // the following call requires SecurityPermission // "authProvider.SunMSCAPI". ks.load(null, null); byte[] data = ... String alias = "myRSA"; PrivateKey privKey = (PrivateKey) ks.getKey(alias, null); Certificate cert = ks.getCertificate(alias); Provider p = ks.getProvider(); Signature sig = Signature.getInstance("SHA1withRSA", p); sig.initSign(privKey); sig.update(data); byte[] signature = sig.sign(); System.out.println("\tGenerated signature..."); sig.initVerify(cert); sig.update(data); if (sig.verify(signature)) { System.out.println("\tSignature verified!"); }
总结:Windows-My商店持有证书以及私钥,两者都可以使用SunMSCAPI
提供程序从Java读取,并可用于对数字文档进行签名。
如果只是想使用keytool创建的(java)keystore的证书和其私钥,以便将其导入到一个窗口中,那么您是否将其导出为PKCS12格式(PFX)。 (即:导出时,使用paramter -storetype = pkcs12)