Javaの文字列(.pem
ファイル)から秘密鍵を生成したいとします。Javaの* pem文字列からRSA秘密鍵を生成する方法
private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
try {
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
}
catch (Exception e) {
e.printStackTrace();
}
最後の行(generatePrivate機能)は、この例外がスローされます。
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at Test.main(Test.java:52)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)
... 3 more
私はそれが正常に動作する.der
ファイルから値への秘密鍵を変更するが、私はプライベートを生成する必要がある場合キーファイルを.pem
ファイルから削除します。
文字列として印刷されたバイトのスクリーンショットを貼り付けました(\ nで一度ハードコードされ、\ nなしで一度ハードコードされた後)。
奇妙なことは、ファイルからの出力が文字列からの出力に異なることです。
.der
ファイルをBase64でエンコードしようとすると、結果は.pem
ファイルの文字列と異なります。どうしてこんなことに?あなたが最後の行は、例外をスローしていると言う
答えが見つかりましたか? –
@SankarPは実際にはそうではありません。 – Niklas
大丈夫です。私は解決策を見つけました。 "----- BEGIN RSA PRIVATE KEY"で始まるキーは、pkcs1でエンコードされたファイルです。このpkcs1エンコーディングは、BouncyCastleのような外部ライブラリ以外のJavaではサポートされていません。私は昨日同じ問題に遭遇し、約8時間後に解決策を見つけました。 pkcs8で秘密鍵をエンコードすると、株式Javaによって処理される "--- BEGIN PRIVATE KEY ---"のように始まります。 HTH。 –