SNI: 讓Nginx在一個IP上使用多個證書
近幾天,準備在nginx給多個域名配證書,原想著在不同的server下配不同的證書是多麼自然的一件事情啊。
然後老大跟我說不能,這樣會收不到請求,我說為啥呢?
在這篇 文章中,我們可以看到,
SSL其實位於TCP/IP協議層中,應用層和運輸層之間,尚未到達HTTP這一層,但是又位於TCP之上。
我們知道,Nginx支援在一個IP上服務多個域名,原因就在於,HTTP協議裡有一個欄位是Host
,通過匹配
這個欄位的值和nginx.conf
中的server_name
,Nginx就可以方便的把請求轉發到對應的內容伺服器上去。
但是對於HTTPS卻行不通,為什麼呢?上面說過,SSL位於HTTP協議和TCP協議之間,也就是說,一個請求到來, 在握手階段,SSL並不知道這個請求到底是請求哪個Host。而要知道Host,就需要解密HTTP請求,但是SSL這一層正是 為了加密HTTP的。於是就陷入了一種先有雞還是先有蛋的問題。
所以有了SNI:Server Name Indication,工作原理是在SSL握手的階段,瀏覽器把Host欄位一起發過去。這樣 Nginx便可以在一個IP上服務多個HTTPS服務。但是這個技術有三個要求:
nginx -V nginx -V
老大所說的不能,其原因就是因為有一部分使用者還在使用非常非常老的瀏覽器 :(
參考:
- ofollow,noindex" target="_blank">https://www.ruby-forum.com/topic/186664
- http://nginx.org/en/docs/http/configuring_https_servers.html#sni
- https://en.wikipedia.org/wiki/Server_Name_Indication#Support