Nginx

https 與 sni 兩個證書 tho 伺服器名稱但相同的配置。我可以使用一個伺服器塊嗎?

  • April 3, 2020

我經常遇到以下問題。

我有一個 nginx 伺服器通過 https 在同一個 IP 和同一個埠上提供兩個主機名。每個主機名都有自己的證書。

到目前為止,我正在做的是有兩種配置:

server {
   listen              443 ssl;
   server_name         www.example1.com;
   ssl_certificate     www.example1.com.crt;
   ssl_certificate_key www.example1.com.key;
   ssl_protocols       ...;
   ssl_ciphers         ...;
   ...
}

server {
   listen              443 ssl;
   server_name         www.example2.com;
   ssl_certificate     www.example2.com.crt;
   ssl_certificate_key www.example2.com.key;
   ssl_protocols       ...;
   ssl_ciphers         ...;
   ...
}

僅在一個伺服器塊中完成此操作有什麼技巧嗎?

我問的原因是,兩台伺服器共享名稱和證書完全相同的配置。

到目前為止我所做的是:

server {
   listen              443 ssl;
   server_name         www.example1.com;
   ssl_certificate     www.example1.com.crt;
   ssl_certificate_key www.example1.com.key;
   include /etc/nginx/common_config/example1_and_2/*;
}

server {
   listen              443 ssl;
   server_name         www.example2.com;
   ssl_certificate     www.example2.com.crt;
   ssl_certificate_key www.example2.com.key;
   include /etc/nginx/common_config/example1_and_2/*;
}

這可以改進嗎?有一些標準的建議嗎?如果這很好,是否至少有關於這種常見配置文件的路徑的建議?

server_name可以有多個主機名的列表,例如

server_name example.org www.example.org example.com www.example.com;

雖然(從 1.11.0 開始)可以在單個server { }塊中載入多個證書,但它適用於多種不同類型(例如 RSA 和 ECDSA),而不適用於多個主機名。但是可以在中使用變數ssl_certificate

從 1.15.9 版本開始,在使用 OpenSSL 1.0.2 或更高版本時,可以在文件名中使用變數:

ssl_certificate $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key; 

請注意,使用變數意味著將為每次 SSL 握手載入證書,這可能會對性能產生負面影響。

對於提到的性能影響,我不建議這樣做,而是將同server { }一塊的所有主機名組合成一個證書作為主題備用名稱(SAN)。

引用自:https://serverfault.com/questions/1010676