一、業務背景
在現代Web開發中,HTTPS已成為保障數據傳輸安全的標準協議。特別是對于地圖類API服務(如高德地圖),往往需要同時支持多個子域名(如webapi.amap.com
、restapi.amap.com
等)的HTTPS訪問。傳統方式需要為每個域名單獨配置證書,不僅管理成本高,而且容易出錯。本文將詳細介紹如何使用單張通配符證書+SAN證書技術,配合Nginx實現多域名HTTPS的統一管理。
二、解決思路
針對多域名HTTPS配置的挑戰,我們采用以下技術方案:
-
證書生成階段:
-
使用OpenSSL生成包含通配符域名和特定子域名的SAN證書
-
一次性覆蓋
*.amap.com
及特定業務域名
-
-
Nginx配置階段:
-
單server塊監聽443端口
-
動態代理到不同后端服務
-
啟用SNI支持多域名
-
-
客戶端適配:
-
自簽名證書需要手動安裝到受信任根證書
-
瀏覽器/移動端特殊處理
-
三、解決內容
3.1 證書生成步驟
1. 準備SAN配置文件(san.cnf
)
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = AMap
OU = Dev
CN = *.amap.com[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names[alt_names]
DNS.1 = *.amap.com
DNS.2 = webapi.amap.com
DNS.3 = restapi.amap.com
DNS.4 = vdata.amap.com
2. 執行生成命令
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 keyout "F:/amap.key" -out "F:/amap.crt" -config "F:/san.cnf" -extensions v3_req
3.2 客戶端證書安裝
Windows系統安裝步驟:
-
雙擊
amap.crt
文件 -
選擇"安裝證書" → "本地計算機" → "受信任的根證書頒發機構"
-
完成向導后重啟瀏覽器
3.3 Nginx核心配置
worker_processes auto;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 全局DNS配置(關鍵)resolver 8.8.8.8 114.114.114.114 valid=300s; # 公共DNS + 超時設置resolver_timeout 5s;# 請求體大小限制client_body_buffer_size 100m;client_max_body_size 100m;# SSL優化參數ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5:!SHA1;ssl_prefer_server_ciphers on;# 通配符證書服務器server {listen 443 ssl;server_name webapi.amap.com restapi.amap.com vdata.amap.com www.amap.com*.amap.com;ssl_certificate cert/amap.crt;ssl_certificate_key cert/amap.key;# 動態代理核心配置location / {# 關鍵:使用$host變量動態代理到對應域名proxy_pass https://$host$request_uri;# HTTPS代理必須參數proxy_ssl_server_name on; # 啟用SNI支持proxy_ssl_name $host; # 傳遞原始域名# 保持原始請求頭proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# 連接優化proxy_http_version 1.1;proxy_set_header Connection "";proxy_read_timeout 300s;proxy_cache_valid 200 302 12h;proxy_cache_key "$host$request_uri";}}
}
3.4 常見錯誤及解決方案
錯誤信息 | 原因分析 | 解決方案 |
---|---|---|
SSL_ERROR_BAD_CERT_DOMAIN | 證書域名不匹配請求域名 | 檢查SAN配置包含所有子域名 |
ERR_CERT_AUTHORITY_INVALID | 證書未受信任 | 確保證書安裝到"受信任的根證書" |
upstream SSL certificate verify error | Nginx證書驗證失敗 | 檢查proxy_ssl_trusted_certificate 路徑 |
certificate chain too long | 證書鏈不完整 | 合并中間證書到crt文件 |
no valid SSL certificate found | 證書密鑰不匹配 | 重新生成證書對 |
四、總結
通過本文的實踐,我們實現了:
-
一證多用:單張證書支持通配符域名和特定子域名
-
動態代理:Nginx根據請求域名自動路由
-
安全加固:啟用TLS 1.2+協議和強密碼套件
最佳實踐建議:
-
生產環境建議使用Let's Encrypt等權威CA
-
定期輪換證書(建議不超過1年)
-
使用OCSP Stapling提升驗證效率
注:本文示例適用于開發測試環境,生產環境請根據實際情況調整安全策略。