サーバ証明書の発行
2003/5/18作成
2004/9/19更新
1.サーバ秘密鍵の作成
今回作成するサーバ証明書はhttpサーバの証明書ということでApacheに入れます。
証明書を発行する手順で必ず秘密鍵が必要になります。
CAの秘密鍵を作ったときと同じ手順でサーバ証明書を発行してみましょう。
# openssl genrsa -out server.key 1024
第15回のときは、秘密鍵を暗号化して保存するために"-des3"オプションを付けましたが、Apacheを起動する時面倒なので今回はやっていません。
そうしてserver.keyというサーバの秘密鍵ができました。
2.秘密鍵からサーバのx509証明書発行要求(CSR)を作成
CAの証明書を作ったときのようにCSRを作成します。
# openssl req -new -key server.key -out server.csr
Using configuration from /etc/ssl/openssl.cnf
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:JP
State or Province Name (full name) [Tokyo]:Tokyo
Locality Name (eg, city) []:Shinjuku-ku
Organization Name (eg, company) [example corp.]:example corp.
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:www.example.com
Email Address []:who@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
CommonName(CN)にはサーバのURLを入れてください。
CNの値とURLの値が違うと、ブラウザで注意されます。
こうしてできたx509証明書発行要求がserver.csrです。
3.CSRにCAが署名してサーバ証明書を発行
次からはCAのお仕事です。
x509証明書発行要求には誰かに署名してもらってはじめて証明書になります。
署名は秘密鍵を使って行うので、秘密鍵があれば誰でも署名できます。
もちろん、自分の秘密鍵で署名することもできます。これが自己署名の証明書です。
今回はせっかくCAをたてたのでCAの署名をして証明書を発行します。
# openssl ca -out server-ca.crt -infiles server.csr
Using configuration from /etc/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Tokyo'
organizationName :PRINTABLE:'YGGDRASIL.JP'
commonName :PRINTABLE:'www.yggdrasil.jp'
emailAddress :IA5STRING:'meguro@yggdrasil.jp'
Certificate is to be certified until May 17 07:19:31 2004 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
うまく署名ができない場合は、openssl.cnfのCAまわりの設定が間違っている可能性があります。
また、CAで使うファイルやディレクトリができていない場合もあるので、もう一度CAの構築のところをチェックしてみましょう。
こうしてできたserver-ca.crtがプライベートCAによって署名されたサーバ証明書になります。
4.サーバ秘密鍵と証明書の配置
秘密鍵(server.key)と証明書(server-ca.crt)をApache mod_sslが使えるように配置します。
CAの証明書は配りましたが、サーバ証明書はhttpsのセッションの度に配られるのではりきって配り歩く必要はありません。
サーバ秘密鍵・証明書の配置場所はmod_sslのコンフィグと一致するように配置します。
どこでもいいのですが、とりあえずApacheのパスの近くに配置したいので/usr/local/apache2/sslというディレクトリを作り、そこに鍵と証明書を置くことにします。
# mkdir /usr/local/apache2/ssl
# chmod 600 server.key
# mv server.key /usr/local/apache2/ssl/
# cp server-ca.crt /usr/local/apache2/ssl/
サーバの秘密鍵は他の人に盗まれると困るので、パーミッションを設定して、コピーを作らずにそのまま移動させましょう。
証明書はみんなに配るものなのでそれほど神経質になる必要はありません。
つづいてApacheの設定です。
ほとんどの場合、ssl関連の設定はssl.confに出してあるのでssl.confを編集します。
# ssl.conf
# 自分のサーバ証明書の場所を指定
SSLCertificateFile /usr/local/apache2/ssl/server-ca.crt
# サーバ秘密鍵の場所を指定
SSLCertificateKeyFile /usr/local/apache2/ssl/server.key
# サーバ証明書を署名したCAの証明書がさらに他のCAによって署名されて
# いる場合、rootCAまでの証明書のリストを置きます
# 今回はプライベートCAがrootCAになっているのでコメントアウト
#SSLCertificateChainFile /usr/local/apache2/ssl/ssl.crt/ca.crt
# CAの証明書の場所を指定
# PathとFileを選択可
# クライアント証明書が入るまではとりあえずコメントアウト
#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
#SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle.crt
# 証明書失効リスト(CRL)を指定
# PathとFileを選択可
# 今はとりあえずコメントアウト
#SSLCARevocationPath /usr/local/apache2/conf/ssl.crl
#SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle.crl
完了したらApacheを再起動します。
# /ust/local/apache2/bin/apachectl stop
# /ust/local/apache2/bin/apachectl startssl
sslを忘れないようにしましょう。
5.ブラウザからの確認
それではさっそくブラウザで確認しましょう。
CA証明書のインポートが済んでいればセキュリティの警告が出ないはずです。
ちなみに証明書のCNとURLが違うと警告が出ます。
ためしにIPアドレスを直接叩いてみましょう。
証明書の出所は信頼できる。
証明書の有効期限もOK。
でも証明書の名前とサイトの名前が一致しない。
と言われました。
参考文献
すでに第15回でやったことの復習みたいなものなので、参考文献は特にありません。
ついでなので第15回のApache2+mod_sslによるセキュアなWebサーバも見ていってもらえるとうれしいです。