我最近继承了一个项目,其中包含执行文档数字签名的最少文档,我收到的更改请求让我感到有些困惑。
该应用程序是基于Java的,并且使用Java Keystores(JKS)并使用指定为命令行操作的别名的私钥来对输入文档进行数字签名。这一切对我来说都相当简单,但是变更请求让我感到困惑。
客户端已请求使用“Windows”密钥库(更具体地说,就我所知,与个人证书相关的Windows-MY密钥库)。现在,我最初的假设是客户端请求的内容根本不可能,因为此密钥存储区将只包含证书,这些证书不能用于以任何身份签署文档。我不正确,或者Windows-MY密钥库是否只包含公共证书?我不相信私钥会被嵌入其中一个证书中。
不幸的是,存在一些沟通困难,所以我想确保我的推理是正确的,然后继续进行。
以下是支持我案例的更多证据(来自客户的沟通):
创建Windows密钥库(从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”并单击“安装证书”
湾选择“将所有证书放在以下商店中”单选按钮,然后单击“浏览”按钮将其添加到Windows证书库中。 C。在WindowsMy商店中检查此证书。
除非我错了,否则keytool只生成证书类型而不是实际的公钥/私钥对?
任何协助甚至肯定都会受到高度赞赏,对于问题不明确表示道歉,但不幸的是,这是我现在必须处理的全部内容。 Java或Windows特定的答案会有所帮助,但即使只是确认基本原则也会受到赞赏。
提前致谢
答案 0 :(得分:6)
也许您想查看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读取,并可用于签署数字文档。
答案 1 :(得分:0)
如果只是想使用keytool创建的(java)密钥库证书w /其私钥,以便您可以将其导入到Windows中,那么您只需将其导出为PKCS12格式(PFX)。 (即;导出时,使用参数-storetype = pkcs12)