6

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 の証明書エントリを作成できません。

Web を検索しましたが、有効な例が見つかりませんでした。

  1. Bouncycastle のドキュメント: http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation X.509 キーの証明書を生成します -
  2. Bouncycastle の例 - org.bouncycastle.openpgp.examples.DirectKeySignature: 証明書 (タイプ PGPSSignature のオブジェクト) を 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 ソース コード) に興味がありますが、いくつかのツールを使用した例も役立ちます。

ありがとう!

4

2 に答える 2

0

java.security.PublicKeyあなたからa を抽出し、それを使用してキーストアに格納できるPGPPublicKeyan を構築する必要があると思います。X509Certificate

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は、 「ランダムな証明書を生成PublicKeyする」を参照してください。

于 2012-08-15T12:27:18.817 に答える
0

公開鍵のみを保存したい場合、鍵の内容を Java キーストアに保存できないのはなぜですか? 次に、コンテンツを取得し、必要に応じて PGPPublicKey オブジェクトに変換します。

最初にラッパー クラスを作成します。

public class PgpPublicKeyWrapper implements Key {
    private final String keyContent;
    public PgpPublicKeyWrapper(final String keyContent) {
        this.keyContent = keyContent;
    }
    @Override
    public String getAlgorithm() {
        return "PGP-PublicKey"; // you can call whatever you want
    }
    @Override
    public String getFormat() {
        return "RAW"; // has to be raw format
    }
    @Override
    public byte[] getEncoded() {
        return keyContent.getBytes();
    }
}

次に、これを実行して保存できます

keyStore.setKeyEntry("think a name for alias", new PgpPublicKeyWrapper(key), PASSWORD, null);

取り出したいとき

Key key = this.keyStore.getKey(alias, PASSWORD);
InputStream is = new ByteArrayInputStream(key.getEncoded());
PGPPublicKey publicKey = readPublicKey(is); 

readPublicKey() については、InputStream を PGPPublicKey オブジェクトに読み込む方法について、オンラインで多くの例を見つけることができます。

于 2016-12-23T01:55:28.227 に答える