当前位置: 首页 > 知识库问答 >
问题:

将PGP(公共)密钥存储在java Keystore-BouncyCastle中

郝玄天
2023-03-14

在SSO的实现中,我使用了bouncycastle(JAVA)进行签名、加密、解密和签名的验证。我有原始PGP公钥和私钥,我需要将它们存储在Java Keystore中。这些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:将certificat(类型为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源代码)感兴趣,但是使用一些工具的示例也会有帮助。

  • 共有1个答案

    欧镜
    2023-03-14

    我认为您应该从PGPPublicKey中提取一个java.security.publicKey,并使用它构造一个X509Certifice,它可以存储在密钥存储库中。

    JcaPGPKeyConverter c = new JcaPGPKeyConverter();
    PublicKey publicKey = c.getPublicKey(pgpPublicKey);
    // ... Use Bouncy's X509V3CertificateGenerator or X509v3CertificateBuilder
    // ... to construct a self-signed cert
    X509Certificate x509Certificate = // ...
    // ... add cert to KeyStore
    

    若要从公钥创建X509Certificate,请参见:生成随机证书。

     类似资料:
    • 对于PGP想要使用的签名和加密密钥,我是否可以使用2个JCE、RSA或DSA keypairs?把它们保存在密钥库中,当我想使用这些密钥时,只需按需重建PGP基础结构?

    • 我正在尝试在BouncyCastle中导入公共和私有ECDH密钥。为了导入公钥,我使用了下面的C#代码,代码运行良好: 公钥:042E3E5CCF6B9AB04BE7A22F3FACCDE73C87E87155394A34815408A896CA18A374DAC669AF36220FC863767F4AF47507C5BC221FC4A19874DAF39B074E3EB8 私钥:be3f9bf

    • 我一直在尝试使用BouncyCastle库来进行PGP加密/解密。我有一些代码需要修改,以便只使用流-不使用文件。 我尝试移除pgputilities.writeFileToliteralData(),然后让它返回一个流,但没有成功(输出流为空)。 这里更明确的是方法应该是什么: 下面是我需要修改的代码:

    • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern

    • 2)生成CA证书请求 3)生成自签有效期-10年 4)使用KeyStoreExplorer这样的程序将密钥对(私钥和自签名证书)导入到新的JKS中

    • 我试图使用java BouncyCastle库解密和验证PGP消息,但遇到了一些问题,抱怨PartialInputStream过早结束。 我知道encrypt工作得很好,因为我可以在命令行上使用gpg解密和验证使用encrypt函数创建的消息。