- PR -

Apache (SSL)で異常

1
投稿者投稿内容
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-07-12 17:20
VirtualHostの設定を下記のように行っております。
Apacheのバージョンは、2.0.52 で、OSは、CentOS 4.3 です。

全ての ServerName は、同じサーバーです。

■/etc/httpd/conf.d/ssl.conf
----
Listen 80

Include conf.d/*.conf

ServerName www.hoge.com:80

DocumentRoot "/var/www/html"

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost _default_:80>
DocumentRoot "/var/www/html"
ServerName www.hoge.com:80
ServerAlias hoge.com:80
</VirtualHost>
----

■/etc/httpd/conf.d/ssl.conf
----
Listen 443

<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.hoge.com:443
ServerAlias hoge.com:443

</VirtualHost>
----

■/etc/httpd/conf.d/a.conf
----
<VirtualHost *:80>
DocumentRoot "/var/www/html/a"
ServerName www.a.hoge.com:80
ServerAlias a.hoge.com:80

</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/var/www/html/a"
ServerName www.a.hoge.com:443
ServerAlias a.hoge.com:443

</VirtualHost>
----

■/etc/httpd/conf.d/b.conf
----
<VirtualHost *:80>
DocumentRoot "/var/www/html/b"
ServerName www.b.hoge.com:80
ServerAlias b.hoge.com:80

</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/var/www/html/b"
ServerName www.b.hoge.com:443
ServerAlias b.hoge.com:443

</VirtualHost>
----

下記のテストを実施しました。

テストケース
1-1 http://www.hoge.com/
1-2 http://hoge.com/

2-1 https://www.hoge.com/
2-2 https://hoge.com/

3-1 http://www.a.hoge.com/
3-2 http://a.hoge.com/

4-1 https://www.a.hoge.com/
4-2 https://a.hoge.com/

5-1 http://www.b.hoge.com/
5-2 http://b.hoge.com/

6-1 https://www.b.hoge.com/
6-2 https://b.hoge.com/

すると、テストケース 6-1、6-2 だけが異常です。
以上の内容は、それぞれ 4-1、4-2 と同じ内容を表示します。

他は、正常です。
つまり、SSLの場合のみ VirtualHost が正常に機能できいません。

設定の不備でしょうか?
正常に機能させる方法を教えてください。

よろしくお願いいたします。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-07-12 18:19
ドキュメント読みましょう。

http://httpd.apache.org/docs/2.0/vhosts/name-based.html
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-07-13 12:25
ドキュメントをよく読まずに投稿して、すいませんでした。

では、質問を変えたいのですが、

1台のサーバーで複数のSSL(https)に対応したWebサイトを
構築する方法を教えてください。

https://www.hoge.com/
https://hoge.com/
https://www.a.hoge.com/
https://a.hoge.com/
https://www.b.hoge.com/
https://b.hoge.com/

これらは、全て同じIPアドレスで、表示するページが違います。

こちらで一晩考えてみた(空想レベルですが)のですが、
ホスト名を判断してRewriteすればよいかなと思っています。
ただ、Tomcatと連携しているので、その辺設定が難しいです。
例えば、www.a.hoge.com は、JkMount /a/* ajp13
    www.b.hoge.com は、JkMount /b/* ajp13
他に、ホストによって変わる点は、
・ログの出力先
・証明書
ですが、まずはちゃんと機能させたいところです。

それはこれから試してみますが、
他に方法があれば、教えていただけますでしょうか。

よろしくお願いいたします。
綾瀬
ぬし
会議室デビュー日: 2002/07/31
投稿数: 393
お住まい・勤務地: どっちも3階
投稿日時: 2006-07-13 12:59
1つのIPアドレスでは1つのSSL証明書しか使えません。
つまり、FQDNごとにIPアドレスを用意する必要があります。
これはSSLの実装上の仕様と言っても過言ではないです。

よって、FQDNを別にしたいのならIPアドレスを6つ用意してください。
これが答えです。

どうしても1つのIPアドレスで実現したいのであればポートを別けるしかありません。

http://www.hoge.com:443/
hoge.com:444/
http://www.a.hoge.com:445/

などのように。

一応、別解としてCNがワイルドカードなSSL証明書も世の中に存在しますが、
いろいろあって個人的にはあまりお勧めはしません。

ドキュメント読まなくても、「SSL バーチャルホスト」などで検索すると
この話題はいくらでも出てきますのでもう一度調べてみては?
@IT会議室でも何度か同じような話が出てたと思いますよ。

[ メッセージ編集済み 編集者: 綾瀬 編集日時 2006-07-13 13:01 ]
Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-07-13 16:04
コメントありがとうございます。

調べてみました。

SSLプロトコルの認証がHostヘッダを渡す前に行われるため、ネームベースのバーチャルホストが効かないのですね。

その上で、もう少し食い下がりたいのですが、
(条件:ハードウェアを増やしたり、別途プロバイダと契約したりしたくない(お金をかけたくない))

1.
Apache 2.2のmod_sslでは「RFC 2817 - Upgrading to TLS Within HTTP/1.1」(port 443(https)ではなく、port 80(http)を用いて、いったんクリアテキストで Hostヘッダ等を渡した後にSSLに切り替える)が実装されているそうですね。
Apache 2.2で、SSLによるネームベースのバーチャルホストを試された方がいらっしゃれば、コメントいただけないでしょうか。
問題なければ、これがもっともスマートな解決手段かと思われます。

引用:

よって、FQDNを別にしたいのならIPアドレスを6つ用意してください。
これが答えです。



2.
IPアドレスをホスト名の数分用意する。これはグローバルIPアドレスですよね?
ローカルIPアドレスでIPアドレスベースのバーチャルホストにする方法はありますか?
mod_proxyとかでできるのでしょうか?
LinuxのVIFという方法で、1枚のネットワークインターフェースに複数のIPアドレスを
割り当てることができるようですね。

引用:

どうしても1つのIPアドレスで実現したいのであればポートを別けるしかありません。



3.
ポートをホスト名の数分開ける。これはやりたくないです。ポートを開けたくないです。
例えば、このようなことは可能でしょうか?
www.hoge.com:443 → ポート転送 → https://www.hoge.com:443/
hoge.com:443 → ポート転送 → https://hoge.com:444/
www.a.hoge.com:443 → ポート転送 → https://www.a.hoge.com:445/
iptablesとかで、ホスト名を判断することはできるのでしょうか?
これもSSLプロトコルの都合上、ダメでしょうか。

初めてのことが多いので1つ1つ試していきます。

引用:

一応、別解としてCNがワイルドカードなSSL証明書も世の中に存在しますが、
いろいろあって個人的にはあまりお勧めはしません。



ワイルドカードなSSL証明書の導入を検討しているのですが、
どのような問題があるのでしょうか?
是非、教えていただきたいです。
綾瀬
ぬし
会議室デビュー日: 2002/07/31
投稿数: 393
お住まい・勤務地: どっちも3階
投稿日時: 2006-07-14 10:06
こんにちは。

引用:

Apache 2.2のmod_sslでは「RFC 2817 - Upgrading to TLS Within HTTP/1.1」(port 443(https)ではなく、port 80(http)を用いて、いったんクリアテキストで Hostヘッダ等を渡した後にSSLに切り替える)が実装されているそうですね。


仮にサーバ側で正しく動作したとしても、これを実装したクライアント(WEBブラウザ)が
まだ無いはずです。
少なくともIEやMozilla等のメジャーなもので対応したというのは聞いたことがないです。
よって現時点では実質使えないのでは?と思ってます。

引用:

IPアドレスをホスト名の数分用意する。これはグローバルIPアドレスですよね?
ローカルIPアドレスでIPアドレスベースのバーチャルホストにする方法はありますか?


ローカルからしかアクセスが無いのであればもちろんローカルIPでも構いません。
ただ、今回はインターネット上でのサービス提供と受け取りましたので、
グローバルIP以外の選択肢は無いと思います。

引用:

ポートをホスト名の数分開ける。これはやりたくないです。ポートを開けたくないです。
(snip)
iptablesとかで、ホスト名を判断することはできるのでしょうか?


今度はiptablesのマニュアルでも読んでみてはいかがでしょう?

引用:

ワイルドカードなSSL証明書の導入を検討しているのですが、
どのような問題があるのでしょうか?



問題がある、とは一言も書いてませんけど
少なくとも、今回Jumpin' Jack Flashさんがやろうとしていることには
合わないと思います。

仮にCNが*.example.comな証明書を発行してもらった場合、
www.example.com
ssl.example.com
a.example.com
など、サブドメインが1段の場合はワイルドカードの範囲内ですが、
www.a.example.com
abc.def.example.com
など、2段以上になると一致しなくなり範囲外となります。

Jumpin'' Jack Flash
大ベテラン
会議室デビュー日: 2006/01/24
投稿数: 198
投稿日時: 2006-07-14 15:08
1.
おっしゃるとおり、ブラウザも対応していなければならないので、
時期尚早ですね。
却下です。

2.
インターネットで公開するサービスですので、グローバルIPアドレスが
ホスト数分必要になるので、コストに見合いません。
却下です。

3.
iptablesの勉強をしてみます。毎度、調査が浅く申し訳ございません。
しかし、iptablesを完全に理解するのはすぐにできることではないので、
今回は、見送ろうと思います。

4.
で、手がなくなってしまったので、妥協案として、httpsサーバーは、
https://www.hoge.com のみとし、
https://hoge.com/https://www.hoge.com/
https://www.a.hoge.com/https://www.hoge.com/a/
https://a.hoge.com/https://www.hoge.com/a/
https://www.b.hoge.com/https://www.hoge.com/b/
https://b.hoge.com/https://www.hoge.com/b/
にしようと思います(っていうか、元の状態に戻った)。


ワイルドカードなSSL証明書の件は了解しました。
サブドメインが2段以上になってもダメなんですね。
先にわかってよかったです。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)