SSL 如何在瀏覽器上工作
我最近從一個網站購買了一個 SSL 證書,並且能夠讓它在我的 Apache 伺服器上執行。
據我所知,它使用非對稱密鑰,私鑰儲存在伺服器上,而公鑰儲存在瀏覽器內部。
我的問題是,私鑰如何在瀏覽器端工作?是每個人都有,還是每次我訪問網站時,我的伺服器都會向訪問者發送一個新的公鑰?每次生成公鑰是如何產生的?
客戶端通常沒有私鑰。
在高層次上,該過程大致如下(這是一種簡化,如果您需要詳細資訊,請閱讀協議規範)
客戶端向伺服器發送一條“hello”消息,其中包含有關支持的協議和密碼套件的資訊。
伺服器選擇密碼套件和協議版本,並向客戶端發送密碼套件的詳細資訊並發送其證書。假設伺服器尊重客戶端密碼套件首選項,但並非所有伺服器都這樣做。
客戶端使用證書鏈驗證證書以確定它是否正在與正確的伺服器通信。
客戶端和伺服器同意會話的主共享密鑰,並且客戶端驗證它正在與之交談的伺服器是否擁有證書的私鑰。有幾種方法可以做到這一點,最簡單的是客戶端生成秘密,使用伺服器的 RSA 公鑰對其進行加密,然後將其發送到伺服器,伺服器使用其私鑰對其進行解密。這種方法的缺點是它不提供“前向保密”。另一種方法是使用臨時 Diffie-Hellman 密鑰交換(或橢圓曲線變體)來就秘密達成一致,並使用 RSA 簽名來驗證密鑰確實與您的伺服器達成一致(而不是與中間人達成一致) )。大多數現代客戶更喜歡橢圓曲線 Diffie-Hellman 密碼套件。
會話密鑰由主共享密鑰生成,加密通信使用對稱密碼和這些會話密鑰開始。
雖然有許多 TLS 配置,但我將描述最常見的設置。
公鑰在伺服器端是固定的——它是伺服器的公鑰。在連接到伺服器並接收到公鑰後,客戶端通過檢查它是否未過期、它是否與發送它的伺服器的域名匹配、最重要的是它是否已由公認的簽名來驗證該密鑰證書頒發者。
證書頒發者列表由瀏覽器管理,每次軟體更新時,列表都可以添加和刪除條目。最終,您相信您的瀏覽器供應商會及時更新享有盛譽的證書頒發者列表。
一旦建立了伺服器證書的真實性,對稱加密將在隨機選擇的會話密鑰下開始,該會話密鑰在連接終止後被丟棄。此會話密鑰由客戶端和伺服器協商,使用伺服器解密您使用嵌入在其證書中的公鑰加密的數據的能力。
以這種方式使用非對稱加密算法建立對稱會話密鑰稱為混合加密。非對稱加密在實踐中很少使用,因為它比對稱加密慢得多。