【发布时间】:2015-06-23 04:05:13
【问题描述】:
据我了解,如果我这样做:
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 忽略了生成证书的密钥类型)。
是这样弄的吗? 这么多其他例子都异常热心的拿到证书和java的私钥out密钥库,以便他们可以:
- 将私钥的纯文本粘贴到他们的代码中(PEM 格式)
- 包含私钥的纯文本(PEM 格式)作为要签入到源代码存储库的文件
- 否则发布他们的私钥
OR 如果开发人员有某种线索,他们现在面临保护私钥的问题,因为他们已经设法将其取出的密钥库! (这就是在我有一个灯泡时刻之前的地方!)。
【问题讨论】:
-
如果标题错了,请告诉我,重新 x509 位。我的意思是 PEM 编码,我想。
-
如果有人知道一本很好的“Java 密码学的每个用户都需要知道的内容”一书,请发表评论:-)
-
你总是不得不保护一些东西。如果它不是私钥,那么它将是密钥和/或密钥库的密码。
标签: java security encryption keystore