Multiple SSL NameVirtualHosts in Apache2

Apache 2.2.12 以上已 native support 了 SNI,不再需要另裝 mod_gnutls 支援。
本篇文章內容已過時,只剩下考古的作用。
新資訊請參考:Apache 從 2.2.12 開始支援 SNI

以往用 SSL + virtual host + apache 一直都有一個問題,
就是無法使用 name-based virtual host,
只能用 IP-based 然後從 port 去跳,
最近因為買了 tinlans.org 這個 domain,
也開始有機會認真的玩起 virtual host,
於是就 Google 查了一下...

查到的解法其實還不少,
比起 N 年前只能眼巴巴的望著明顯在擺爛的 apache manual 狂罵髒話要好得多了,
解法裡的 mod_gnutls 法是我比較滿意的一招,
比較可惜的是 FreeBSD 的 ports 並沒有收,
不過自己安裝其實也沒什麼難度,
就是連小學生都知道的 configure, make, and make install 三部曲,
相依套件看一下 mod_gnutls 的官網就知道要裝哪些了。

裝好以後去 apache22/httpd.conf 把 mod_gnutls 載入:

然後做一些基本設定 (可以直接設在 apache22/extra/httpd-vhosts.conf,要分檔也行):

原本的 apache22/extra/httpd-ssl.conf 可以整個廢掉不用,
裡面那些 SSL 相關的選項設下去也沒意義。

再來就是照平常那樣設定 virtual host 就可以了,
要產生更多的 virtual host 就照這個範本一直加就行 (不要問我在 IE7 上為什麼縮排看起來沒對準,去問 IE7 的作者):

大致上就是這樣,
要是啟動 apache 時看到什麼 port 443 是跑 non-SSL 的可以直接忽略,
反正還是會透過 mod_gnutls 這一層做加密就是了,
有沒有真的做到加密傳輸可以直接在 browser 上驗證;
選項的名稱其實會跟著 mod_gnutls 的版本變動,
上面的設定是給目前的 stable version 0.4.3 用的,
其實相關範例都會寫在原始碼根目錄的 README 裡,
請勿盲目照抄這篇。

如果是在搞非常 critical 的網站最好不要衝得太快,
mod_gnutls 目前還在實驗階段,
而且支援的 browser 其實涵蓋率並不太高,
可以參考看看 wikipedia 的支援清單
IE7 就我所知和 wiki 說的一樣在 XP 下沒有支援 SNI,
一定要是 Vista 才會支援,
Firefox 3 的話我測試的時候是覺得沒有很穩定,
同樣是 Vista + Firefox 3 的組合,
在我的 PC 上可以正常運作但是在 NB 上就不行 (差別只在 NB 升 Firefox 3 時沒有先移除 Firefox 2),
Gentoo 上的 Firefox 2 確定是可以 (我目前手邊沒有 windows 的 Firefox 2),
FreeBSD 上的 Firefox 3 目前也確定是正常,
至於 KDE 內建的 Konqueror 目前確定連 KDE 4.1.1 附的都是不行,
一些文字模式的 browser 像是 lynx 也是不用想了;
其實不支援也不會有什麼大不了的事情發生,
頂多就是抓到 default site 的憑證然後彈出伺服器名稱與憑證不符警告罷了,
看上去就類似這樣: