SSL の www ありなしリダイレクトで RSA server certificate CommonName (CN) does NOT match の警告を消すには
非SSL・VirtualHost 環境下でのリダイレクト
ドメインの www あり (www.example.jp) を www なし (example.jp) にリダイレクトさせて URL を統一させることはよくありますよね。
いろいろな方法がありますが、Apache の設定で VirtualHost とリダイレクトを使うと、次のような設定になります。
1 2 3 4 5 6 7 8 9 10 11 |
<VirtualHost *:80> ServerName example.jp DocumentRoot /var/www/vhosts/example.jp …(略)… </VirtualHost> <VirtualHost *:80> ServerName www.example.jp DocumentRoot /var/www/vhosts/example.jp Redirect permanent / http://example.jp/ </VirtualHost> |
SSL 環境下でのリダイレクト(Apache 2.2)
これが SSL(TLS) の VirtualHost (SNI) を使う場合を考えます。1枚の SSL 証明書で www のあるなしに SANs という機能で対応しているものであれば、以下のように設定すれば良さそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<VirtualHost *:443> ServerName example.jp DocumentRoot /var/www/vhosts/example.jp SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!aNULL:!MD5:!RC4 SSLCertificateFile /etc/pki/tls/certs/example_jp.crt SSLCertificateKeyFile /etc/pki/tls/private/example_jp.key …(略)… </VirtualHost> <VirtualHost *:443> ServerName www.example.jp DocumentRoot /var/www/vhosts/example.jp Redirect permanent / https://example.jp/ </VirtualHost> |
Apache 2.4 系だとこれでエラーにはなりませんでしたが、Apache 2.2 だとエラーとなってしまいます。リダイレクトするだけの www 側にも証明書を指定しなければなりません。まあ、ある意味それが普通ですよね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<VirtualHost *:443> ServerName example.jp DocumentRoot /var/www/vhosts/example.jp SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!aNULL:!MD5:!RC4 SSLCertificateFile /etc/pki/tls/certs/example_jp.crt SSLCertificateKeyFile /etc/pki/tls/private/example_jp.key …(略)… </VirtualHost> <VirtualHost *:443> ServerName www.example.jp DocumentRoot /var/www/vhosts/example.jp Redirect permanent / https://example.jp/ SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!aNULL:!MD5:!RC4 SSLCertificateFile /etc/pki/tls/certs/example_jp.crt SSLCertificateKeyFile /etc/pki/tls/private/example_jp.key </VirtualHost> |
ログに RSA server certificate CommonName (CN) ~ does NOT match の警告
上記の設定であればブラウザでのアクセスでエラーは出ずにリダイレクトもされるのですが、Apache のエラーログには次のようなワーニングが出ていました。
1 2 3 |
[Mon Feb 22 00:00:33 2016] [warn] RSA server certificate CommonName (CN) `example.jp' does NOT match server name!? |
これは Apache の設定で、SSL 証明書のコモンネームと ServerName が異なっているときに出るメッセージです。証明書の SANs フィールドに複数のドメイン名が記載できますが、Apache が証明書のコモンネームとして判断する場合には適用されないようです。
では、SANs を使った証明書で www のありなしを統一するためにリダイレクトするのであればどうすれば良いでしょうか。それは VirtualHost をそれぞれ作るのではなく、1つの VirtualHost で ServerAlias ディレクティブと mod_rewrite を使えばうまくいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<VirtualHost *:443> ServerName example.jp ServerAlias www.example.jp DocumentRoot /var/www/vhosts/example.jp …(略)… RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.ra-example\.jp RewriteRule ^(.*)$ https://example.jp$1 [R=301,L] SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!aNULL:!MD5:!RC4 SSLCertificateFile /etc/pki/tls/certs/example_jp.crt SSLCertificateKeyFile /etc/pki/tls/private/example_jp.key …(略)… </VirtualHost> |
これでワーニングを出さないようにすることができます。
これはワイルドカード証明書の場合は問題ありません。また Apache 2.4 系ではこの症状は出ないようです。Apache 2.2、バーチャルホスト(SNI)、SANs の SSL 証明書 という環境下でのことですし、見た目にはエラーは出ないので実害はそれほどないので気づきにくいケースですね。
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。