Ssl

伺服器可以提供多個 TLS 證書嗎?

  • February 9, 2022

假設我有一個域的 TLS 證書,但我不確定是否所有可能通過 HTTP 連接的使用者代理都會接受它。我能否獲得另一個證書,由另一個證書頒發機構簽名,並在這種情況下作為備份使用,對使用者透明?如果可能,建立安全連接的客戶端-伺服器通信將如何進行?這個案例在流行的 HTTP 伺服器的配置中是否廣為人知並受支持?

我知道有類似的問題,但他們詢問通過子域(可能)或路徑前綴(不可能的 IIUC,因為在協商時伺服器只知道權限,而不是完整的請求 URI)來改變使用的證書。

伺服器可以提供多個 TLS 證書嗎?

一台伺服器可以支持多個 TLS 證書。但它只能在與客戶端的 TLS 握手中提供單個 TLS 證書。AFAIK 是 TLS(握手)協議RFC 5246中設置的限制

當您有多個不同的域名都指向同一個伺服器時,最常使用支持多個證書的功能。

伺服器名稱指示 在客戶端進行的 TLS 握手中發送伺服器的主機名。這允許伺服器選擇用於該連接的最佳匹配證書。即伺服器可以www.example.com在客戶端表明它想要連接時使用證書,並且當客戶端連接時www.example.com它可以使用不同的(或預設)證書,例如只有 IP 地址、沒有主機名或不同的主機名在 ClientHello 消息中。

除了 ClientHello TLS 握手消息中的伺服器名稱之外,還可以將伺服器配置為使用其他參數來選擇不同的證書。

例如,在 TLSv1.2 握手期間,客戶端指示首選使用橢圓曲線而不是 RSA,則可以提供 ECDSA 密鑰/證書,而對於不這樣做的客戶端,可以提供 RSA 證書。

參見例如https://www.haproxy.com/blog/serving-ecc-and-rsa-certificates-on-same-ip-with-haproxy/和/或https://httpd.apache.org/docs/ 2.4/mod/mod_ssl.html#sslcertificatefile

例如,您可以對不支持 TLSv1.0 以上密碼的舊客戶端執行相同操作

但是一旦伺服器選擇了證書,就沒有回退,客戶端要麼接受要麼拒絕提供的證書。

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