SSL自己証明書の適用とハマったこと

いわゆる「オレオレ証明書」。久しぶりに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.confssl_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を使用する時の設定ファイルの記述が厳密になったらしい。

apache で server should be ssl-aware but has no certificate configured hint sslcertificatefile null 0 となった。 – ドクペ・インジェクション

Debian Squeeze Upgrade Breaks Apache SSL – Server Fault

その他参考

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

オレオレ証明書をopensslで作る(詳細版) – ろば電子が詰まっている

SNIで1台のサーバ上に複数のSSLサイトを運用 – 前編 – さくらのナレッジ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

20 + sixteen =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください