使用Java密钥库来保存自我认证的证书,导出证书为x509 .cer文件没有私钥,在我的Java程序中获取私钥来签署东西

时间:2015-06-23 04:05:13

标签: java security encryption keystore

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

keytool -genkeypair -alias foo

它只需一步即可创建证书,私钥和公钥。

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

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

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

最后,我仍然需要在我的程序中在运行时从密钥库中获取私钥,以便我可以签署其他方可以验证我签名的内容。

那种胆量(依赖KeyStore doc欢呼Dr 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生成证书的关键类型上进行了掩饰)。

这是如何完成的?许多其他示例非常热心地获取证书私有密钥 out 的java密钥库所以他们可以:

  • 将私钥的纯文本粘贴到其代码中(采用PEM格式)
  • 将私钥的纯文本(以PEM格式)包含为要签入源代码存储库的文件
  • 以其他方式发布私钥

OR 如果开发人员有某种线索,他们现在面临着保护私钥的问题,现在他们已经成功解决了这个问题密钥库! (这是我在拍灯泡之前的所在地!)。

1 个答案:

答案 0 :(得分:0)

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