2017-04-21 78 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