ネームベースのバーチャルホストでSSL通信できたっぽい

世間ではネームベースのバーチャルホストではSSLは使えない、という話。
でもネームベースでもいける!と、↓それらしき事が書いてあって、出来たっぽい。
 

NameVirtualHost *:80
NameVirtualHost *:443
・hostA・
・hostA・
・hostB・
・hostB・
AとBで同じ証明書を指定する

テニス朝練, SSLで名前ベースのバーチャルホスト, 激頭痛い - いしなお!(2007-02-22)

 

今回の目的

443ポートで複数のDocumentRootを持つ自己署名証明書を使ったSSL通信を出来るようにする。
証明書は1セットだけ作って全てのバーチャルホストで使いまわす。
 
SSLの事をあまり知らないから、オレオレ証明書の危険性もあまり知らない。
とりあえず、「こいつぁ安全だ!」と太鼓判を押す他人様がいるかいないかの違いらしい。
まぁhttpで通信するより安全であれば今回は問題ない。
 
SSLの仕組みについては多分この辺が詳しい。
 
Webセキュリティー入門: 第2回「さらに知りたいセキュリティーSSL)の仕組み」
http://www.ibm.com/developerworks/jp/websphere/library/web/web_security/2.html
 
SSLによる安全なWebサイト作り(1/2)
http://www.atmarkit.co.jp/flinux/rensai/apache12/apache12a.html
 
PKI(後編)---X.509証明書とPKIの仕組み - 情報セキュリティ入門:selfup
http://itpro.nikkeibp.co.jp/article/COLUMN/20060725/244233/
 

設定ファイルの書き方

/etc/httpd/conf.d/ssl.confを編集

はいらない。
この行以降を全て削除。

##
## SSL Virtual Host Context
##

 

/etc/httpd/conf.d/virtualhost.confを編集 (我が家の場合)

80と443をセットで、バーチャルホスト分書きまくる。
我が家では、XMLのバーチャルホスト情報をApacheのconf形式に変換するプログラムを作ってあるから長くなろうが人間は面倒じゃないので問題ない。

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
    DocumentRoot /var/www/virtual/404
    ServerName 404.eth0.jp
    ErrorDocument 404 http://eth0.jp/
    ErrorLog "|/usr/sbin/cronolog /var/log/httpd/error_log/error_%Y%m_404.log"
    CustomLog "|/usr/sbin/cronolog /var/log/httpd/access_log/access_%Y%m_404.log" common env=!no_log
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/virtual/404
    ServerName 404.eth0.jp
    ErrorDocument 404 http://eth0.jp/
    ErrorLog "|/usr/sbin/cronolog /var/log/httpd/error_log/error_%Y%m_404.log"
    CustomLog "|/usr/sbin/cronolog /var/log/httpd/access_log/access_%Y%m_404.log" common env=!no_log
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    SSLOptions +StdEnvVars
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName eth0.jp
    ErrorLog "|/usr/sbin/cronolog /var/log/httpd/error_log/error_%Y%m_html.log"
    CustomLog "|/usr/sbin/cronolog /var/log/httpd/access_log/access_%Y%m_html.log" common env=!no_log
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName eth0.jp
    ErrorLog "|/usr/sbin/cronolog /var/log/httpd/error_log/error_%Y%m_html.log"
    CustomLog "|/usr/sbin/cronolog /var/log/httpd/access_log/access_%Y%m_html.log" common env=!no_log
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/pki/tls/certs/server.crt
    SSLCertificateKeyFile /etc/pki/tls/certs/server.key
    SSLOptions +StdEnvVars
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>

 

動作確認

ブラウザで鍵マーク出てる。
phpinfo()で、Apache EnvironmentのHTTPSはonになってる。
Wiresharkでパケットキャプチャしたら、443ポートで訳解らんバイナリをやり取りしてる。
動いてるっぽい。
 

Init: You should not use name-based virtual hosts in conjunction with SSL!!

Apacheを再起動したらエラー出た。
同じIP同じポートでぶつかってると怒られた。
とりあえず、バーチャルホスト別にSSL証明書を変えてみたけど、やっぱり意味はなかった。
でも動いてるっぽいから気にしない。

[Sun Sep 20 04:24:00 2009] [warn] Init: SSL server IP/port conflict: 404.eth0.jp:443 (/etc/httpd/conf.d/virtualhost.conf:12) vs. eth0.jp:443 (/etc/httpd/conf.d/virtualhost.conf:489)
[Sun Sep 20 04:24:00 2009] [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!!

 

定義されていないドメインの扱い

が残ってると、httpsではそれをデフォルトとしてしまう。
最初、これを消さずにいて困った。
httpでドメインが見つからない時と、httpsドメインが見つからない時の挙動が違う。
・httpでアクセスした場合は、1番最初に定義されているVirtualHostをデフォルトとする。
httpsでアクセスした場合は、で定義されているDocumentRootをデフォルトとする。
でDocumentRootが定義されていない場合は、httpd.confのDocumentRootをデフォルトとする。
(多分)
 

環境

[root@eth0 certs]# cat /etc/redhat-release
CentOS release 5.3 (Final)
[root@eth0 certs]# httpd -version
Server version: Apache/2.2.3
Server built:   Jan 21 2009 22:01:41
[root@eth0 certs]# php -v
PHP 5.2.10 (cli) (built: Jun 21 2009 11:10:43)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies