mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
merge 3.4 (#22959)
This commit is contained in:
commit
b46247bee5
4 changed files with 22 additions and 10 deletions
|
@ -69,17 +69,12 @@ The module provides the following classes:
|
||||||
*key_file* and *cert_file* are deprecated, please use
|
*key_file* and *cert_file* are deprecated, please use
|
||||||
:meth:`ssl.SSLContext.load_cert_chain` instead, or let
|
:meth:`ssl.SSLContext.load_cert_chain` instead, or let
|
||||||
:func:`ssl.create_default_context` select the system's trusted CA
|
:func:`ssl.create_default_context` select the system's trusted CA
|
||||||
certificates for you.
|
certificates for you. The *check_hostname* parameter is also deprecated; the
|
||||||
|
:attr:`SSLContext.check_hostname` attribute of *context* should be used
|
||||||
|
instead.
|
||||||
|
|
||||||
Please read :ref:`ssl-security` for more information on best practices.
|
Please read :ref:`ssl-security` for more information on best practices.
|
||||||
|
|
||||||
.. note::
|
|
||||||
If *context* is specified and has a :attr:`~ssl.SSLContext.verify_mode`
|
|
||||||
of either :data:`~ssl.CERT_OPTIONAL` or :data:`~ssl.CERT_REQUIRED`, then
|
|
||||||
by default *host* is matched against the host name(s) allowed by the
|
|
||||||
server's certificate. If you want to change that behaviour, you can
|
|
||||||
explicitly set *check_hostname* to False.
|
|
||||||
|
|
||||||
.. versionchanged:: 3.2
|
.. versionchanged:: 3.2
|
||||||
*source_address*, *context* and *check_hostname* were added.
|
*source_address*, *context* and *check_hostname* were added.
|
||||||
|
|
||||||
|
|
|
@ -1274,8 +1274,8 @@ else:
|
||||||
context = ssl._create_default_https_context()
|
context = ssl._create_default_https_context()
|
||||||
will_verify = context.verify_mode != ssl.CERT_NONE
|
will_verify = context.verify_mode != ssl.CERT_NONE
|
||||||
if check_hostname is None:
|
if check_hostname is None:
|
||||||
check_hostname = will_verify
|
check_hostname = context.check_hostname
|
||||||
elif check_hostname and not will_verify:
|
if check_hostname and not will_verify:
|
||||||
raise ValueError("check_hostname needs a SSL context with "
|
raise ValueError("check_hostname needs a SSL context with "
|
||||||
"either CERT_OPTIONAL or CERT_REQUIRED")
|
"either CERT_OPTIONAL or CERT_REQUIRED")
|
||||||
if key_file or cert_file:
|
if key_file or cert_file:
|
||||||
|
|
|
@ -1113,6 +1113,7 @@ class HTTPSTest(TestCase):
|
||||||
server = self.make_server(CERT_fakehostname)
|
server = self.make_server(CERT_fakehostname)
|
||||||
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
|
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
|
||||||
context.verify_mode = ssl.CERT_REQUIRED
|
context.verify_mode = ssl.CERT_REQUIRED
|
||||||
|
context.check_hostname = True
|
||||||
context.load_verify_locations(CERT_fakehostname)
|
context.load_verify_locations(CERT_fakehostname)
|
||||||
h = client.HTTPSConnection('localhost', server.port, context=context)
|
h = client.HTTPSConnection('localhost', server.port, context=context)
|
||||||
with self.assertRaises(ssl.CertificateError):
|
with self.assertRaises(ssl.CertificateError):
|
||||||
|
@ -1123,11 +1124,24 @@ class HTTPSTest(TestCase):
|
||||||
with self.assertRaises(ssl.CertificateError):
|
with self.assertRaises(ssl.CertificateError):
|
||||||
h.request('GET', '/')
|
h.request('GET', '/')
|
||||||
# With check_hostname=False, the mismatching is ignored
|
# With check_hostname=False, the mismatching is ignored
|
||||||
|
context.check_hostname = False
|
||||||
h = client.HTTPSConnection('localhost', server.port, context=context,
|
h = client.HTTPSConnection('localhost', server.port, context=context,
|
||||||
check_hostname=False)
|
check_hostname=False)
|
||||||
h.request('GET', '/nonexistent')
|
h.request('GET', '/nonexistent')
|
||||||
resp = h.getresponse()
|
resp = h.getresponse()
|
||||||
self.assertEqual(resp.status, 404)
|
self.assertEqual(resp.status, 404)
|
||||||
|
# The context's check_hostname setting is used if one isn't passed to
|
||||||
|
# HTTPSConnection.
|
||||||
|
context.check_hostname = False
|
||||||
|
h = client.HTTPSConnection('localhost', server.port, context=context)
|
||||||
|
h.request('GET', '/nonexistent')
|
||||||
|
self.assertEqual(h.getresponse().status, 404)
|
||||||
|
# Passing check_hostname to HTTPSConnection should override the
|
||||||
|
# context's setting.
|
||||||
|
h = client.HTTPSConnection('localhost', server.port, context=context,
|
||||||
|
check_hostname=True)
|
||||||
|
with self.assertRaises(ssl.CertificateError):
|
||||||
|
h.request('GET', '/')
|
||||||
|
|
||||||
@unittest.skipIf(not hasattr(client, 'HTTPSConnection'),
|
@unittest.skipIf(not hasattr(client, 'HTTPSConnection'),
|
||||||
'http.client.HTTPSConnection not available')
|
'http.client.HTTPSConnection not available')
|
||||||
|
|
|
@ -194,6 +194,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #22959: In the constructor of http.client.HTTPSConnection, prefer the
|
||||||
|
context's check_hostname attribute over the *check_hostname* parameter.
|
||||||
|
|
||||||
- Issue #22696: Add function :func:`sys.is_finalizing` to know about
|
- Issue #22696: Add function :func:`sys.is_finalizing` to know about
|
||||||
interpreter shutdown.
|
interpreter shutdown.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue