Ads 468x60px

Pages

2011年12月30日 星期五

多重網域 UCC SSL 憑證的申請方式 Multi-domain UCC SSL on one certificates

近代,使用 https 協定的網站或服務,經常是由多個 domain name 來組成一個網頁,可是 ssl v1.0 只允許單一 SSL certificate 使用於單一 domain name,這樣,在使用上就會有問題。

要支援 multiple sites 使用 HTTPS 以及名稱虛擬主機(Name-Based Virtual Host) 可以使用

  1. Wildcard Names(萬用字元): specified in RFC2818
  2. Subject Alternative Names(憑證主體別名):  x509 version 3 certificate (specified in RFC3280)

這二者在使用上是不同的。萬用字元是用在同一個 sub-domain 之下的,例如: *.example.com 的憑證, 可以使用在 www.example.com, foo.example.com, bar.example.com, 但是不可以使用在 example.com, aaa.www.example.com. 而憑證主體別名卻可以涵蓋多個不同的網域,例如:www.mydomain.com 的憑證,可以包含 www.myimage.com, foo.myugc.com, foo.bar.mydomain.com. 至於如何挑選要使用那一種憑證,就要視你的網站規劃而定了,它們的費用也不一樣,正常來說,萬用字元會比憑證主體別名還貴。

以下詳列「憑證主體別名」的申請以及自行簽章的方式,環境為 Cent-OS 5.x, OpenSSL 0.9.8e. 你需要修改 /etc/pki/tls/openssl.cnf

1. 啟動擴展
[req]
req_extensions = v3_req
2. 增加 subjectAltName 到 v3_req 的區段
[ v3_req ]
subjectAltName = @alt_names
3. 例如你要包含的多個網域
[alt_names]
DNS.1 = example.com
DNS.2 = hello.example.com
DNS.3 = testing.com
DNS.4 = www.testing.com
DNS.5 = foo.testing.com
4. 修改完成,存檔後,接著產生私密金鑰
openssl genrsa -des3 -out www.example.com.key 2048
這個步驟,一定要你輸入 passphrase;不過在未來使用上,重啟 Apache Server 時,都一定要輸入這個 passphrase 有點麻煩。我們可以另外產生一個不需要 passphrase 的 key 來使用。
openssl rsa -in www.example.com.key -out www.example.key.insecure
5. 產生 CSR(憑證簽署請求)
openssl req -new -key www.example.com.key -out www.example.com.csr
按照步驟填入適當資料,請注意,在填寫 commonName 的地方,就是填入你的主網站名稱,如本例:www.example.com 做完之後,就會有一個 www.example.com.csr 的檔案,在你當前的目錄中,接著我們確認一下
openssl req -text -noout -in www.example.com.csr
應該會看到
Attributes:
        Requested Extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com, DNS:hello.example.com, DNS:testing.com, DNS:www.testing.com, DNS:foo.testing.com
這樣,你就可以拿這個 CSR 去申請有效的 SAN 憑證了。在此,我們繼續做自行簽章及核發的動作。
openssl x509 -req -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_req -in www.example.com.csr -signkey www.example.com.key -out www.example.com.crt
這裡,要注意一下,一定要加 "-extfile /etc/pki/tls/openssl.cnf -extensions v3_req" 這二個參數(卡關很久啊!);然後,再驗證一下
openssl x509 -text -noout -in www.example.com.crt
應該會看到
X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: critical
                DNS:example.com, DNS:hello.example.com, DNS:testing.com, DNS:www.testing.com, DNS:foo.testing.com
這樣,就大致完成了。接著就 copy www.example.com.key.insecure, 以及 www.example.com.crt 到你的 Apache Server, 並設定 apache conf(請自己 google 一下就不贅述了)