自己証明書の作成とApacheの設定
開発用に自己証明書を作成してApacheの設定をする。
1. 秘密鍵の作成
openssl genrsa -aes128 -out server.key 2048
-
genrsa : RSA形式の秘密鍵を作成するサブコマンド。
-
-aes128 : 128ビットAES暗号方式で暗号化する。
-
-out : 秘密鍵のファイル名を指定する。
-
2048 : 2048ビットの秘密鍵にする。ビット数は最後に書く。
パスフレーズの入力を求められるので、任意のパスフレーズを入力する。
$ openssl genrsa -aes128 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
............................+++
............................................+++
e is 65537 (0x10001)
Enter pass phrase:パスフレーズ入力
Verifying - Enter pass phrase:パスフレーズ入力
このコマンドで秘密鍵(server.key
)が作成できる。ENCRYPTED
と記述があり暗号化された鍵であるととが確認できる。
2. 証明書(公開鍵)の作成
まずは、証明書の元になる CSR を作成する。
openssl req -new -key server.key -sha256 -out server.csr
-
req : CSRファイルを作成する。
-
-new : 新規にCSRを作成する。
-
-key : 秘密鍵のファイル名を指定する。
-
-sha256 : 署名アルゴリズムとして SHA-2 を利用する。(SHA-1 にする場合は、このオプションを付けない。)
-
-out : 作成する CSR のファイル名を指定する。
# openssl req -new -key server.key -sha256 -out server.csr
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]:Tokyo
Locality Name (eg, city) []:Chiyoda-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 []:空白
作成時の入力項目
-
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 []: 別の組織名の入力(空欄にする)
CSR を元に証明書を作成する。
openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt
-
x509 : X.509 形式の証明書を作成する。
-
-req : CSRファイルを入力し署名して書き出す。
-
-days : 証明書の有効期限を指定する。
-
-sha256 : 署名アルゴリズムとして SHA-2 を利用する。(SHA-1 にする場合はこのオプションを付けない。)
-
-in : CSRファイル名を指定する。
-
-signkey : 自己証明書作成時に使用するオプション。秘密鍵ファイルを指定する。
-
-out : 作成する証明書のファイル名を指定する。
# openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Chuo-ku/O=Example Inc./OU=Example Section/CN=example.com/emailAddress=webmaster@example.com
Getting Private key
Enter pass phrase for server.key:パスフレーズ入力
3. Apacheの設定
server.crt
と server.key
を使用する。
1<VirtualHost _default_:443>
2 ErrorLog logs/ssl_error_log
3 TransferLog logs/ssl_access_log
4 LogLevel warn
5 SSLEngine on
6 SSLProtocol all -SSLv2
7 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
8# SSLCertificateFile /etc/pki/tls/certs/localhost.crt
9# SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
10 SSLCertificateFile /etc/httpd/conf/server.crt # 作成した `server.crt` のパス
11 SSLCertificateKeyFile /etc/httpd/conf/server.key # 作成した `server.key` のパス
12 <Files ~ "\.(cgi|shtml|phtml|php3?)$">
13 SSLOptions +StdEnvVars
14 </Files>
15 <Directory "/var/www/cgi-bin">
16 SSLOptions +StdEnvVars
17 </Directory>
18 SetEnvIf User-Agent ".*MSIE.*" \
19 nokeepalive ssl-unclean-shutdown \
20 downgrade-1.0 force-response-1.0
21 CustomLog logs/ssl_request_log \
22 "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
23</VirtualHost>
4. Apaceh起動時のパスフレーズ入力
このままだと、Apache起動時にパスフレーズの入力を求められる。毎回パスフレーズを入力するのは不便なので回避する。
そのためには以下の2つの方法がある。
-
秘密鍵 (server.key) ファイルをあらかじめ復号化しておく方法
-
Apache起動時のパスフレーズ入力を自動化する方法
4.1. 秘密鍵 (server.key) ファイルをあらかじめ復号化しておく方法
# mv server.key server.key.back
複合化するする。
# openssl rsa -in server.key -out server.decrypted.key
Enter pass phrase for server.key:パスフレーズ
writing RSA key
パスフレーズの入力を求められるので、パスフレーズを入力する。
復号化した秘密鍵の内容は ENCRYPTED の記述がなくなる。
4.2. Apache起動時のパスフレーズ入力を自動化する方法
SSLPassPhraseDialog ディレクティブで、パスフレーズを標準出力するような外部コマンドを指定し、パスフレーズを自動入力するように設定する。
外部コマンドは何でもよいので、簡単なシェルスクリプトを用意する。
例えば下記のような内容のファイル /etc/httpd/conf.d/passfhrase.sh を作り、パーミッションを 500 にする。
#!/bin/sh
echo "パスフレーズ"
SSLPassPhraseDialog ディレクティブは次のように指定する。
#SSLPassPhraseDialog builtin
SSLPassPhraseDialog exec:/path/to/passfhrase.sh