自己証明書の作成とApacheの設定

開発用に自己証明書を作成してApacheの設定をする。

1. 秘密鍵の作成

openssl genrsa -aes128 -out server.key 2048
  • genrsa : RSA形式の秘密鍵を作成するサブコマンド。

  • -aes128 : 128ビットAES暗号方式で暗号化する。

  • -out : 秘密鍵のファイル名を指定する。

  • 2048 : 2048ビットの秘密鍵にする。ビット数は最後に書く。

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

例 1. 秘密鍵作成例
$ 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 のファイル名を指定する。

例 2. 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 : 作成する証明書のファイル名を指定する。

例 3. 証明書作成例
# 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.crtserver.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 にする。

passfhrase.sh
#!/bin/sh

echo "パスフレーズ"

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

#SSLPassPhraseDialog  builtin
SSLPassPhraseDialog   exec:/path/to/passfhrase.sh