以前にはまったことがあったので、簡単にまとめておきます。
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);