unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

OpenSSLで生成したRSA鍵をJavaで読み込む

以前にはまったことがあったので、簡単にまとめておきます。

OpenSSLでRSA鍵を生成したときのデフォルトのフォーマットであるPEM形式は、Javaの標準APIでは読み取れないため、DER形式に変換しておく必要があります。

OpenSSLで公開鍵・秘密鍵を生成する

# PEM形式の秘密鍵を生成する
openssl genrsa -out private_key.pem 1024
# PKC8/DER形式に変換する
openssl pkcs8 -in private_key.pem -topk8 -nocrypt -outform DER -out private_key.pk8
# DER形式の公開鍵を生成する
openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der

Javaで公開鍵・秘密鍵を読み込む

// ファイル等からバイト配列として公開鍵を読み込む
byte[] publicKeyAsByteArray = ...
X509EncodedKeySpec keyspec = new X509EncodedKeySpec(publicKeyAsByteArray);
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPublicKey publicKey = (RSAPublicKey) kf.generatePublic(keyspec);

// ファイル等からバイト配列として秘密鍵を読み込む
byte[] privateKeyAsByteArray = ...
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyAsByteArray);
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKey privateKey = (RSAPrivateKey) kf.generatePrivate(keySpec);