2017-04-21 79 views
1

我正在嘗試建立到SSL啓用域的SSL連接,以檢查它們的SSL配置是否正確,我正在使用以下代碼,我希望它能夠與unicode域一起工作(使用第一個域線),但我仍然有同樣的問題(原來的FQDN存儲爲UTF-8字符串中的FQDNPython SSL和Unicode域

fqdn = bytes(fqdn, encoding="utf-8").decode("idna") 
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
context.verify_mode = ssl.CERT_REQUIRED 
context.check_hostname = True 
context.load_default_certs() 
conn = context.wrap_socket(socket.socket(socket.AF_INET), 
           server_hostname=fqdn) 
conn.connect((fqdn, 443)) 

當嘗試連接,我得到這個錯誤,如果這是一個Unicode域名:

hostname 'xxx-gästewohnung-xxxbühl.ch' doesn't match 'xn--xxx-gstewohnung-xxxbhl-44b50d.ch' 

我該如何解決這個問題,使域名能夠正確匹配?

回答

2

這看起來像是一個bug。根據我的理解,SSLSocket中的代碼將給定的名稱從IDNA顯式解碼爲unicode。從​​:

585 newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, 
... 
607   PyObject *hostname = PyUnicode_Decode(server_hostname, strlen(server_hostname), 
608            "idna", "strict"); 

但是,在Lib/ssl.py檢查,而不是預期的名字被IDNA編碼:

219 def _dnsname_match(dn, hostname, max_wildcards=1): 
... 
240 if not wildcards: 
241  return dn.lower() == hostname.lower() 
... 
250 elif leftmost.startswith('xn--') or hostname.startswith('xn--'): 

添加一些版畫在代碼調試顯示dn在這個函數包含IDNA編碼名稱,而hostname是UTF-8編碼,因此241行中的比較不匹配。鑑於SSLObject中的代碼顯式解碼IDNA的名稱,我看不到解決此問題的方法。

+0

嗯我認爲你是對的,我發現了一個Python的相關問題:http://bugs.python.org/issue28414 – Kedare