いわゆる「オレオレ証明書」。久しぶりにSSL設定を行ったため、手順とハマった事項のメモ。
今回はApache2.2.29のネームベースVirtualHost設定されたサイトに対して、自己証明書の適用を行った。
証明書の作成/適用手順
大枠として下記のような手順になる。
- 秘密鍵の作成 (server.key)
- CSR(証明書の基になる情報)の作成 (server.csr)
- 証明書(公開鍵)の作成 (server.crt)
- Apacheの設定ファイルの編集
作業場所は任意のフォルダにて行う。
秘密鍵の作成 (server.key)
# openssl genrsa -aes128 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
............................................+++
.....+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
パスフレーズは任意の文字列を使用。
コマンドを実行するとserver.keyファイルが生成される。
CSR(証明書の基になる情報)の作成 (server.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) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka-shi,Chuo-ku
Organization Name (eg, company) [Default Company Ltd]:Hoge Inc.
Organizational Unit Name (eg, section) []:Hoge Section
Common Name (eg, your name or your server's hostname) []:example.jp
Email Address []:(空白)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(空白)
An optional company name []:(空白)
Email Address []:
以下は空白を入力
コマンドを実行するとserver.csrファイルが生成される。
証明書(公開鍵)の作成 (server.crt)
ここは本来はベリサインなどのCAが行うが、今回は自分で設定。
証明書の期限は1年にしている。
# openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt
Signature ok
...
Enter pass phrase for server.key:
コマンドを実行し秘密鍵のパスフレーズを入力すると、証明書(server.crt)が作成される。
Apacheの設定ファイルの編集
設定ファイルは/etc/httpd/conf.d
以下のファイルに対して行う。
今回は下記のような構成でファイルを作成。
conf.d
|
|- example.jp.conf ## VirtualHostの設定を記述
|- ssl.conf
|- ssl_example.jp.conf ## example.jpドメインに対してsslを有効にするよう設定を記述
上記のような構成にした理由は、そもそもhttpでアクセスするためのバーチャルホスト設定が、サイト毎の設定ファイルで定義されていたから。(ssl.confにひとまとめにしてもよい。)
個人的には上記の方が作業しやすいかと思っている。
また今回は使用しなかったが、SNIでのSSL証明書を使用する場合はサイト毎に鍵ファイルが異なるため、どのサイトがhttps対応なのか把握するのも容易かと思ったというのもある。(結局SNIの証明書は使用していないが。。)
ssl.confの編集
下記の部分を編集
## 証明書
SSLCertificateFile /your/server/path/server.crt
## 秘密鍵
SSLCertificateKeyFile /your/server/path/server.key
## 最下行に追記
NameVirtualHost *:443
ssl_example.jp.confの編集
ファイルを新規作成。
<VirtualHost *:443>
SSLEngine on
DocumentRoot "/var/www/html/example/"
ServerName example.jp
# Server Certificate:証明書
SSLCertificateFile /etc/pki/tls/ssl_hogehoge_jp/server.crt
# Server Private Key:秘密鍵
SSLCertificateKeyFile /etc/pki/tls/ssl_hogehoge_jp/server.key
# 中間証明書ファイル(今回は使用していない。)
#SSLCertificateChainFile
<Directory "/var/www/html/example/">
Options All
allowOverride all
allow from all
</Directory>
</VirtualHost>
apacheを再起動すると証明書が有効になる。
Apache起動時のパスフレーズ入力省略
Apacheを起動しようとすると、暗号化された秘密鍵(server.key)を復号化するためにパスフレーズの入力を求められる。
下記の方法で入力を省略することが出来る。
# mv server.key server.key.back
# openssl rsa -in server.key.back -out server.key
Enter pass phrase for server.key.back: (パスフレーズを入力)
writing RSA key
ハマったこと1:suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
下記のエラーが出てapacheが起動しなくなった。
[Wed Aug 9 20:51:48 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
原因はssl.conf
とssl_example.jp.conf
に記載している証明書のファイルパスが異なっていたから。
今回はSNI対応している証明書ではないため、両confファイル内のパス指定を合わせると正常にapacheが起動した。
また余談だが、今回のサーバは1つのグローバルIPを持つサーバであったため、SNI対応の証明書以外でネームベースVirtualHostにSSLを適用するには諸々の設定が必要。
設定を行いたい場合には「サイト毎にIPアドレスを変える」か「サイト毎にhttpsアクセスポートを変える」必要がある。
1台のサーバで複数のSSL通信をする – xxxcaqui.log
ハマったこと2:[error] Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)
下記のエラーが出てapacheが起動しなくなった。
[error] Server should be SSL-aware but has no certificate configured [Hint: SSLCertificateFile] ((null):0)
ssl_example.jp.conf
にてSSLEngine on
を記載していなかった。
apache2.2.12からSNIに対応したことで、ネームベースVirtualHostを使用する時の設定ファイルの記述が厳密になったらしい。
Debian Squeeze Upgrade Breaks Apache SSL – Server Fault
その他参考
Apache/SSL自己証明書の作成とmod sslの設定 – maruko2 Note.