Windows keystore 和证书

标签 windows certificate java

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

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

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

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

这里有一些更多的证据来支持我的案例(来自客户的沟通):

创建 Windows Key Store(从 Java Keystore 导出)步骤在这里 -

  1. 生成RSA key

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

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

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

选择“Place all certificates in the following store”单选按钮并单击“Browse”按钮将其添加到 windows 证书存储中。 C。在 Windows 我的商店中查看此证书。

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

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

提前致谢

最佳答案

也许您想看一下 Oracle 的文档 [ 1 ] 在 SunMSCAPI 提供程序上,可用于访问存储在 Windows-MY(个人)和 Windows-ROOT 中的证书和 key (受信任的根证书颁发机构)存储。

还有一小段代码,看起来很符合你的需求:

   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 store 包含证书和私钥,两者都可以使用 SunMSCAPI 提供程序从 Java 中读取,并可用于签署数字文档。

关于Windows keystore 和证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13697934/

相关文章:

c++ - 如何在 DirectWrite 中使用默认 UI 字体绘制文本?

java - 如何解码 base64 编码的证书

c# - 如何对自定义套接字 TCP 协议(protocol)使用证书身份验证?

ios - 如何在气隙式 Mac 上安装新的 Apple 全局开发者关系中级证书?

java - 获取 java.lang.NoClassDefFoundError : com/google/gson/Gson

java - 从命令行运行 Netbeans maven 项目?

c++ - 如何绘制粗线的轮廓?

windows - 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

Java 循环遍历 2D 数组 - 作业

c++ - 仅使用 600 MB 内存时调整 QByteArray 的大小会抛出 std::bad_alloc