我正在撰寫一些需要通過 TLS 連接與遠程主機通信的 Python 代碼。我設定了這樣的 SSL 背景關系:
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
cxt.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
然后,我d通過埠連接到域,p如下所示:
s = ctx.wrap_socket(socket.create_connection(d, p))
我在意外的 EOF 上遇到了協議違規。修復方法是像這樣創建套接字:
s = ctx.wrap_socket(socket.create_connection(d, p), server_hostname=d)
由于我對 TLS 幾乎一無所知,這非常令人困惑。為什么需要服務器主機名才能成功連接?
如果重要的話,我d = 'drewdevault.com'在埠上測驗了與域的連接p = 1965;我正在寫一個雙子座客戶端。這無法在所有遠程主機上重現。
uj5u.com熱心網友回復:
該server_hostname引數將在 TLS 握手中用于為服務器提供預期的主機名。在 TLS 中沒有嚴格要求,但需要一臺服務器,這些服務器具有不同域的多個證書,但在同一 IP 地址上。沒有此資訊,服務器不知道向客戶端提供哪個證書。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/394887.html
