SSL自己証明書の作成
何でSSL自己証明書が必要に?
Iaas(具体的にはSaaSesのIndustria)でApacheをインストール。
その後、サーバにHTTPSアクセスしようとしたら全くアクセスできない・・・・
おかしいと思ってログファイルを確認したらこんなエラーが出ていました。
・・・
[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) Apache の ssl.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.comPlease 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 の設定
Apache で SSL 暗号化通信を行う際は、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アクセスをしたところ正しく接続する事ができました。