【问题标题】:Use Java keystore to hold self-certified cert, export cert as x509 .cer file sans private key, obtain private key in my Java program to sign stuff使用 Java 密钥库来保存自认证证书,将证书导出为 x509 .cer 文件,没有私钥,在我的 Java 程序中获取私钥来签署东西
【发布时间】:2015-06-23 04:05:13
【问题描述】:

据我了解,如果我这样做:

keytool -genkeypair -alias foo

它在一个步骤中创建证书、私钥和公钥。

那太好了。现在,我可以按照 RFC 1421 以“隐私增强邮件”(PEM) 格式导出证书的公共部分(关于证书主题的信息和公钥):

keytool -exportcert -alias foo -rfc > mycert.cer

我现在可以将mycert.cer 提供给需要验证我使用私钥生成的签名的一方。该私钥在密钥库中保持私有(密钥和存储都可以使用密码加密)。

最后,只需要在我的程序运行时从密钥库中获取私钥,这样我就可以签署一些东西,以便对方可以验证我是否签署了它。

其中的胆量(依靠KeyStore docDr Heron Yang 欢呼)是:

// load the keystore, supplying the store password
KeyStore jks = KeyStore.getInstance("JKS");
jks.load(new FileInputStream(jksFile), jksPass);

// get the 'entry'
KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(password);
KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
    ks.getEntry("foo", protParam);

// grab the bits from the private key
PrivateKey myPrivateKey = pkEntry.getPrivateKey();

现在我可以将myPrivateKey(当然,假设它是正确的密钥)交给类似的东西:

  // import java.security.*
  Signature sig = Signature.getInstance("SHA1withRSA");
  sig.initSign(myPrivateKey);
  sig.update(mybytes);
  return sig.sign();

因此我生成了一个签名,我的另一方(假设他们信任我之前提供给他们的证书并可以将其与我发送给他们的东西相关联)可以用来验证是我给他们提供了数据。

(是的,我之前用 keytool 忽略了生成证书的密钥类型)。

是这样弄的吗? 这么多其他例子都异常热心的拿到证书java的私钥out密钥库,以便他们可以:

  • 将私钥的纯文本粘贴到他们的代码中(PEM 格式)
  • 包含私钥的纯文本(PEM 格式)作为要签入到源代码存储库的文件
  • 否则发布他们的私钥

OR 如果开发人员有某种线索,他们现在面临保护私钥的问题,因为他们已经设法将其取出的密钥库! (这就是在我有一个灯泡时刻之前的地方!)。

【问题讨论】:

  • 如果标题错了,请告诉我,重新 x509 位。我的意思是 PEM 编码,我想。
  • 如果有人知道一本很好的“Java 密码学的每个用户都需要知道的内容”一书,请发表评论:-)
  • 你总是不得不保护一些东西。如果它不是私钥,那么它将是密钥和/或密钥库的密码。

标签: java security encryption keystore


【解决方案1】:

是的!上面的过程很有魅力,而且感觉很好。

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2011-02-08
    相关资源
    最近更新 更多