這真是一件艱辛又困苦的工作。
大部分架 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. 查找資料的時候看到了這個,蠻有用的樣子。
- Previous: 智慧、財產、權 @2005/09/27
- Next: One Certificate, Many subjectAltName @2005/09/28
Please send trackback to: http://blog.seety.org/everydaywork/2005/9/28/408/trackback/.