SSL自己証明書の作成

何でSSL自己証明書が必要に?
 Iaas(具体的にはSaaSesのIndustria)でApacheをインストール。
 その後、サーバにHTTPSアクセスしようとしたら全くアクセスできない・・・・
 おかしいと思ってログファイルを確認したらこんなエラーが出ていました。

【/var/log/ssl/ssl_error_log】

・・・
[Tue Jun 21 16:16:26 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 16:16:26 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
[Tue Jun 21 16:16:26 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 16:16:26 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
[Tue Jun 21 16:53:49 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 16:53:49 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
[Tue Jun 21 16:53:49 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 16:53:49 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
[Tue Jun 21 17:11:54 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 17:11:54 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
[Tue Jun 21 17:11:54 2011] [warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Tue Jun 21 17:11:54 2011] [warn] RSA server certificate CommonName (CN) `ign-st-l-2' does NOT match server name!?
・・・

 このエラーは、サーバ証明書が正しく設定されてない事が原因の様子。
 認証機関が発行する正式なサーバ証明書は高価なので、SSL自己証明書を設定してみました。

サーバ証明書設定手順概略
 詳細なオペレーションは後述するとして、設定手順の概略は次の通りです。

 (1) openssl コマンドを使って SSL 自己証明書を作成する。
  1) 秘密鍵(server.key)の作成

openssl genrsa -aes128 1024 > server.key

  2) 公開鍵(server.csr)の作成

openssl req -new -key server.key > server.csr

  3) デジタル証明書(server.crt)の作成

openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt

 (2) Apachessl.conf を編集する。

 以上で作成完了です。
 この作業、/etc/httpd/conf/ ディレクトリ内で作業するとssl.confファイルの編集が楽です。

サーバ設定手順詳細
1.秘密鍵(server.key)の作成
 次のコマンドで秘密鍵(server.key)を作成します。
 このファイルは、サーバのCSRを作成するために必要です。

# openssl genrsa -aes128 1024 > server.key

 このコマンドの引数の意味は次の通り。
 genrsa
   RSA形式の秘密鍵を作成する
 -aes128
   128ビットの AES 方法で暗号化する。
 1024
   1024バイトの鍵を作成する。

 続けてパスフレーズの入力を求められるので、適当なパスフレーズを設定して下さい。

Generating RSA private key, 1024 bit long modulus
..................++++++
..........................................++++++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase: XXXXXXXXXX ← パスフレーズ設定
Verifying - Enter pass phrase: XXXXXXXXXX ← パスフレーズ再設定

2.公開鍵(server.csr)作成
 WebサーバのCSRファイル(server.csr)を作成します。
  ・CSR(Certificate Signing Request)とは、SSL 証明書を作成する元になる情報が書かれているファイルです。
  ・組織名やサーバのアドレスなどの情報を含みます。
  ・いわゆる公開鍵のファイルです。
 次の openssl コマンドで CSR ファイルを作成する事ができます。

# openssl req -new -key server.key > server.csr

 このコマンドの引数の意味は次の通り。
 req
   CSRファイルを作成する。
 -new
   新規にCSRを作成する。
 -key
   秘密鍵ファイル
 続けて1で設定したパスフレーズを含めて、いくつかのユーザ情報を入力します。

Enter pass phrase for server.key: XXXXXXXXXX ← パスフレーズ設定
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) [AU]: JP
State or Province Name (full name) [Some-State]: TOKYO
Locality Name (eg, city) : chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]: XXXXXX Corp.
Organizational Unit Name (eg, section)
: Sales div.
Common Name (eg, YOUR name) : example.com((運用するサイトの名前を入力する。IPアドレスで運用するWebサーバの場合は IP アドレスを入力する。))
Email Address
: ureure@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password : blank
An optional company name
: blank

3.デジタル証明書(server.crt)作成
 次の openssl コマンドでデジタル証明書(server.crt)を作成する事ができます。

# openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt

 このコマンドの引数の意味は次の通り。
 x509
   X.509 形式のデジタル証明書を作成する。
 -in CSRファイル
   CSR ファイル名を指定する。
 -days 日数
   証明書の有効期限を指定する。
 -req
   入力ファイルがCSRファイルであることを指定する。
 -signkey 秘密鍵ファイル
   自己証明書作成時に使用するオプション。秘密鍵ファイルを指定する。
 入力した情報の打ち返しに続けて、パスフレーズの入力を求められます。
 2で設定したパスフレーズを入力して下さい。

・・・
Enter pass phrase for server.key: XXXXXXXXXX ← パスフレーズ設定
unable to write 'random state'
・・・

 以上で自己証明書の作成は完了です。

4.Apache mod_ssl の設定
 ApacheSSL 暗号化通信を行う際は、mod_ssl モジュールを使用します。
 Apache 2.2.3 では、/etc/httpd/conf.d/ssl.conf に mod_ssl の基本的な設定があらかじめ用意されているので、このファイルを修正して設定します*1
 SSLCertificateFile と SSLCertificateKeyFile の設定で、上記で作成した server.crt と server.key を指定します。


LoadModule ssl_module modules/mod_ssl.so
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin


ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

# SSLCertificateFile /etc/pki/tls/certs/localhost.crt
# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key


SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

 
 以上で、SSL自己証明書の作成は完了です。
 Apacheをリスタートし、HTTPSアクセスをしたところ正しく接続する事ができました。

*1:ソースコードからビルドした場合、conf/extra/httpd-ssl.conf を使います