Webサーバ」カテゴリーアーカイブ

[warn] RSA server certificate CommonName (CN) `ドメイン名’ does NOT match server name!? が出たら…

Webサーバー(Apache)のエラーログを見ていると、サーバー再起動やApacheリスタートの際などに、SSL周りのエラーが発生しているのを発見。

[Tue Nov 17 12:51:29 2015] [warn] RSA server certificate CommonName (CN) `example.com’ does NOT match server name!?

RSA暗号化サーバーのコモンネーム証明書がサーバーネームと違いますよ!?

と。おや、そうでしたか。
https://www.weblogy.co.jp/ への接続は問題なくできているし、ブラウザ上ではSSL証明書エラーも出ないんですけど、それはApacheの方で「どうやら違ってるけど証明書と鍵は合ってるからうまいこと融通きかせときまひょ」という感じのようです。
エラーログに記されているメッセージは、つまり「ホンマはあかんねんで?」ということですね。

まあ、毎回こんなエラーが発生しているのはよろしくないので、解消しましょう。

/etc/httpd/conf.d/ssl.confの記述を見てみると…

/etc/httpd/conf.d/ssl.conf

NameVirtualHost *:443

<VirtualHost *:443>
        ServerAdmin webmaster@dummy-host.example.com
        DocumentRoot /home/www/html/
        ServerName example.com
        ServerAlias www.example.com
SSLEngine on
(中略)
</VirtualHost>

となっていました。

この記述で、ApacheとしてはServerNameとServerAliasとどちらも同じDocumentRootで処理することができるので、httpの場合ならこれでもいいんですけど、httpsの場合はコモンネーム(CN)がサーバーネームと一致しているひつようがあるのでまずいんですね。

NameVirtualHost *:443

<VirtualHost *:443>
        ServerAdmin webmaster@dummy-host.example.com
        DocumentRoot /home/www/html/
        ServerName www.example.com
        ServerAlias example.com
SSLEngine on
(中略)
</VirtualHost>

wwwありをサーバーネームに、なしをエイリアスにしてApache再起動。

[root@www5254ue logs]# service httpd restart

エラーが出なくなり、解決です。

SSLのパスフレーズ(Pass Phrase Dialog)入力を省略してApacheを起動する

パスフレーズ付きでSSLの鍵を作ると、Apache再起動の際にパスフレーズの入力を求められます。

こんな感じです。

通常の起動プロセス

[root@www5254ue ~]# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: Apache/2.2.15 mod_ssl/2.2.15 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server weblogy.co.jp:443 (RSA)
Enter pass phrase:

Apache:mod_ssl:Error: Pass phrase incorrect (5 more retries permitted).
Enter pass phrase:

OK: Pass Phrase Dialog successful.
                                                           [  OK  ]

でもこれだと再起動の際に毎回入力するのは面倒だし、何より自動再起動の際にここでストップしてしまいます。

そこでこのパスフレーズの入力を省略して起動できるようにしてみましょう。

方法は2つあります。

1.パスフレーズ無しの鍵にする
2.パスフレーズ応答スクリプトを設定する

1.パスフレーズ無しの鍵にする

1については、最初からパスフレーズなしで作る方法と、後からパスフレーズを消す方法とあります。

1-A パスフレーズなしで鍵を生成する場合

通常の作成方法

# openssl genrsa -des3 -out ./ssl.key/xxxxxxx.key 2048

パスワードなしの作成方法

# openssl genrsa -out ./ssl.key/xxxxxxx.key 2048

1-B パスフレーズを後から解除する場合

元ファイルのバックアップ

# cp xxxxxxx.key xxxxxxx.key.org

パスフレーズの解除

# openssl rsa -in xxxxxxx.key -out xxxxxxx.key

これで、パスフレーズ無しの鍵ができます。

パスワード自動応答スクリプトを設置する

まず、パスワードを自動的に応答するシェルスクリプトを書きます。シェルスクリプトと言っても、パスフレーズをエコーするだけの単純なものです。
これはどこに設置してもいいんですが、SSL関連の設定が置いてある/etc/ssl/certs/に置くことにします。

vi /etc/ssl/certs/pass_phrase.sh
#!/bin/sh
echo "your passphrase"

実行権限を与えておきます。

chmod 500 /etc/ssl/certs/pass_phrase.sh

次に、SSLの設定を変更します。

# vi /etc/httpd/conf.d/ssl.conf
#   Pass Phrase Dialog:
#   Configure the pass phrase gathering process.
#   The filtering dialog program (`builtin' is a internal
#   terminal dialog) has to provide the pass phrase on stdout.
#SSLPassPhraseDialog  builtin
SSLPassPhraseDialog  exec:/etc/ssl/certs/pass_phrase.sh

SSL設定の中野、パスフレーズダイアログの部分を、「builtin」から、先ほどのスクリプトの実行指定に変更しました。

これで完成です。再起動を試してみましょう。

# service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]