世間ではネームベースのバーチャルホストではSSLは使えない、という話。
でもネームベースでもいける!と、↓それらしき事が書いてあって、出来たっぽい。
NameVirtualHost *:80
テニス朝練, SSLで名前ベースのバーチャルホスト, 激頭痛い - いしなお!(2007-02-22)
NameVirtualHost *:443
・hostA・
・hostA・
・hostB・
・hostB・
AとBで同じ証明書を指定する
今回の目的
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/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!!
定義されていないドメインの扱い
最初、これを消さずにいて困った。
httpでドメインが見つからない時と、httpsでドメインが見つからない時の挙動が違う。
・httpでアクセスした場合は、1番最初に定義されているVirtualHostをデフォルトとする。
・httpsでアクセスした場合は、
・
(多分)
環境
[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