我在 SSO 的实现中使用 bouncycastle (JAVA) 进行签名、加密、解密和签名验证。我有原始 PGP 公钥和私钥,我需要将它们存储在 Java 密钥库中。这些 PGP 公钥没有证书。
我知道对于公钥(根据 Keystore 的 javadoc:http: //docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html),我必须创建证书。创建证书后,我可以将其作为 KeyStore.TrustedCertificateEntry 导入密钥库。但是,我无法为 org.bouncycastle.openpgp.PGPPublicKey 类型创建证书条目。
我在网上搜索过,但找不到任何有效的例子:
- Bouncycastle 文档:http ://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation 为 X.509 密钥生成证书 -
Bouncycastle 示例 - org.bouncycastle.openpgp.examples.DirectKeySignature:将证书(PGPSignature 类型的对象)直接添加到 PGPPublicKey。总而言之 - 我已经签署(认证)PGPPublicKey,但我无法将这种类型的密钥存储到 java 密钥库中。
OutputStream out = new ByteArrayOutputStream(); if (armor) { out = new ArmoredOutputStream(out); } PGPPrivateKey pgpPrivKey = secretKey.extractPrivateKey(secretKeyPass.toCharArray(), "BC"); PGPSignatureGenerator sGen = new PGPSignatureGenerator(secretKey.getPublicKey().getAlgorithm(), PGPUtil.SHA1, "BC"); sGen.initSign(PGPSignature.DIRECT_KEY, pgpPrivKey); BCPGOutputStream bOut = new BCPGOutputStream(out); sGen.generateOnePassVersion(false).encode(bOut); PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator(); boolean isHumanReadable = true; spGen.setNotationData(true, isHumanReadable, notationName, notationValue); PGPSignatureSubpacketVector packetVector = spGen.generate(); sGen.setHashedSubpackets(packetVector); bOut.flush(); return PGPPublicKey.addCertification(keyToBeSigned, sGen.generate()).getEncoded();
我主要对编程解决方案(java 源代码)感兴趣,但使用一些工具的示例也会有所帮助。
谢谢!