![openssl 中是否需要針對 SSL 憑證進行 CN/主機名稱驗證?](https://rvso.com/image/38691/openssl%20%E4%B8%AD%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E9%87%9D%E5%B0%8D%20SSL%20%E6%86%91%E8%AD%89%E9%80%B2%E8%A1%8C%20CN%2F%E4%B8%BB%E6%A9%9F%E5%90%8D%E7%A8%B1%E9%A9%97%E8%AD%89%EF%BC%9F%20.png)
在存在「信任證書」和其他屬性的情況下......這有多重要?
OpenSSL 現在是否實作了?
答案1
在大多數使用SSL 的協定/應用程式中,客戶端需要檢查以下兩個內容:(1) 伺服器提供有效的證書,這意味著該證書由受信任的CA 頒發且未過期、撤銷或篡改,並且(2) 此憑證適用於您想要的伺服器,不是您的連線被錯誤或故意攻擊路由到的其他人。 (在極少數情況下,您不需要伺服器驗證,僅需要機密性,但是您最好使用明確不進行身份驗證的「anon」或「aNULL」密碼套件。)
迄今為止,OpenSSL 執行 (1) 但不執行 (2),並且通常僅支援其信任庫中的 CA 根憑證;一個 CA 根可能「負責」數千或數百萬個伺服器證書,例如,如果 Verisign 向兩者頒發了證書bigbank.com
,localdiner.com
這並不意味著我想將我的 bigbank 帳戶交給 localdiner。因此,應用程式需要執行 (2),無論是在 verify_callback 中,還是在握手完成之後但在發送(敏感)資料之前。下一個主要版本 1.0.2 計劃包含對憑證鏈驗證的增強,並且我相信至少在某些情況下還會進行名稱驗證。請注意,對於使用 RFC 2818 的 HTTPS 或使用 RFC 6125 的其他基於 TLS 的協議,您需要檢查主題中的 CommonName 和SubjectAlternativeNames 擴充(如果存在)。
我不知道為什麼選擇 OpenSSL(以及在此之前的 SSLeay)不這樣做已經。有人可能會說,一些不尋常的 SSL/TLS 應用程式需要標準 CN/SAN 以外的東西,但 OpenSSL 在其他領域可以處理常見情況,並為罕見情況提供回調或選項。我認為這可能是工作太多而人員不足(直到最近)。