隨著互聯網技術的發展,Web應用的安全性問題越來越受到重視。SSL證書作為一種提供數據傳輸安全的加密技術,成為了保護Web應用的重要手段之一。而在一些特殊的情況下,需要在同一臺服務器上部署多個SSL證書,這時候基于SNI的SSL解決方案便應運而生。
一、SNI(Server Name Indication)是什么
SNI是一種TLS擴展協議,可以讓客戶端在建立SSL連接時,在“Client Hello”消息中包含擴展字段,告訴服務器客戶端想要連接的主機名。在單個IP地址和端口上,可以實現多域名同時使用不同的SSL證書。
然而,SNI并不被所有的瀏覽器和服務器支持。在使用SNI時,必須確保客戶端和服務器支持同一個SSL協議版本,并且客戶端必須支持SNI擴展。目前常用的瀏覽器,例如chrome、firefox、IE7及以上版本、Opera等均支持SNI。
二、Nginx反向代理和SSL
Nginx是一種高性能的Web服務器,并且支持反向代理。反向代理是一種信息安全技術,將請求發送到不同的服務器上,并將響應返回給請求者。反向代理服務器還可以實現負載均衡和SSL加密。
反向代理服務器作為中間層,與前端Web服務器和后端通信。Nginx支持http和https兩種服務模式。當使用https服務時,需要進行SSL加密和解密。
Nginx的SSL支持有兩種模式:單一SSL證書模式和基于SNI的多證書模式。在單一SSL證書模式下,只能使用一個SSL證書,即不能針對不同的域名使用不同的SSL證書。而在基于SNI的多證書模式下,可以實現多域名SSL加密傳輸。
三、基于SNI的SSL解決方案
- 生成SSL證書
首先需要申請SSL證書,并生成相應的證書鏈和私鑰。這里假設我們要使用兩個域名abc.com和xyz.com,分別生成兩個證書。
生成證書:
openssl req -newkey rsa:2048 -nodes -keyout abc.com.key -out abc.com.csr
openssl x509 -req -days 365 -in abc.com.csr -signkey abc.com.key -out abc.com.crt
openssl req -newkey rsa:2048 -nodes -keyout xyz.com.key -out xyz.com.csr
openssl x509 -req -days 365 -in xyz.com.csr -signkey xyz.com.key -out xyz.com.crt
生成證書鏈:
cat abc.com.crt domain.crt > abc.com-bundle.crt
cat xyz.com.crt domain.crt > xyz.com-bundle.crt
- 配置Nginx
在Nginx的配置文件中,需要添加如下的配置:
http {
…
# 配置SSL緩存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 配置SSL證書
server {
listen 443 ssl; server_name abc.com; ssl_certificate /path/to/abc.com-bundle.crt; ssl_certificate_key /path/to/abc.com.key;
}
server {
listen 443 ssl; server_name xyz.com; ssl_certificate /path/to/xyz.com-bundle.crt; ssl_certificate_key /path/to/xyz.com.key;
}
}
在配置文件中指定ssl_certificate和ssl_certificate_key即可分別使用不同的SSL證書。同時,需要為每個域名配置一個server塊。
- 驗證配置
重啟Nginx后,即可驗證配置是否生效。在瀏覽器中輸入abc.com和xyz.com,瀏覽器會在TLS握手階段發送SNI請求并返回對應的SSL證書。如果請求正常返回,即可證明基于SNI的SSL解決方案已經生效。
四、總結
基于SNI的SSL解決方案可以實現在同一臺服務器上部署多個SSL證書,適用于需要使用多域名SSL加密的場景。然而,需要注意的是,SNI并不被所有的瀏覽器和服務器支持,因此需要在使用時確保客戶端和服務器支持同一個SSL協議版本,并且客戶端必須支持SNI擴展。在配置過程中,需要為每個域名配置一個server塊,并指定對應的SSL證書和私鑰。