2010年7月23日金曜日

SSL 証明書更新手順

SSLの証明書の更新する時に毎回手こずる。
メモしておこう。


◆ 事前設定

・ 対象CN:example.com

・ 証明書署名要求ファイル名: example.com.req

・ 秘密鍵ファイル名: example.com.key



◆ 作成手順
1.証明書署名要求ファイルと秘密鍵作成を作成する
・・・の前に何枚も作る場合のことを考慮して共通部分はディフォルトファイルとして作っておくと便利。
"default_"行のところを事前に作成しておく。

$ vi openssl.conf
RANDFILE = ./rnd

[ req ]
distinguished_name = req_distinguished_name
attributes = req_attributes

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Tokyo
localityName = Locality Name (eg, city)
localityName_default = Hoge-ku
0.organizationName = Organization Name (eg, company)
0.organizationName_default = Hoge Corp.
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = Hoge Department
commonName = Common Name (***IMPORTANT***)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 40

[ req_attributes ]
challengePassword = A challenge password
challengePassword_max = 20



証明書署名要求ファイルと秘密鍵ファイルを作成する
$ openssl req -config openssl.conf -outform PEM -out 証明書署名要求ファイル -keyout 秘密鍵ファイル名 -newkey rsa:1024 -new -nodes

※対話的なコマンドです。
出力例)
Generating a 1024 bit RSA private key

Country Name (2 letter code) [JP]:
State or Province Name (full name) [TOKYO]:
Locality Name (eg, city) [HOGE-KU]:
Organization Name (eg, company) [HOGE Corp.]:
Organizational Unit Name (eg, section) [HOGE Department]:Service Platform Operations Department1 ←2枚作るなら"~2"とかにしてね
Common Name (***IMPORTANT***) []:example.com
Email Address []:             ←基本的に空欄

Please enter the following \\\'extra\\\' attributes
to be sent with your certificate request
A challenge password []:       ←基本的に空欄
An optional company name []:        ←基本的に空欄


2.整合性チェック
$ openssl req -verify -in 証明書署名要求ファイル -key 秘密鍵ファイル -noout

・正常の場合
Verify OK 

・異常の場合
Verify error


3.内容確認(DistingishName)
$ openssl req -text -in 証明書署名要求ファイル

・正常の場合
内容が表示される
※Subject行を確認すること(設定した通りになっているか)
(例) Subject: C=JP, ST=Tokyo, L=Hoge-ku, O=Hoge Corp., OU=Hoge Department1, CN=example.com


・異常の場合
内容が表示されない


4.証明書署名要求ファイル(example.com.req)を送信してCyberTrustなどに署名依頼
これは署名依頼する会社によって違う。  
WEBで検索してください。



数日で証明書が送られてくる。
◆ 証明書と秘密鍵ペアの確認
1.試験のため、証明書と秘密鍵ペアを読み込んだSecureWebサーバを一時的に起動する
※中間CAについては署名依頼した会社のWEBをたどれば案内があるだろう。


【中間CAが不要の場合】
ポートはローカルで重複しないものであれば問題ない。
WEBサービスを提供していなくても問題ない。
証明書の正当性を確認するためだけに利用するだけである。

$ openssl s_server -accept 1433 -cert 証明書ファイル -key 秘密鍵ファイル -www

【中間CAが必要の場合】
$ openssl s_server -accept 1433 -cert 証明書ファイル -key 秘密鍵ファイル -CAfile 中間CA証明書ファイル -www

【中間CA、クロスルート証明書が必要の場合】
$ openssl s_server -accept 1433 -cert 証明書ファイル -key 秘密鍵ファイル -CAfile 中間CA証明書ファイル -CAfile クロスルート証明書 -www

・正常の場合
ACCEPTと出力され、プロンプトが返ってこない状態になる

・異常の場合
エラーが出力されて、Shellプロンプトが返ってくる


2.クライアントから接続確認する(1.で正常に起動させたまま別端末を起動させて実施)
$ openssl s_client -connect localhost:1433

・正常の場合
Verify return code: 0 (ok)

・異常の場合
Verify return code: ??(0以外)

例えば下記のようなエラーが出ることがある。
Verify return code: 21 (unable to verify the first certificate)

サーバ側で中間証明書の指定を誤っている際に起きることがある。

またクライアント側でCA証明書が読めていないことが原因であることもある。
その場合は明示的にオプションで指定する。
$ openssl s_client -connect localhost:1433 -CAfile /etc/pki/tls/certs/ca-bundle.crt
ただし、この中身自体が古いこともあるので、
それでもエラーがでる場合は最新版に更新した方がいいだろう。
http://curl.haxx.se/docs/sslcerts.html
http://curl.haxx.se/ca/cacert.pem


3.任意のクライアントWebブラウザなどから接続確認する
※1.で正常に起動させたまま別端末を起動させて実施)

ブラウザで、SSLサーバを指定してアクセスする。
https://x.x.x.x:1433

・正常な場合
ホスト名の不一致のみ指摘される

・異常な場合
いろいろ指摘される