クライアント証明書の作り方
仕事で使う必要があったのでメモ。
前提として、
- httpサーバはapache
- opensslインストール済み(mod_sslも当然)
手順は以下の通り
証明書作成
1. 秘密鍵作成
openssl genrsa -out client.key 1024
2. 秘密鍵からx509証明書発行要求(CSR)を作成
openssl req -new -key client.key -out client.csr
3. CSRにCAが署名してクライアント証明書を発行
openssl x509 -in client.csr -out client-ca.crt -req -signkey client.key -days 3650
4. 秘密鍵と証明書のペアをpkcs12でexportする
openssl pkcs12 -export -inkey client.key -in client-ca.crt -out client.p12 -name "friendlyname"
"friendlyname"は任意の名前でOK。識別出来る名前が良い。
証明書読込
4. で作ったファイル(client.p12)をクライアント側にインポートする。
Windowsの場合、上記ファイルダブルクリックすれば、インポートウイザードが立ち上がるはず。
上記インポートウイザードでインストールすれば、IE、Chrome、SafariはOK。
FirefoxとOperaは別途ブラウザでインポートする必要がある。
ブラウザのバージョンによるかもだが、概ね、
オプション→詳細→証明書を表示
でインストール出来る(はず)。
apacheの設定
詳細は、http://httpd.apache.org/docs/2.0/mod/mod_ssl.htmlとか、http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html
を見て下さい。
最低限必要な設定としては、
- SSLVerifyClient:クライアント証明書が必須なら、"require"に設定
- SSLVerifyDepth:証明書のチェーン数。オレオレならデフォルト(1)で大丈夫なはずだが、違うなら10とか設定しておくと吉
- SSLCACertificateFile:CAのファイル名(上記3.で作ったファイル。上記手順だとclient-ca.crt)を指定する。
因みに、複数CAファイルを指定する場合、SSLCACertificatePathを指定すればいいとマニュアルに書いてるのだが、うまくいかなかった。
なので、CAファイルをMergeして1ファイルにする事で対応。
Mergeは普通にcatでOK。以下見たいな感じ。
cat ca1.crt ca2.crt | ca_merge.crt
後はapache再起動しておしまい。
ここまですれば、クライアント証明書を必須に出来るはず。
おまけ
- リクエスト元が特定IPの場合証明書認証無し
- それ以外の場合、全て証明書必須
の場合の対処の仕方。
基本的にはapacheの設定ファイルにSSLRequireの設定を書いてあげればOK。
その際に。SSLVerifyClientをoptionalにするのを忘れずに。
以下例(mod_sslのサンプル)
<Location /> SSLVerifyClient optional SSLVerifyDepth 10 SSLRequire (%{REMOTE_ADDR} =~ m/^192\.168\.1\.1$/) \ # 証明書無しのIP or \ ( \ %{SSL_CLIENT_S_DN_CN} eq "Snake Oil, Ltd." \ # 接続を許可するSSL証明書の情報 and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}\ ) </Location>
これでOK。