如何將 openssl 客戶端配置為僅接受特定的伺服器證書?
我是這個社區的新手,對與安全相關的事情有點了解。
我有三台伺服器
- 網路伺服器(客戶端)
- 郵件伺服器 (eSMTP)
- 網路伺服器
所有伺服器都有自己的 SSL 證書,並被要求執行以下操作:
Web 伺服器(客戶端)必須使用 TLS 向其他兩個伺服器發出安全請求,並且只接受來自這些伺服器的證書,僅此而已。有沒有辦法在openssl中配置它?我的問題是,證書是本地/自簽名的。
客戶端伺服器是 RHEL 7。
您正在談論的做法稱為“證書固定”(或有時稱為“公鑰固定”),當您同時控制客戶端和伺服器時,這是一種常見的安全建議。
通常這是通過配置 TLS 客戶端程式碼(可能是 OpenSSL 或其他一些庫)以引入自定義證書驗證步驟(通常是在建立連接時呼叫的函式)來完成,並在該步驟中驗證證書伺服器提供的與您期望的匹配。您可能想查看https://stackoverflow.com/questions/16291809/programmatically-verify-certificate-chain-using-openssl-api或https://stackoverflow.com/questions/3412032/how-do-you- verify-a-public-key-was-issued-by-your-private-ca用於執行此操作的程式碼範例(儘管這些範例很舊並且可能已過時);OpenSSL 的 API 很容易出錯。
您可能還想閱讀https://labs.nettitude.com/tutorials/tls-certificate-pinning-101/或類似內容,其中討論了進行固定時的注意事項。特別是,您要考慮諸如您固定哪個證書(特定葉證書、根 CA 或介於兩者之間)以及您固定多少證書(固定整個證書似乎很容易,但重新頒發證書卻很複雜)之類的事情使用新的日期或 OID 或類似資訊,而只需固定公鑰詳細資訊即可在大多數情況下提供您真正需要的所有安全性)。您還應該考慮備份/備份引腳,以便在您的主證書受到損害並需要撤銷時使證書輪換更容易。
儘管如此,在這種情況下可能還有另一種選擇。如果您的客戶端(也是伺服器)只連接到另一台伺服器,並且您使用內部 CA,則可以將 TLS 客戶端程式碼配置為使用僅包含該內部 CA 證書的 CA“捆綁包”,而不是使用系統範圍的 CA 捆綁包。這使您可以繼續使用預設的證書驗證程式碼,它只是不會信任任何不連結到您的內部 CA 的證書。這實際上與 CA 級別的 pinning 相同,但可能更簡單(儘管對驗證邏輯的精細控制較少)。