7

皆さん、こんにちは Java プログラムで生成した PKCS#8 秘密鍵を PEM エンコード ファイルに変換しようとしています。

Security.addProvider(new BouncyCastleProvider());
SecureRandom rand = new SecureRandom();
JDKKeyPairGenerator.RSA keyPairGen = new JDKKeyPairGenerator.RSA();        
keyPairGen.initialize(2048, rand);
KeyPair keyPair = keyPairGen.generateKeyPair();

PEMWriter privatepemWriter = new PEMWriter(new FileWriter(new File(dir + "private.key")));
privatepemWriter.writeObject(keyPair.getPrivate());

プログラムを実行した後、私は両方の形式の秘密鍵と公開鍵を持っています(コードは機能するため表示されていません)。次に、この openssl コマンドを使用して、private.key を pem 形式のファイルに変換します。

openssl pkcs8 -nocrypt -inform DER -in private.key -out private2.pem

private.pem と private2.pem を比較すると、それらは異なり、明らかに private.pem を使用しようとすると、有効なファイルではないと表示されます。

この秘密鍵を必要な PEM 形式に適切に変換するために、どの手順が欠けていますか? プログラム内から OpenSSL を使用することはできません。それ以外の場合は、その関数呼び出しを追加するだけです。このプログラムで BouncyCastle ライブラリにアクセスできるので、見落としている解決策があるかもしれません。

4

3 に答える 3

10

Bouncycastle でPEMWriterクラスを使用できます。

于 2010-08-25T00:00:26.027 に答える
7

OpenSSL が独自の形式を使用しているという事実だけが、これを難しくしている理由です。ありがたいことに、弾む城の PEMWriter を使用するとこれが簡単になりますが、インターフェイスは十分に文書化されていません。メーリングリストを検索して、いくつかのコードを見つけました。私はそれを以下に適応させました:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair(); 
StringWriter stringWriter = new StringWriter();
PEMWriter pemWriter = new PEMWriter(stringWriter);  
pemWriter.writeObject( keyPair.getPrivate());
pemWriter.close();
privateKeyString = stringWriter.toString();
于 2012-09-16T04:16:14.077 に答える
3

ヘッダーを使用します。

-----BEGIN PRIVATE KEY-----

…そしてフッター:

-----END PRIVATE KEY-----

「RSA」が省略されていることに注意してください。Java コードは秘密鍵に PKCS #8 エンコーディングを使用しており、そのエンコーディングにはアルゴリズムが含まれています。

表示されているopensslコマンドは、DER 形式の標準 PKCS #8 キーを PEM 形式の独自の OpenSSL キーに変換しています。PKCS #8 形式を維持しながら、DER から PEM に変換するには、-topk8 オプションを追加します。次に、OpenSSL の出力は、Java コードが生成するものと一致するはずです。

PKCS #8 の代わりに OpenSSL キーを生成する必要がある場合は可能ですが、BouncyCastle ASN.1 ライブラリを使用して独自の OpenSSL 構造を作成し、それをエンコードする必要があります。それが必要かどうかを明確にしてください。

于 2010-08-24T23:37:34.817 に答える