クライアント証明書の作り方

仕事で使う必要があったのでメモ。

前提として、

  • 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の設定

を見て下さい。

最低限必要な設定としては、

  • 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。

このフィルタに該当するリブログはまだありません。