読者です 読者をやめる 読者になる 読者になる

PHPでopenssl_pkcs12_exportを使って、PEMファイルからPKCS12を得る方法

JavaでSSL通信したいのに、手元にはPEMファイルしか無い時の解決方法」という記事の続きのような感じの記事です。

先の記事では、JavaSSL通信をしたいのに手元にはPEMファイルしか無いで! 困ったわー。とか、書いてたんですけど、これは何故かっていうと元のシステムがPHPで書かれていたから。

今回は、PHPのシステムをJavaに全面的に移行するのではなく、バックエンドの一部の処理だけをJavaに移行する予定なのだ。

そんでもって、PEMファイルはユーザーがアップロードするのね。

f:id:omiya6048:20130603202016p:plain

上図は移行後のイメージ。

つまり、PEMファイルをユーザーがアップロードする時に、PKCS12に変換できればOKなのだ。

JavaでPEMファイルをPKCS12にするには、OpenSSLのプロセスをRuntimeのexecで起動するか、BouncyCastleという暗号化ライブラリを使うと書いた。

しかし、そもそもOpenSSLというのはCで書かれたラッパーなのだという。

OpenSSL(Wikipedia)
http://ja.wikipedia.org/wiki/OpenSSL

PHPもOpenSSLを使ってSSL通信を行っている。

お? ということは、JavaからOpenSSLを実行したりしなくても、既にPHPでOpenSSLが使える環境が整っているのではないだろうか。

openssl_pkcs12_exportという、そのまんまな関数があることを確認。おー、いけるで!!(ババーン)

ということで、以下の様なコードを書いて動作検証。

// cert.pemファイルにCERTIFICATEとPRIVATE KEYの両方が含まれているものとする

// Private key を取得
$privatekey = openssl_pkey_get_private("file:///usr/local/xxxx/cert.pem");

if (openssl_pkcs12_export("file:///usr/local/xxxx/cert.pem", $lis, $privatekey, "p@ssw0rd")) {
    file_put_contents("/usr/local/xxxx/cert.p12", $lis);
} else {
    echo "変換に失敗したよ!";
}

とまぁ、こんな感じで、ちゃんと動いた。

あとは、cert.p12をJavaで読み込めばいいだけ。


今回は、たまたまフロントエンドがPHPで、元々PHPSSL通信を行っていたため、OpenSSLが使えて良かった。

正直、Javaから外部プロセスの実行とか、使ったことのないオープンソースのライブラリを使うのとか面倒だったんだよねー。