6

我最近继承了一个具有最少文档的项目,该项目执行文档的数字签名,我收到了一个让我有点困惑的更改请求。

该应用程序基于 Java,并利用 Java 密钥库 (JKS) 并使用指定为命令行操作的别名的私钥对输入文档进行数字签名。这一切对我来说似乎相当简单,但是更改请求让我感到困惑。

客户要求能够使用“Windows”密钥库(更具体地说,据我所知,与个人证书相关的 Windows-MY 密钥库)。现在,我最初的假设是客户端请求的内容根本不可能,因为此密钥库将只包含证书,不能用于以任何身份签署文档。我不正确,还是 Windows-MY 密钥库只包含公共证书?我不相信私钥会嵌入其中一个证书中。

不幸的是,有一些沟通困难,所以我想在继续之前确保我的推理是正确的。

以下是支持我的案例的更多证据(来自客户的沟通):

创建 Windows 密钥库(从 Java 密钥库导出)步骤在这里 -

  1. 生成 RSA 密钥

     keytool -genkey -alias mykey -keyalg RSA -keystore my.jks -keysize 2048
    
  2. 从上述密钥库导出证书:

     keytool -export -alias mykey -file mykey.crt -keystore my.jks
    
     Enter keystore password:  temp123
    
     Certificate stored in file <mykey.crt>
    
  3. 在 Windows 密钥库中安装上述证书。

一个。双击“mykey.crt”并点击安装证书

湾。选择“将所有证书放入以下存储”单选按钮,然后单击“浏览”按钮将其添加到 Windows 证书存储中。C。在 WindowsMy 商店中检查此证书。

除非我错了,否则 keytool 只会生成证书类型而不是实际的公钥/私钥对?

任何帮助甚至肯定都将不胜感激,对问题缺乏明确性表示歉意,但不幸的是,这就是我目前所要做的。Java 或 Windows 特定的答案会有所帮助,但即使只是对基本原则的确认也将不胜感激。

提前致谢

4

2 回答 2

7

也许您想查看有关提供程序的 Oracle 文档 [ 1 ],该文档SunMSCAPI可用于访问存储在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 中读取,并可用于签署数字文档。

于 2015-04-09T09:18:17.657 回答
0

如果只是想使用 keytool 创建的(java)密钥库的证书及其私钥,以便您可以将其导入 Windows,那么您是否只需将其导出为 PKCS12 格式(PFX)。(即;导出时,使用参数-storetype=pkcs12)

于 2016-11-30T19:32:32.060 回答