yoshida_eth0の日記 このページをアンテナに追加 RSSフィード

2009-09-20

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

世間ではネームベースのバーチャルホストではSSLは使えない、という話。

でもネームベースでもいける!と、↓それらしき事が書いてあって、出来たっぽい。

 

NameVirtualHost *:80

NameVirtualHost *:443

<VirtualHost *:80>・hostA・</VirtualHost>

<VirtualHost *:443>・hostA・</VirtualHost>

<VirtualHost *:80>・hostB・</VirtualHost>

<VirtualHost *:443>・hostB・</VirtualHost>

AとBで同じ証明書を指定する

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

 

今回の目的

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を編集

<VirtualHost _default_:443>はいらない。

この行以降を全て削除。

##
## 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!!

 

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

<VirtualHost _default_:443>が残ってると、httpsではそれをデフォルトとしてしまう。

最初、これを消さずにいて困った。

httpでドメインが見つからない時と、httpsでドメインが見つからない時の挙動が違う。

・httpでアクセスした場合は、1番最初に定義されているVirtualHostをデフォルトとする。

・httpsでアクセスした場合は、<VirtualHost _default_:443>で定義されているDocumentRootをデフォルトとする。

・<VirtualHost _default_:443>で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

SNI非対応ブラウザSNI非対応ブラウザ 2013/03/29 16:10 この方法だと、SNIに対応していないブラウザ(XPのIE8等)で
https://eth0.jp
を開いた場合
404.eth0.jp
の方のサーバ証明書を参照してしまいエラーとなってしまうのではないでしょうか?

参考URL
http://ja.wikipedia.org/wiki/Server_Name_Indication

eth0jpeth0jp 2013/03/31 07:40 ワイルドカードSSLかマルチドメインSSLを用いれば(対象のドメインが含まれる証明書を使えば)IE7でもエラーは出なかったかと思います。
ワイルドカードSSLは多くのIE7を含む多くのブラウザが使用可能だと思います。
マルチドメインSSLはsubjectAltNameという機能で実装されており、SNIとは別のものです。

まぁ当時の用途は開発環境でのSSLのテストや暗号化が目的だった為、
1つのオレオレ証明書を使いまわしてドメイン不一致の警告は無視していたような気がします。

今記事はApache 2.2.3での検証結果のようです。
2.2.3はSNI非対応なので、来たホスト名を見る前に先頭に定義された<VirtualHost *:443>の証明書を返しているのではないかと思います。
この記事を書いた当時は「SSLを複数ドメインで使うなら複数IP必須!」というような時代でした。
コンフィグの融通も利かず少しの違いで起動出来ない事もしばしばだった為、記事として残した次第です。
今ではもう不要な記事ですね。

SNI非対応ブラウザSNI非対応ブラウザ 2013/04/01 11:00 確かに両方のドメインに対応した同一のSSL証明書であれば、エラーはなりませんね。
回答ありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/eth0jp/20090920/1253394739