這真是一件艱辛又困苦的工作。

大部分架 WWW 的人都只有一個 IP 吧?無論是否如此,因為 apache 的 NameVirtualHost 非常好用的關係,想必大家都喜歡用 name-based virtual hosting,而 IP-based virtual hosting 能免則免;弄 virtual hosting 還要動 /etc/network/interfaces 畢竟是麻煩。

不過弄 TLS/SSL (https) 的時候 apache name-based virtual hosting 就傷腦筋了;因為 TLS/SSL 規格和實作上的限制,一個 IP 就只能有一個 certificate,所以 named-based virtual hosting 只能為一個 virtual host 提供完整 SSL 能力。

嚴格來講其它所有的 virtual host 也可以使用 SSL,但會共用相同的 certificate,因此只有一個 virtual host 能夠有正確的 domain name (commonName/CN) 對應。

為了研究出解決之道,我實在花了太多時間,以致於犬太郎都生氣了。我參考的主要資訊來源是 openssl-users@openssl.org 裡的 Re: How to include multiple common names in a single SSL certificate?x509 (1), req (1)

解法的重點在於讓 certificate 列出多個 commonName,也就是 domain name。我們可以修改 openssl.conf,讓 openssl req 執行時取得多重的 commonName 資訊,或者是直接用 -subj 指定 Subject line:

$ openssl req -new \
-key key.pem -out req.pem \
-subj "/C=TW/ST=Taiwan/O=SEETY/CN=domain1.org/CN=domain2.org"

-subj 是比較方便的作法 (note: openssl.conf 倒還沒有改對過)。

Request 產生出來之後,再用 root/CA cert/key 進行簽核,產生 certificate 即可:

$ openssl x509 \
-req -days 3650 -sha1 -extensions v3_req \
-CA cacert.pem \
-CAkey cakey.pem \
-in req.pem -out crt.pem \
-CAcreateserial

Multiply CN 這個方法唯一的缺點是它對 Firefox/Mozilla 無效,但對 Internet Explorer 是有效的 (可不可以因此說 IE 不安全呢?)。不過作為一個 workaround,在 https 跳出 certificate verification 對話框的時候多按幾個滑鼠,還在我可以接受的範圍之內。

P.S. 查找資料的時候看到了這個,蠻有用的樣子。

Posted by yungyuc at 19:00, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "zQhBV"
© hover year to navigate month: powered by django