OK, 一段完成了之後第二段就不會太難了。剛剛用 ssl firefox multiple commonName關鍵字去找,便看到了這一篇。commonName 的寫法也列在裡面。

早看到就好了 :) 根據其中的 Interoperability Test,我選用 1. Way: SubjectAltName Only 這個方法;這是 x509v3 的一項 extension。先複製一份 openssl.cnf,在 [v3_req] 區塊裡加上 subjectAltName 的定義:

subjectAltName = DNS:domain1.com, DNS:domain2.com

然後打開 [req] 區塊裡的

req_extensions = v3_req

最後用這個 openssl.cnf 產生 request、簽核 certificate 即可;我把 request/sign 的過程寫成一個如下的 Makefile:

OWNER = yungyuc.yungyuc

default:
      echo "select one"

req:
      openssl req -new \
              -config openssl.cnf -text \
              -key key.pem -out req.pem

reqsubj:
      openssl req -noout -subject -in req.pem

reqtext:
      openssl req -noout -text -in req.pem

crt:
      openssl x509 \
              -req -days 3650 -sha1 \
              -extfile openssl.cnf -extensions v3_req \
              -CA cacert.pem \
              -CAkey cakey.pem \
              -in req.pem -out crt.pem
      chown $(OWNER) crt.pem

crtsubj:
      openssl x509 -noout -subject -in crt.pem

crttext:
      openssl x509 -noout -text -in crt.pem

這樣不管是 Firefox, Mozilla 還是 IE,都可以正確支援多 domain name 的 certificate 了。

Posted by yungyuc at 22:21, 0 comment, 0 trackback.

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

大部分架 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.
Change to page (10 entries in each page): 1
© hover year to navigate month: powered by django