Apache/SSL自己証明書の作成とmod sslの設定

提供:maruko2 Note.
移動: 案内, 検索

目次

手順

  1. openssl コマンドを使って SSL 自己証明書を作成する。
    • 秘密鍵(server.key)の作成
    openssl genrsa -aes128 1024 > server.key
    • 公開鍵(server.csr)の作成
    openssl req -new -key server.key > server.csr
    • デジタル証明書(server.crt)の作成
    openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
  2. Apache の ssl.conf を編集する。

これだけ。/etc/httpd/conf/ ディレクトリ内で作業すると楽。

秘密鍵(server.key)の作成

次のコマンドで秘密鍵(server.key)を作成する。

# 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:パスフレーズ
Verifying - Enter pass phrase:パスフレーズ

公開鍵(server.csr)の作成

WebサーバのCSRファイル(server.csr)を作成する。

次の openssl コマンドで CSR ファイルを作成する。

# openssl req -new -key server.key > server.csr
req
CSRファイルを作成する。
-new
新規にCSRを作成する。
-key 秘密鍵ファイル
秘密鍵のファイル名を指定する。
Enter pass phrase for server.key:パスフレーズ
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]:Osaka
Locality Name (eg, city) []:Osaka-shi,Chuo-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc.
Organizational Unit Name (eg, section) []:Example Section
Common Name (eg, YOUR name) []:example.com
Email Address []:空白

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

Common Name の注意点
Common Name (eg, YOUR name) []: は、サイトの名前を入力することになるので、IPアドレスで運用するWebサーバの場合は IP アドレスを入力する必要がある。

入力項目の説明

Country Name (2 letter code) [AU]: 国名
State or Province Name (full name) [Some-State]: 都道府県名
Locality Name (eg, city) []: 市町村名
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名
Organizational Unit Name (eg, section) []: 部門名
Common Name (eg, YOUR name) []: サイトの名前
Email Address []: メールアドレス(空欄でもよい)
A challenge password []: 証明書を破棄する時に必要になるパスワード(空欄でもよい)
An optional company name []: 別の組織名の入力(空欄でもよい)

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

SSL 通信には CA(Certification Authority, 認証局)が発行した証明書が必要だが、自分自身でデジタル証明書(server.crt)作成する。

このデジタル証明書の発行をおこなっている第三者機関が VeriSign などになるが、自分自身でデジタル証明書をつくることもできる。

次の 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 秘密鍵ファイル
自己証明書作成時に使用するオプション。秘密鍵ファイルを指定する。
Signature ok
subject=/C=JP/ST=Osaka/L=Osaka-shi,Chuo-ku/O=Example Inc./OU=Example Section/CN=example.com/emailAddress=webmaster@example.com
Getting Private key
Enter pass phrase for server.key:パスフレーズ
unable to write 'random state'

以上で、鍵、証明書の作成は完了。

Apache mod_ssl の設定

Apache で SSL 暗号化通信をおこなうには、mod_ssl モジュールを使用する。

CentOS 5 の Apache 2.2.3 では、/etc/httpd/conf.d/ssl.conf に mod_ssl の基本的な設定があらかじめ用意されているので、それを使う。(ソースコードからビルドした場合は、conf/extra/httpd-ssl.conf を使う。)

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

<VirtualHost _default_:443>
	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
	<Files ~ "\.(cgi|shtml|phtml|php3?)$">
		SSLOptions +StdEnvVars
	</Files>
	<Directory "/var/www/cgi-bin">
		SSLOptions +StdEnvVars
	</Directory>
	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"
</VirtualHost>

Apache 起動時にパスフレーズの入力を省略する

上記の方法で作成した秘密鍵(server.key)は、作成時に入力たパスフレーズで暗号化された状態になっているので、Apache を起動する時に復号化するためのパスフレーズの入力を求められる。

毎回パスフレーズを入力するのは面倒なので、以下のどちらかの方法で回避することができる。

秘密鍵 (server.key) ファイルをあらかじめ復号化しておく方法

  1. server.key の名前を変更する。
  2. # mv server.key server.key.back
    
  3. 次のコマンドでパスフレーズを解除する。
  4. # openssl rsa -in server.key.back > server.key
    

    パスフレーズの入力を求められるので、パスフレーズを入力する。

    Enter pass phrase for server.key.back:パスフレーズ
    writing RSA key
    

Apache起動時のパスフレーズ入力を自動化する方法

SSLPassPhraseDialog ディレクティブで、パスフレーズを標準出力するような外部コマンドを指定し、パスフレーズを自動入力するように設定する。

外部コマンドは何でもよいので、簡単なシェルスクリプトを用意する。

例えば下記のような内容のファイル /etc/httpd/conf.d/pass-phrase.sh を作り、パーミッションを 500 にする。

#!/bin/sh
echo "パスフレーズ"

SSLPassPhraseDialog ディレクティブは次のように指定する。

#SSLPassPhraseDialog  builtin
SSLPassPhraseDialog   exec:/etc/httpd/conf.d/pass-phrase.sh

参考ページ

Apache 関連のページ

LINEで送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

このサイトのはてなブックマーク数