Commit 1c86b445 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #12000: When a SSL certificate has a subjectAltName without any

dNSName entry, ssl.match_hostname() should use the subject's commonName.
Patch by Nicolas Bareil.
parent 78349b06
...@@ -122,8 +122,9 @@ def match_hostname(cert, hostname): ...@@ -122,8 +122,9 @@ def match_hostname(cert, hostname):
if _dnsname_to_pat(value).match(hostname): if _dnsname_to_pat(value).match(hostname):
return return
dnsnames.append(value) dnsnames.append(value)
if not san: if not dnsnames:
# The subject is only checked when subjectAltName is empty # The subject is only checked when there is no dNSName entry
# in subjectAltName
for sub in cert.get('subject', ()): for sub in cert.get('subject', ()):
for key, value in sub: for key, value in sub:
# XXX according to RFC 2818, the most specific Common Name # XXX according to RFC 2818, the most specific Common Name
......
...@@ -277,6 +277,24 @@ class BasicSocketTests(unittest.TestCase): ...@@ -277,6 +277,24 @@ class BasicSocketTests(unittest.TestCase):
(('organizationName', 'Google Inc'),))} (('organizationName', 'Google Inc'),))}
fail(cert, 'mail.google.com') fail(cert, 'mail.google.com')
# No DNS entry in subjectAltName but a commonName
cert = {'notAfter': 'Dec 18 23:59:59 2099 GMT',
'subject': ((('countryName', 'US'),),
(('stateOrProvinceName', 'California'),),
(('localityName', 'Mountain View'),),
(('commonName', 'mail.google.com'),)),
'subjectAltName': (('othername', 'blabla'), )}
ok(cert, 'mail.google.com')
# No DNS entry subjectAltName and no commonName
cert = {'notAfter': 'Dec 18 23:59:59 2099 GMT',
'subject': ((('countryName', 'US'),),
(('stateOrProvinceName', 'California'),),
(('localityName', 'Mountain View'),),
(('organizationName', 'Google Inc'),)),
'subjectAltName': (('othername', 'blabla'),)}
fail(cert, 'google.com')
# Empty cert / no cert # Empty cert / no cert
self.assertRaises(ValueError, ssl.match_hostname, None, 'example.com') self.assertRaises(ValueError, ssl.match_hostname, None, 'example.com')
self.assertRaises(ValueError, ssl.match_hostname, {}, 'example.com') self.assertRaises(ValueError, ssl.match_hostname, {}, 'example.com')
......
...@@ -49,6 +49,7 @@ Luigi Ballabio ...@@ -49,6 +49,7 @@ Luigi Ballabio
Jeff Balogh Jeff Balogh
Matt Bandy Matt Bandy
Michael J. Barber Michael J. Barber
Nicolas Bareil
Chris Barker Chris Barker
Nick Barnes Nick Barnes
Quentin Barnes Quentin Barnes
......
...@@ -83,6 +83,10 @@ Core and Builtins ...@@ -83,6 +83,10 @@ Core and Builtins
Library Library
------- -------
- Issue #12000: When a SSL certificate has a subjectAltName without any
dNSName entry, ssl.match_hostname() should use the subject's commonName.
Patch by Nicolas Bareil.
- Issue #11647: objects created using contextlib.contextmanager now support - Issue #11647: objects created using contextlib.contextmanager now support
more than one call to the function when used as a decorator. Initial patch more than one call to the function when used as a decorator. Initial patch
by Ysj Ray. by Ysj Ray.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment