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

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

目次

手順

2017年1月1日以降、SSL 証明書の署名アルゴリズムとして SHA-1 を使用している証明書は SSL 通信ができなくなる。 これは、Windows製品、Google Chrome、Mozilla Firefox における仕様変更なので、自己証明書であっても影響を受ける。

SHA-2 関連情報

SHA-2 に対応させるには、オプション -sha256 を付けて実行する。

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

    openssl genrsa -aes128 -out server.key 2048
    

    CSR(証明書の基になる情報)の作成 (server.csr)

    openssl req -new -key server.key -sha256 -out server.csr
    

    証明書(公開鍵)の作成 (server.crt)

    openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt
    
  3. Apache の ssl.conf を編集する。

これだけで SSL自己証明書が利用できるようになる。

秘密鍵の作成 (server.key)

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

openssl genrsa -aes128 -out server.key 2048
genrsa
RSA形式の秘密鍵を作成するサブコマンド。
-aes128
128ビットAES暗号方式で暗号化する。
-out 秘密鍵ファイル名
秘密鍵のファイル名を指定する。
2048
2048ビットの秘密鍵にする。ビット数は最後に書く。

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

Generating RSA private key, 2048 bit long modulus
............................+++
............................................+++
e is 65537 (0x10001)
Enter pass phrase:パスフレーズ
Verifying - Enter pass phrase:パスフレーズ

このコマンドで次のような内容の秘密鍵(server.key)が作成できる。ENCRYPTED と記述があり暗号化された鍵であるととが確認できる。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,32BF731BF35BAB90FA63AE09824F4FDC
 
-----END RSA PRIVATE KEY-----

CSR(証明書の基になる情報)の作成 (server.csr)

証明書の基になる情報を記述した CSR ファイル(server.csr)を作成する。

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

openssl req -new -key server.key -sha256 -out server.csr
req
CSRファイルを作成する。
-new
新規にCSRを作成する。
-key 秘密鍵ファイル
秘密鍵のファイル名を指定する。
-sha256
署名アルゴリズムとして SHA-2 を利用する。(SHA-1 にする場合は、このオプションを付けない。)
-out CSRファイル名
作成する 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]: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) []: は、SSL暗号するサイトのアドレスを入力することになるので、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 []: 別の組織名の入力(空欄にする)

CSR(server.csr)は次のような内容になる。

-----BEGIN CERTIFICATE REQUEST-----
 
-----END CERTIFICATE REQUEST-----

証明書(公開鍵)の作成 (server.crt)

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

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

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

openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt
x509
X.509 形式の証明書を作成する。
-req
CSRファイルを入力し署名して書き出す。
-days 日数
証明書の有効期限を指定する。
-sha256
署名アルゴリズムとして SHA-2 を利用する。(SHA-1 にする場合はこのオプションを付けない。)
-in CSRファイル
CSR ファイル名を指定する。
-signkey 秘密鍵ファイル
自己証明書作成時に使用するオプション。秘密鍵ファイルを指定する。
-out 証明書のファイル名
証明書のファイル名を指定する。
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:パスフレーズ

証明書(server.crt)は次のような内容になる。

-----BEGIN CERTIFICATE-----
 
-----END CERTIFICATE-----

以上で、秘密鍵、証明書(公開鍵)の作成が完了。

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 -out server.key
    

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

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

    復号化した秘密鍵の内容は以下のように、ENCRYPTED の記述がなくなる。

    -----BEGIN RSA PRIVATE KEY-----
     
    -----END RSA PRIVATE 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で送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

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