summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2016-04-30 10:59:06 -0400
committerJason R. Coombs <jaraco@jaraco.com>2016-04-30 10:59:06 -0400
commit7bc33ae668c8a62c6540f310f15f3374c4bb2649 (patch)
tree9b3f56382a8271a7dc374425e1cac25ec6c89684
parentb0da3ad4f852d58402532c9fc016f480243cb8c8 (diff)
parentd4620e07ea73cddd1b7d01374c7a2b44432f7627 (diff)
downloadcherrypy-7bc33ae668c8a62c6540f310f15f3374c4bb2649.tar.gz
Merge https://bitbucket.org/cherrypy/cherrypy/pull-requests/99
-rw-r--r--CHANGES.txt3
-rw-r--r--cherrypy/wsgiserver/ssl_builtin.py25
2 files changed, 22 insertions, 6 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index a3c62069..d2a369fd 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,8 +1,9 @@
-5.2.1
+5.3.0
-----
* #1202: Add support for specifying a certificate authority when
serving SSL using the built-in SSL support.
+* Use ssl.create_default_context when available.
5.2.0
-----
diff --git a/cherrypy/wsgiserver/ssl_builtin.py b/cherrypy/wsgiserver/ssl_builtin.py
index 4827b424..3faf7039 100644
--- a/cherrypy/wsgiserver/ssl_builtin.py
+++ b/cherrypy/wsgiserver/ssl_builtin.py
@@ -36,6 +36,11 @@ class BuiltinSSLAdapter(wsgiserver.SSLAdapter):
certificate_chain = None
"""The filename of the certificate chain file."""
+
+ """The ssl.SSLContext that will be used to wrap sockets where available
+ (on Python > 2.7.9 / 3.3)
+ """
+ context = None
def __init__(self, certificate, private_key, certificate_chain=None):
if ssl is None:
@@ -43,6 +48,12 @@ class BuiltinSSLAdapter(wsgiserver.SSLAdapter):
self.certificate = certificate
self.private_key = private_key
self.certificate_chain = certificate_chain
+ if hasattr(ssl, 'create_default_context'):
+ self.context = ssl.create_default_context(
+ purpose=ssl.Purpose.CLIENT_AUTH,
+ cafile=certificate_chain
+ )
+ self.context.load_cert_chain(certificate, private_key)
def bind(self, sock):
"""Wrap and return the given socket."""
@@ -51,11 +62,15 @@ class BuiltinSSLAdapter(wsgiserver.SSLAdapter):
def wrap(self, sock):
"""Wrap and return the given socket, plus WSGI environ entries."""
try:
- s = ssl.wrap_socket(sock, do_handshake_on_connect=True,
- server_side=True, certfile=self.certificate,
- keyfile=self.private_key,
- ssl_version=ssl.PROTOCOL_SSLv23,
- ca_certs=self.certificate_chain)
+ if self.context is not None:
+ s = self.context.wrap_socket(sock,do_handshake_on_connect=True,
+ server_side=True)
+ else:
+ s = ssl.wrap_socket(sock, do_handshake_on_connect=True,
+ server_side=True, certfile=self.certificate,
+ keyfile=self.private_key,
+ ssl_version=ssl.PROTOCOL_SSLv23,
+ ca_certs=self.certificate_chain)
except ssl.SSLError:
e = sys.exc_info()[1]
if e.errno == ssl.SSL_ERROR_EOF: