假設(shè)有這樣一個(gè)場(chǎng)景,我們有多個(gè)站點(diǎn)(例如site1.marei.com,site2.marei.com和site3.marei.com)綁定到同一個(gè)IP:PORT,并區(qū)分不同的主機(jī)頭。我們?yōu)槊恳粋€(gè)SSL站點(diǎn)申請(qǐng)并安裝了證書(shū)。在瀏覽網(wǎng)站時(shí),用戶仍看到證書(shū)不匹配的錯(cuò)誤。
1. IIS中實(shí)現(xiàn)
當(dāng)一個(gè)https的請(qǐng)求到達(dá)IIS服務(wù)器時(shí),https請(qǐng)求為加密狀態(tài),需要拿到相應(yīng)的服務(wù)器證書(shū)解密請(qǐng)求。由于每個(gè)站點(diǎn)對(duì)應(yīng)的證書(shū)不同,服務(wù)器需要通過(guò)請(qǐng)求中不同的主機(jī)頭來(lái)判斷需要用哪個(gè)證書(shū)解密,然而主機(jī)頭作為請(qǐng)求的一部分也被加密。最終IIS只好使用第一個(gè)綁定到該IP:PORT的站點(diǎn)證書(shū)解密請(qǐng)求,從而有可能造成對(duì)于其他站點(diǎn)的請(qǐng)求失敗而報(bào)錯(cuò)。
解決方案
第一種解決方案將每個(gè)https站點(diǎn)綁定到不同的端口。但是這樣的話客戶端瀏覽網(wǎng)頁(yè)時(shí)必須手動(dòng)指定端口,例如 https://site.domain.com:444
第二種解決方案是為每個(gè)站點(diǎn)分配一個(gè)獨(dú)立的ip,這樣沖突就解決了,甚至主機(jī)頭也不用添加了。
第三種解決方案是使用通配證書(shū)。我們采用通配證書(shū)頒發(fā)給.domain.com,對(duì)于我們的示例中,應(yīng)該采用頒發(fā)給.marei.com的證書(shū),這樣任何訪問(wèn)該domain的請(qǐng)求均可以通過(guò)該證書(shū)解密,證書(shū)匹配錯(cuò)誤也就不復(fù)存在了。
第四種解決方案是升級(jí)為IIS8,IIS8中添加的對(duì)于SNI(Server Name Indication)的支持,服務(wù)器可以通請(qǐng)求中提取出相應(yīng)的主機(jī)頭從而找到相應(yīng)的證書(shū)。
SNI開(kāi)啟方式請(qǐng)參考http://www.tjdsmy.cn/learn/get-started/whats-new-in-iis-8/iis-80-server-name-indication-sni-ssl-scalability
2. Nginx中實(shí)現(xiàn)
打開(kāi) Nginx 安裝目錄下 conf 目錄中打開(kāi) nginx.conf 文件,找到
server {
listen 443;
server_name domain1;
ssl on;
ssl_certificate 磁盤目錄/訂單號(hào)1.pem;
ssl_certificate_key 磁盤目錄/訂單號(hào)1.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
在上述基礎(chǔ)上,再添加另一段配置
server {
listen 443;
server_name dommain2; #第二個(gè)域名
ssl on;
ssl_certificate 磁盤目錄/訂單號(hào)2.pem;
ssl_certificate_key 磁盤目錄/訂單號(hào)2.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
通過(guò)上述配置在Nginx中支持多個(gè)證書(shū)
3. Apache配置HTTPS虛擬主機(jī)共享443端口
Listen 443
NameVirtualHost *:443
……
ServerName www.tjdsmy.cn
SSLCertificateFile common.crt;
SSLCertificateKeyFile common.key;
SSLCertificateChainFile ca.crt
……
……
ServerName www.tjdsmy.cn
SSLCertificateFile common2.crt;
SSLCertificateKeyFile common2.key;
SSLCertificateChainFile ca2.crt
……