2016年9月19日月曜日

PHPで失効証明書(CRL)を作成してみた

普段はRubyでこまごました俺得便利ツールを作っているのですが、
PHPで失効証明書を作成する例が見当たらなかったので作ってみました。

作成したコードはここにあげておきます。

クライアント証明書といっても、通常のサーバ証明書と同じでようは発行する先がサーバかクライアントかの違いだけです。
クライアントには当然ドメイン名なんてないので、ユーザ名やメールアドレスを属性にセットします。

基本的な流れは、
公開鍵、秘密鍵を作成ー>属性情報を書き込んだCSR作成ー>CAに署名してもらう
という、サーバの証明書を作成するのと同じ流れで作成できます。公式のサンプルもあります。

ただ、PHPでやろうとすると、動かす環境のopenssl.conf設定を読み込まれる。という罠があります。
なので、ここここを参考に、各関数の引数にConfのパスを与えてあげます。
あと、ここで指定するOpenSSLのConfですが、[ca]や[v3_ca]セクションくらいしか見ていないようで、
クライアント証明書を作成しようと、[user_cert]にいくら設定しても無視されます。
[v3_ca]セクションに設定しましょう。
だいたい以下のような設定をすればOKでしょう。

basicConstraints = CA:false
authorityKeyIdentifier=keyid:always,issuer:always
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
OpenSSLの設定はIBMにナレッジがありましたので、参考になります。

しかし、Rubyと違って、PHPのOpenSSL回りはマニュアルもなんか投げっぱなしな感じで、引数の説明がろくななかったり、実行環境のConfを読み込むなど環境依存だったりなかなかハードルが高いです。
自分なんて、引数に何を渡したらいいのか調べるためにOpenSSLのソース読む羽目になったし(涙

ちなみに、Rubyで作る場合は、QuickCertという便利なgemがあるので、これを使えば簡単にCAなり証明書(サーバ、クライアント)が作成できます。
ただ、失効証明書はこれではできないので、このあたりを参考に、QuickCertを継承して組み込めばいいと思います。