OpenSSLでSSL自己証明書作成

開発テスト用にSSL証明書を使いたいけどmod_sslに付属されてなかった、もしくは付属していたのを紛失した場合に自分で証明書を作る手順です。

# OpenSSLインストール
yum install openssl

# 設定ファイルをちょっとだけ変える
/bin/cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak
/bin/sed -i 's/^basicConstraints=CA:.*$/basicConstraints=CA:true/' /etc/pki/tls/openssl.cnf

# 自己認証局(CA)を作るためのスクリプトを実行する。
cd /etc/pki/tls/misc/
./CA -newca
# 自己認証局の情報を入力していく

# 設定ファイルをもとに戻す
/bin/cp /etc/pki/tls/openssl.cnf.bak /etc/pki/tls/openssl.cnf

# クライアント側でインストールするために認証局用の証明書をコピーしておく
cp ../../CA/cacert.pem ~/root.ca.crt

# Webサーバー側で作成したCSRをもとにサーバー証明書を発行(要パスワード)
openssl ca -in ~/yourdomain.csr -out ~/yourdomain.crt

# Tomcatで証明書を使う場合はx509 DER形式に変換
openssl x509 -inform pem -in ~/root.ca.crt -outform der -out ~/root.ca.der
openssl x509 -inform pem -in ~/yourdomain.crt -outform der -out ~/yourdomain.der

(追記:1) 自己認証局の作成に失敗して「./CA -newca」をやり直したいときは「/etc/pki/CA」ディレクトリを削除するとうまくいきます。

(追記:2) サーバー証明書の発行のときにCSRと認証局の都市名が違うと「The stateOrProvinceName field needed to be the same」というようなエラーがでます。 CSR作り直してやり直してみても

The stateOrProvinceName field needed to be the same in the
CA certificate (Tokyo) and the request (Tokyo)

というような理不尽なエラーがでる場合はオプション「-policy policy_anything」をつけて

openssl ca -policy policy_anything -in ~/yourdomain.csr -out ~/yourdomain.crt

としてやると回避できます。