blob: 39019f9b1344616bfce1fb65f0971af9483493fa [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +00001# Wrapper module for _ssl, providing some additional facilities
2# implemented in Python. Written by Bill Janssen.
3
Guido van Rossum5b8b1552007-11-16 00:06:11 +00004"""This module provides some more Pythonic support for SSL.
Thomas Woutersed03b412007-08-28 21:37:11 +00005
6Object types:
7
Thomas Wouters1b7f8912007-09-19 03:06:30 +00008 SSLSocket -- subtype of socket.socket which does SSL over the socket
Thomas Woutersed03b412007-08-28 21:37:11 +00009
10Exceptions:
11
Thomas Wouters1b7f8912007-09-19 03:06:30 +000012 SSLError -- exception raised for I/O errors
Thomas Woutersed03b412007-08-28 21:37:11 +000013
14Functions:
15
16 cert_time_to_seconds -- convert time string used for certificate
17 notBefore and notAfter functions to integer
18 seconds past the Epoch (the time values
19 returned from time.time())
20
21 fetch_server_certificate (HOST, PORT) -- fetch the certificate provided
22 by the server running on HOST at port PORT. No
23 validation of the certificate is performed.
24
25Integer constants:
26
27SSL_ERROR_ZERO_RETURN
28SSL_ERROR_WANT_READ
29SSL_ERROR_WANT_WRITE
30SSL_ERROR_WANT_X509_LOOKUP
31SSL_ERROR_SYSCALL
32SSL_ERROR_SSL
33SSL_ERROR_WANT_CONNECT
34
35SSL_ERROR_EOF
36SSL_ERROR_INVALID_ERROR_CODE
37
38The following group define certificate requirements that one side is
39allowing/requiring from the other side:
40
41CERT_NONE - no certificates from the other side are required (or will
42 be looked at if provided)
43CERT_OPTIONAL - certificates are not required, but if provided will be
44 validated, and if validation fails, the connection will
45 also fail
46CERT_REQUIRED - certificates are required, and will be validated, and
47 if validation fails, the connection will also fail
48
49The following constants identify various SSL protocol variants:
50
51PROTOCOL_SSLv2
52PROTOCOL_SSLv3
53PROTOCOL_SSLv23
54PROTOCOL_TLSv1
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010055PROTOCOL_TLSv1_1
56PROTOCOL_TLSv1_2
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +010057
58The following constants identify various SSL alert message descriptions as per
59http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6
60
61ALERT_DESCRIPTION_CLOSE_NOTIFY
62ALERT_DESCRIPTION_UNEXPECTED_MESSAGE
63ALERT_DESCRIPTION_BAD_RECORD_MAC
64ALERT_DESCRIPTION_RECORD_OVERFLOW
65ALERT_DESCRIPTION_DECOMPRESSION_FAILURE
66ALERT_DESCRIPTION_HANDSHAKE_FAILURE
67ALERT_DESCRIPTION_BAD_CERTIFICATE
68ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE
69ALERT_DESCRIPTION_CERTIFICATE_REVOKED
70ALERT_DESCRIPTION_CERTIFICATE_EXPIRED
71ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN
72ALERT_DESCRIPTION_ILLEGAL_PARAMETER
73ALERT_DESCRIPTION_UNKNOWN_CA
74ALERT_DESCRIPTION_ACCESS_DENIED
75ALERT_DESCRIPTION_DECODE_ERROR
76ALERT_DESCRIPTION_DECRYPT_ERROR
77ALERT_DESCRIPTION_PROTOCOL_VERSION
78ALERT_DESCRIPTION_INSUFFICIENT_SECURITY
79ALERT_DESCRIPTION_INTERNAL_ERROR
80ALERT_DESCRIPTION_USER_CANCELLED
81ALERT_DESCRIPTION_NO_RENEGOTIATION
82ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION
83ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
84ALERT_DESCRIPTION_UNRECOGNIZED_NAME
85ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE
86ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE
87ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY
Thomas Woutersed03b412007-08-28 21:37:11 +000088"""
89
Christian Heimes05e8be12008-02-23 18:30:17 +000090import textwrap
Antoine Pitrou59fdd672010-10-08 10:37:08 +000091import re
Christian Heimes46bebee2013-06-09 19:03:31 +020092import sys
Christian Heimes6d7ad132013-06-09 18:02:55 +020093import os
Christian Heimesa6bc95a2013-11-17 19:59:14 +010094from collections import namedtuple
Antoine Pitrou172f0252014-04-18 20:33:08 +020095from enum import Enum as _Enum, IntEnum as _IntEnum
Thomas Woutersed03b412007-08-28 21:37:11 +000096
97import _ssl # if we can't import it, let the error propagate
Thomas Wouters1b7f8912007-09-19 03:06:30 +000098
Antoine Pitrou04f6a322010-04-05 21:40:07 +000099from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200100from _ssl import _SSLContext, MemoryBIO
Antoine Pitrou41032a62011-10-27 23:56:55 +0200101from _ssl import (
102 SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
103 SSLSyscallError, SSLEOFError,
104 )
Thomas Woutersed03b412007-08-28 21:37:11 +0000105from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
Christian Heimes22587792013-11-21 23:56:13 +0100106from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN,
107 VERIFY_X509_STRICT)
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100108from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj
Victor Stinnerbeeb5122014-11-28 13:28:25 +0100109from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes
110try:
111 from _ssl import RAND_egd
112except ImportError:
113 # LibreSSL does not provide RAND_egd
114 pass
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100115
116def _import_symbols(prefix):
117 for n in dir(_ssl):
118 if n.startswith(prefix):
119 globals()[n] = getattr(_ssl, n)
120
121_import_symbols('OP_')
122_import_symbols('ALERT_DESCRIPTION_')
123_import_symbols('SSL_ERROR_')
124
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100125from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100126
Antoine Pitroub9ac25d2011-07-08 18:47:06 +0200127from _ssl import _OPENSSL_API_VERSION
128
Antoine Pitrou172f0252014-04-18 20:33:08 +0200129_SSLMethod = _IntEnum('_SSLMethod',
130 {name: value for name, value in vars(_ssl).items()
131 if name.startswith('PROTOCOL_')})
132globals().update(_SSLMethod.__members__)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100133
Antoine Pitrou172f0252014-04-18 20:33:08 +0200134_PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
135
Victor Stinner3de49192011-05-09 00:42:58 +0200136try:
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100137 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2
Antoine Pitrou172f0252014-04-18 20:33:08 +0200138except NameError:
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100139 _SSLv2_IF_EXISTS = None
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100140
Christian Heimes46bebee2013-06-09 19:03:31 +0200141if sys.platform == "win32":
Christian Heimes44109d72013-11-22 01:51:30 +0100142 from _ssl import enum_certificates, enum_crls
Christian Heimes46bebee2013-06-09 19:03:31 +0200143
Antoine Pitrou15399c32011-04-28 19:23:55 +0200144from socket import socket, AF_INET, SOCK_STREAM, create_connection
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100145from socket import SOL_SOCKET, SO_TYPE
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000146import base64 # for DER-to-PEM translation
Antoine Pitroude8cf322010-04-26 17:29:05 +0000147import errno
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000148
Andrew Svetlov0832af62012-12-18 23:10:48 +0200149
150socket_error = OSError # keep that public name in module namespace
151
Antoine Pitroud6494802011-07-21 01:11:30 +0200152if _ssl.HAS_TLS_UNIQUE:
153 CHANNEL_BINDING_TYPES = ['tls-unique']
154else:
155 CHANNEL_BINDING_TYPES = []
Thomas Woutersed03b412007-08-28 21:37:11 +0000156
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100157# Disable weak or insecure ciphers by default
158# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
Donald Stufft79ccaa22014-03-21 21:33:34 -0400159# Enable a better set of ciphers by default
160# This list has been explicitly chosen to:
161# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
162# * Prefer ECDHE over DHE for better performance
163# * Prefer any AES-GCM over any AES-CBC for better performance and security
164# * Then Use HIGH cipher suites as a fallback
165# * Then Use 3DES as fallback which is secure but slow
166# * Finally use RC4 as a fallback which is problematic but needed for
167# compatibility some times.
168# * Disable NULL authentication, NULL encryption, and MD5 MACs for security
169# reasons
170_DEFAULT_CIPHERS = (
171 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
172 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:'
173 'DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5'
174)
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100175
Donald Stufft6a2ba942014-03-23 19:05:28 -0400176# Restricted and more secure ciphers for the server side
Donald Stufft79ccaa22014-03-21 21:33:34 -0400177# This list has been explicitly chosen to:
178# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
179# * Prefer ECDHE over DHE for better performance
180# * Prefer any AES-GCM over any AES-CBC for better performance and security
181# * Then Use HIGH cipher suites as a fallback
182# * Then Use 3DES as fallback which is secure but slow
183# * Disable NULL authentication, NULL encryption, MD5 MACs, DSS, and RC4 for
184# security reasons
Donald Stufft6a2ba942014-03-23 19:05:28 -0400185_RESTRICTED_SERVER_CIPHERS = (
Donald Stufft79ccaa22014-03-21 21:33:34 -0400186 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
187 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
188 '!eNULL:!MD5:!DSS:!RC4'
189)
Christian Heimes4c05b472013-11-23 15:58:30 +0100190
Thomas Woutersed03b412007-08-28 21:37:11 +0000191
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000192class CertificateError(ValueError):
193 pass
194
195
Georg Brandl72c98d32013-10-27 07:16:53 +0100196def _dnsname_match(dn, hostname, max_wildcards=1):
197 """Matching according to RFC 6125, section 6.4.3
198
199 http://tools.ietf.org/html/rfc6125#section-6.4.3
200 """
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000201 pats = []
Georg Brandl72c98d32013-10-27 07:16:53 +0100202 if not dn:
203 return False
204
205 leftmost, *remainder = dn.split(r'.')
206
207 wildcards = leftmost.count('*')
208 if wildcards > max_wildcards:
209 # Issue #17980: avoid denials of service by refusing more
Berker Peksagf23530f2014-10-19 18:04:38 +0300210 # than one wildcard per fragment. A survey of established
Georg Brandl72c98d32013-10-27 07:16:53 +0100211 # policy among SSL implementations showed it to be a
212 # reasonable choice.
213 raise CertificateError(
214 "too many wildcards in certificate DNS name: " + repr(dn))
215
216 # speed up common case w/o wildcards
217 if not wildcards:
218 return dn.lower() == hostname.lower()
219
220 # RFC 6125, section 6.4.3, subitem 1.
221 # The client SHOULD NOT attempt to match a presented identifier in which
222 # the wildcard character comprises a label other than the left-most label.
223 if leftmost == '*':
224 # When '*' is a fragment by itself, it matches a non-empty dotless
225 # fragment.
226 pats.append('[^.]+')
227 elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
228 # RFC 6125, section 6.4.3, subitem 3.
229 # The client SHOULD NOT attempt to match a presented identifier
230 # where the wildcard character is embedded within an A-label or
231 # U-label of an internationalized domain name.
232 pats.append(re.escape(leftmost))
233 else:
234 # Otherwise, '*' matches any dotless string, e.g. www*
235 pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
236
237 # add the remaining fragments, ignore any wildcards
238 for frag in remainder:
239 pats.append(re.escape(frag))
240
241 pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
242 return pat.match(hostname)
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000243
244
245def match_hostname(cert, hostname):
246 """Verify that *cert* (in decoded format as returned by
Georg Brandl72c98d32013-10-27 07:16:53 +0100247 SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
248 rules are followed, but IP addresses are not accepted for *hostname*.
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000249
250 CertificateError is raised on failure. On success, the function
251 returns nothing.
252 """
253 if not cert:
Christian Heimes1aa9a752013-12-02 02:41:19 +0100254 raise ValueError("empty or no certificate, match_hostname needs a "
255 "SSL socket or SSL context with either "
256 "CERT_OPTIONAL or CERT_REQUIRED")
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000257 dnsnames = []
258 san = cert.get('subjectAltName', ())
259 for key, value in san:
260 if key == 'DNS':
Georg Brandl72c98d32013-10-27 07:16:53 +0100261 if _dnsname_match(value, hostname):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000262 return
263 dnsnames.append(value)
Antoine Pitrou1c86b442011-05-06 15:19:49 +0200264 if not dnsnames:
265 # The subject is only checked when there is no dNSName entry
266 # in subjectAltName
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000267 for sub in cert.get('subject', ()):
268 for key, value in sub:
269 # XXX according to RFC 2818, the most specific Common Name
270 # must be used.
271 if key == 'commonName':
Georg Brandl72c98d32013-10-27 07:16:53 +0100272 if _dnsname_match(value, hostname):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000273 return
274 dnsnames.append(value)
275 if len(dnsnames) > 1:
276 raise CertificateError("hostname %r "
277 "doesn't match either of %s"
278 % (hostname, ', '.join(map(repr, dnsnames))))
279 elif len(dnsnames) == 1:
280 raise CertificateError("hostname %r "
281 "doesn't match %r"
282 % (hostname, dnsnames[0]))
283 else:
284 raise CertificateError("no appropriate commonName or "
285 "subjectAltName fields were found")
286
287
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100288DefaultVerifyPaths = namedtuple("DefaultVerifyPaths",
Christian Heimes6d7ad132013-06-09 18:02:55 +0200289 "cafile capath openssl_cafile_env openssl_cafile openssl_capath_env "
290 "openssl_capath")
291
292def get_default_verify_paths():
293 """Return paths to default cafile and capath.
294 """
295 parts = _ssl.get_default_verify_paths()
296
297 # environment vars shadow paths
298 cafile = os.environ.get(parts[0], parts[1])
299 capath = os.environ.get(parts[2], parts[3])
300
301 return DefaultVerifyPaths(cafile if os.path.isfile(cafile) else None,
302 capath if os.path.isdir(capath) else None,
303 *parts)
304
305
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100306class _ASN1Object(namedtuple("_ASN1Object", "nid shortname longname oid")):
307 """ASN.1 object identifier lookup
308 """
309 __slots__ = ()
310
311 def __new__(cls, oid):
312 return super().__new__(cls, *_txt2obj(oid, name=False))
313
314 @classmethod
315 def fromnid(cls, nid):
316 """Create _ASN1Object from OpenSSL numeric ID
317 """
318 return super().__new__(cls, *_nid2obj(nid))
319
320 @classmethod
321 def fromname(cls, name):
322 """Create _ASN1Object from short name, long name or OID
323 """
324 return super().__new__(cls, *_txt2obj(name, name=True))
325
326
Christian Heimes72d28502013-11-23 13:56:58 +0100327class Purpose(_ASN1Object, _Enum):
328 """SSLContext purpose flags with X509v3 Extended Key Usage objects
329 """
330 SERVER_AUTH = '1.3.6.1.5.5.7.3.1'
331 CLIENT_AUTH = '1.3.6.1.5.5.7.3.2'
332
333
Antoine Pitrou152efa22010-05-16 18:19:27 +0000334class SSLContext(_SSLContext):
335 """An SSLContext holds various SSL-related configuration options and
336 data, such as certificates and possibly a private key."""
337
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100338 __slots__ = ('protocol', '__weakref__')
Christian Heimes72d28502013-11-23 13:56:58 +0100339 _windows_cert_stores = ("CA", "ROOT")
Antoine Pitrou152efa22010-05-16 18:19:27 +0000340
341 def __new__(cls, protocol, *args, **kwargs):
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100342 self = _SSLContext.__new__(cls, protocol)
343 if protocol != _SSLv2_IF_EXISTS:
344 self.set_ciphers(_DEFAULT_CIPHERS)
345 return self
Antoine Pitrou152efa22010-05-16 18:19:27 +0000346
347 def __init__(self, protocol):
348 self.protocol = protocol
349
350 def wrap_socket(self, sock, server_side=False,
351 do_handshake_on_connect=True,
Antoine Pitroud5323212010-10-22 18:19:07 +0000352 suppress_ragged_eofs=True,
353 server_hostname=None):
Antoine Pitrou152efa22010-05-16 18:19:27 +0000354 return SSLSocket(sock=sock, server_side=server_side,
355 do_handshake_on_connect=do_handshake_on_connect,
356 suppress_ragged_eofs=suppress_ragged_eofs,
Antoine Pitroud5323212010-10-22 18:19:07 +0000357 server_hostname=server_hostname,
Antoine Pitrou152efa22010-05-16 18:19:27 +0000358 _context=self)
359
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200360 def wrap_bio(self, incoming, outgoing, server_side=False,
361 server_hostname=None):
362 sslobj = self._wrap_bio(incoming, outgoing, server_side=server_side,
363 server_hostname=server_hostname)
364 return SSLObject(sslobj)
365
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100366 def set_npn_protocols(self, npn_protocols):
367 protos = bytearray()
368 for protocol in npn_protocols:
369 b = bytes(protocol, 'ascii')
370 if len(b) == 0 or len(b) > 255:
371 raise SSLError('NPN protocols must be 1 to 255 in length')
372 protos.append(len(b))
373 protos.extend(b)
374
375 self._set_npn_protocols(protos)
376
Christian Heimes72d28502013-11-23 13:56:58 +0100377 def _load_windows_store_certs(self, storename, purpose):
378 certs = bytearray()
379 for cert, encoding, trust in enum_certificates(storename):
380 # CA certs are never PKCS#7 encoded
381 if encoding == "x509_asn":
382 if trust is True or purpose.oid in trust:
383 certs.extend(cert)
384 self.load_verify_locations(cadata=certs)
385 return certs
386
387 def load_default_certs(self, purpose=Purpose.SERVER_AUTH):
388 if not isinstance(purpose, _ASN1Object):
389 raise TypeError(purpose)
390 if sys.platform == "win32":
391 for storename in self._windows_cert_stores:
392 self._load_windows_store_certs(storename, purpose)
Benjamin Peterson5915b0f2014-10-03 17:27:05 -0400393 self.set_default_verify_paths()
Christian Heimes72d28502013-11-23 13:56:58 +0100394
Antoine Pitrou152efa22010-05-16 18:19:27 +0000395
Christian Heimes4c05b472013-11-23 15:58:30 +0100396def create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None,
397 capath=None, cadata=None):
398 """Create a SSLContext object with default settings.
399
400 NOTE: The protocol and settings may change anytime without prior
401 deprecation. The values represent a fair balance between maximum
402 compatibility and security.
403 """
404 if not isinstance(purpose, _ASN1Object):
405 raise TypeError(purpose)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400406
407 context = SSLContext(PROTOCOL_SSLv23)
408
Christian Heimes4c05b472013-11-23 15:58:30 +0100409 # SSLv2 considered harmful.
410 context.options |= OP_NO_SSLv2
Donald Stufft6a2ba942014-03-23 19:05:28 -0400411
412 # SSLv3 has problematic security and is only required for really old
413 # clients such as IE6 on Windows XP
414 context.options |= OP_NO_SSLv3
415
Christian Heimesdec813f2013-11-28 08:06:54 +0100416 # disable compression to prevent CRIME attacks (OpenSSL 1.0+)
417 context.options |= getattr(_ssl, "OP_NO_COMPRESSION", 0)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400418
Christian Heimes4c05b472013-11-23 15:58:30 +0100419 if purpose == Purpose.SERVER_AUTH:
Donald Stufft6a2ba942014-03-23 19:05:28 -0400420 # verify certs and host name in client mode
Christian Heimes4c05b472013-11-23 15:58:30 +0100421 context.verify_mode = CERT_REQUIRED
Christian Heimes1aa9a752013-12-02 02:41:19 +0100422 context.check_hostname = True
Donald Stufft6a2ba942014-03-23 19:05:28 -0400423 elif purpose == Purpose.CLIENT_AUTH:
424 # Prefer the server's ciphers by default so that we get stronger
425 # encryption
426 context.options |= getattr(_ssl, "OP_CIPHER_SERVER_PREFERENCE", 0)
427
428 # Use single use keys in order to improve forward secrecy
429 context.options |= getattr(_ssl, "OP_SINGLE_DH_USE", 0)
430 context.options |= getattr(_ssl, "OP_SINGLE_ECDH_USE", 0)
431
432 # disallow ciphers with known vulnerabilities
433 context.set_ciphers(_RESTRICTED_SERVER_CIPHERS)
434
Christian Heimes4c05b472013-11-23 15:58:30 +0100435 if cafile or capath or cadata:
436 context.load_verify_locations(cafile, capath, cadata)
437 elif context.verify_mode != CERT_NONE:
438 # no explicit cafile, capath or cadata but the verify mode is
439 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
440 # root CA certificates for the given purpose. This may fail silently.
441 context.load_default_certs(purpose)
442 return context
443
Benjamin Peterson4ffb0752014-11-03 14:29:33 -0500444def _create_unverified_context(protocol=PROTOCOL_SSLv23, *, cert_reqs=None,
Christian Heimesa02c69a2013-12-02 20:59:28 +0100445 check_hostname=False, purpose=Purpose.SERVER_AUTH,
Christian Heimes67986f92013-11-23 22:43:47 +0100446 certfile=None, keyfile=None,
447 cafile=None, capath=None, cadata=None):
448 """Create a SSLContext object for Python stdlib modules
449
450 All Python stdlib modules shall use this function to create SSLContext
451 objects in order to keep common settings in one place. The configuration
452 is less restrict than create_default_context()'s to increase backward
453 compatibility.
454 """
455 if not isinstance(purpose, _ASN1Object):
456 raise TypeError(purpose)
457
458 context = SSLContext(protocol)
459 # SSLv2 considered harmful.
460 context.options |= OP_NO_SSLv2
Antoine Pitroue4eda4d2014-10-17 19:28:30 +0200461 # SSLv3 has problematic security and is only required for really old
462 # clients such as IE6 on Windows XP
463 context.options |= OP_NO_SSLv3
Christian Heimes67986f92013-11-23 22:43:47 +0100464
465 if cert_reqs is not None:
466 context.verify_mode = cert_reqs
Christian Heimesa02c69a2013-12-02 20:59:28 +0100467 context.check_hostname = check_hostname
Christian Heimes67986f92013-11-23 22:43:47 +0100468
469 if keyfile and not certfile:
470 raise ValueError("certfile must be specified")
471 if certfile or keyfile:
472 context.load_cert_chain(certfile, keyfile)
473
474 # load CA root certs
475 if cafile or capath or cadata:
476 context.load_verify_locations(cafile, capath, cadata)
477 elif context.verify_mode != CERT_NONE:
478 # no explicit cafile, capath or cadata but the verify mode is
479 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
480 # root CA certificates for the given purpose. This may fail silently.
481 context.load_default_certs(purpose)
482
483 return context
484
Benjamin Peterson4ffb0752014-11-03 14:29:33 -0500485# Used by http.client if no context is explicitly passed.
486_create_default_https_context = create_default_context
487
488
489# Backwards compatibility alias, even though it's not a public name.
490_create_stdlib_context = _create_unverified_context
491
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200492
493class SSLObject:
494 """This class implements an interface on top of a low-level SSL object as
495 implemented by OpenSSL. This object captures the state of an SSL connection
496 but does not provide any network IO itself. IO needs to be performed
497 through separate "BIO" objects which are OpenSSL's IO abstraction layer.
498
499 This class does not have a public constructor. Instances are returned by
500 ``SSLContext.wrap_bio``. This class is typically used by framework authors
501 that want to implement asynchronous IO for SSL through memory buffers.
502
503 When compared to ``SSLSocket``, this object lacks the following features:
504
505 * Any form of network IO incluging methods such as ``recv`` and ``send``.
506 * The ``do_handshake_on_connect`` and ``suppress_ragged_eofs`` machinery.
507 """
508
509 def __init__(self, sslobj, owner=None):
510 self._sslobj = sslobj
511 # Note: _sslobj takes a weak reference to owner
512 self._sslobj.owner = owner or self
513
514 @property
515 def context(self):
516 """The SSLContext that is currently in use."""
517 return self._sslobj.context
518
519 @context.setter
520 def context(self, ctx):
521 self._sslobj.context = ctx
522
523 @property
524 def server_side(self):
525 """Whether this is a server-side socket."""
526 return self._sslobj.server_side
527
528 @property
529 def server_hostname(self):
530 """The currently set server hostname (for SNI), or ``None`` if no
531 server hostame is set."""
532 return self._sslobj.server_hostname
533
534 def read(self, len=0, buffer=None):
535 """Read up to 'len' bytes from the SSL object and return them.
536
537 If 'buffer' is provided, read into this buffer and return the number of
538 bytes read.
539 """
540 if buffer is not None:
541 v = self._sslobj.read(len, buffer)
542 else:
543 v = self._sslobj.read(len or 1024)
544 return v
545
546 def write(self, data):
547 """Write 'data' to the SSL object and return the number of bytes
548 written.
549
550 The 'data' argument must support the buffer interface.
551 """
552 return self._sslobj.write(data)
553
554 def getpeercert(self, binary_form=False):
555 """Returns a formatted version of the data in the certificate provided
556 by the other end of the SSL channel.
557
558 Return None if no certificate was provided, {} if a certificate was
559 provided, but not validated.
560 """
561 return self._sslobj.peer_certificate(binary_form)
562
563 def selected_npn_protocol(self):
564 """Return the currently selected NPN protocol as a string, or ``None``
565 if a next protocol was not negotiated or if NPN is not supported by one
566 of the peers."""
567 if _ssl.HAS_NPN:
568 return self._sslobj.selected_npn_protocol()
569
570 def cipher(self):
571 """Return the currently selected cipher as a 3-tuple ``(name,
572 ssl_version, secret_bits)``."""
573 return self._sslobj.cipher()
574
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600575 def shared_ciphers(self):
Benjamin Petersonc114e7d2015-01-11 15:22:07 -0500576 """Return a list of ciphers shared by the client during the handshake or
577 None if this is not a valid server connection.
Benjamin Peterson5318c7a2015-01-07 11:26:50 -0600578 """
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600579 return self._sslobj.shared_ciphers()
580
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200581 def compression(self):
582 """Return the current compression algorithm in use, or ``None`` if
583 compression was not negotiated or not supported by one of the peers."""
584 return self._sslobj.compression()
585
586 def pending(self):
587 """Return the number of bytes that can be read immediately."""
588 return self._sslobj.pending()
589
Antoine Pitrou3cb93792014-10-06 00:21:09 +0200590 def do_handshake(self):
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200591 """Start the SSL/TLS handshake."""
592 self._sslobj.do_handshake()
593 if self.context.check_hostname:
594 if not self.server_hostname:
595 raise ValueError("check_hostname needs server_hostname "
596 "argument")
597 match_hostname(self.getpeercert(), self.server_hostname)
598
599 def unwrap(self):
600 """Start the SSL shutdown handshake."""
601 return self._sslobj.shutdown()
602
603 def get_channel_binding(self, cb_type="tls-unique"):
604 """Get channel binding data for current connection. Raise ValueError
605 if the requested `cb_type` is not supported. Return bytes of the data
606 or None if the data is not available (e.g. before the handshake)."""
607 if cb_type not in CHANNEL_BINDING_TYPES:
608 raise ValueError("Unsupported channel binding type")
609 if cb_type != "tls-unique":
610 raise NotImplementedError(
611 "{0} channel binding type not implemented"
612 .format(cb_type))
613 return self._sslobj.tls_unique_cb()
614
615 def version(self):
616 """Return a string identifying the protocol version used by the
617 current SSL channel. """
618 return self._sslobj.version()
619
620
Antoine Pitrou152efa22010-05-16 18:19:27 +0000621class SSLSocket(socket):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000622 """This class implements a subtype of socket.socket that wraps
623 the underlying OS socket in an SSL context when necessary, and
624 provides read and write methods over that channel."""
625
Bill Janssen6e027db2007-11-15 22:23:56 +0000626 def __init__(self, sock=None, keyfile=None, certfile=None,
Thomas Woutersed03b412007-08-28 21:37:11 +0000627 server_side=False, cert_reqs=CERT_NONE,
Bill Janssen6e027db2007-11-15 22:23:56 +0000628 ssl_version=PROTOCOL_SSLv23, ca_certs=None,
629 do_handshake_on_connect=True,
630 family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100631 suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
Antoine Pitroud5323212010-10-22 18:19:07 +0000632 server_hostname=None,
Antoine Pitrou152efa22010-05-16 18:19:27 +0000633 _context=None):
Bill Janssen6e027db2007-11-15 22:23:56 +0000634
Antoine Pitrou152efa22010-05-16 18:19:27 +0000635 if _context:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100636 self._context = _context
Antoine Pitrou152efa22010-05-16 18:19:27 +0000637 else:
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000638 if server_side and not certfile:
639 raise ValueError("certfile must be specified for server-side "
640 "operations")
Giampaolo Rodolà8b7da622010-08-30 18:28:05 +0000641 if keyfile and not certfile:
642 raise ValueError("certfile must be specified")
Antoine Pitrou152efa22010-05-16 18:19:27 +0000643 if certfile and not keyfile:
644 keyfile = certfile
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100645 self._context = SSLContext(ssl_version)
646 self._context.verify_mode = cert_reqs
Antoine Pitrou152efa22010-05-16 18:19:27 +0000647 if ca_certs:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100648 self._context.load_verify_locations(ca_certs)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000649 if certfile:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100650 self._context.load_cert_chain(certfile, keyfile)
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100651 if npn_protocols:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100652 self._context.set_npn_protocols(npn_protocols)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000653 if ciphers:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100654 self._context.set_ciphers(ciphers)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000655 self.keyfile = keyfile
656 self.certfile = certfile
657 self.cert_reqs = cert_reqs
658 self.ssl_version = ssl_version
659 self.ca_certs = ca_certs
660 self.ciphers = ciphers
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100661 # Can't use sock.type as other flags (such as SOCK_NONBLOCK) get
662 # mixed in.
663 if sock.getsockopt(SOL_SOCKET, SO_TYPE) != SOCK_STREAM:
664 raise NotImplementedError("only stream sockets are supported")
Antoine Pitroud5323212010-10-22 18:19:07 +0000665 if server_side and server_hostname:
666 raise ValueError("server_hostname can only be specified "
667 "in client mode")
Christian Heimes1aa9a752013-12-02 02:41:19 +0100668 if self._context.check_hostname and not server_hostname:
Benjamin Peterson7243b572014-11-23 17:04:34 -0600669 raise ValueError("check_hostname requires server_hostname")
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000670 self.server_side = server_side
Antoine Pitroud5323212010-10-22 18:19:07 +0000671 self.server_hostname = server_hostname
Antoine Pitrou152efa22010-05-16 18:19:27 +0000672 self.do_handshake_on_connect = do_handshake_on_connect
673 self.suppress_ragged_eofs = suppress_ragged_eofs
Bill Janssen6e027db2007-11-15 22:23:56 +0000674 if sock is not None:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000675 socket.__init__(self,
676 family=sock.family,
677 type=sock.type,
678 proto=sock.proto,
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000679 fileno=sock.fileno())
Antoine Pitrou40f08742010-04-24 22:04:40 +0000680 self.settimeout(sock.gettimeout())
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000681 sock.detach()
Bill Janssen6e027db2007-11-15 22:23:56 +0000682 elif fileno is not None:
683 socket.__init__(self, fileno=fileno)
684 else:
685 socket.__init__(self, family=family, type=type, proto=proto)
686
Antoine Pitrou242db722013-05-01 20:52:07 +0200687 # See if we are connected
688 try:
689 self.getpeername()
690 except OSError as e:
691 if e.errno != errno.ENOTCONN:
692 raise
693 connected = False
694 else:
695 connected = True
696
Antoine Pitroufa2b9382010-04-26 22:17:47 +0000697 self._closed = False
698 self._sslobj = None
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000699 self._connected = connected
Antoine Pitroufa2b9382010-04-26 22:17:47 +0000700 if connected:
701 # create the SSL object
Bill Janssen6e027db2007-11-15 22:23:56 +0000702 try:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200703 sslobj = self._context._wrap_socket(self, server_side,
704 server_hostname)
705 self._sslobj = SSLObject(sslobj, owner=self)
Bill Janssen6e027db2007-11-15 22:23:56 +0000706 if do_handshake_on_connect:
Bill Janssen48dc27c2007-12-05 03:38:10 +0000707 timeout = self.gettimeout()
708 if timeout == 0.0:
709 # non-blocking
710 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
Bill Janssen6e027db2007-11-15 22:23:56 +0000711 self.do_handshake()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000712
Christian Heimes1aa9a752013-12-02 02:41:19 +0100713 except (OSError, ValueError):
Bill Janssen6e027db2007-11-15 22:23:56 +0000714 self.close()
Christian Heimes1aa9a752013-12-02 02:41:19 +0100715 raise
Antoine Pitrou242db722013-05-01 20:52:07 +0200716
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100717 @property
718 def context(self):
719 return self._context
720
721 @context.setter
722 def context(self, ctx):
723 self._context = ctx
724 self._sslobj.context = ctx
Bill Janssen6e027db2007-11-15 22:23:56 +0000725
Guido van Rossumb7b030e2007-11-16 01:28:45 +0000726 def dup(self):
727 raise NotImplemented("Can't dup() %s instances" %
728 self.__class__.__name__)
729
Bill Janssen6e027db2007-11-15 22:23:56 +0000730 def _checkClosed(self, msg=None):
731 # raise an exception here if you wish to check for spurious closes
732 pass
733
Antoine Pitrou242db722013-05-01 20:52:07 +0200734 def _check_connected(self):
735 if not self._connected:
736 # getpeername() will raise ENOTCONN if the socket is really
737 # not connected; note that we can be connected even without
738 # _connected being set, e.g. if connect() first returned
739 # EAGAIN.
740 self.getpeername()
741
Bill Janssen54cc54c2007-12-14 22:08:56 +0000742 def read(self, len=0, buffer=None):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000743 """Read up to LEN bytes and return them.
744 Return zero-length string on EOF."""
745
Bill Janssen6e027db2007-11-15 22:23:56 +0000746 self._checkClosed()
Antoine Pitrou60a26e02013-07-20 19:35:16 +0200747 if not self._sslobj:
748 raise ValueError("Read on closed or unwrapped SSL socket.")
Bill Janssen6e027db2007-11-15 22:23:56 +0000749 try:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200750 return self._sslobj.read(len, buffer)
Bill Janssen6e027db2007-11-15 22:23:56 +0000751 except SSLError as x:
752 if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
Antoine Pitrou24e561a2010-09-03 18:38:17 +0000753 if buffer is not None:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000754 return 0
755 else:
756 return b''
Bill Janssen6e027db2007-11-15 22:23:56 +0000757 else:
758 raise
Thomas Woutersed03b412007-08-28 21:37:11 +0000759
760 def write(self, data):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000761 """Write DATA to the underlying SSL channel. Returns
762 number of bytes of DATA actually transmitted."""
763
Bill Janssen6e027db2007-11-15 22:23:56 +0000764 self._checkClosed()
Antoine Pitrou60a26e02013-07-20 19:35:16 +0200765 if not self._sslobj:
766 raise ValueError("Write on closed or unwrapped SSL socket.")
Thomas Woutersed03b412007-08-28 21:37:11 +0000767 return self._sslobj.write(data)
768
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000769 def getpeercert(self, binary_form=False):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000770 """Returns a formatted version of the data in the
771 certificate provided by the other end of the SSL channel.
772 Return None if no certificate was provided, {} if a
773 certificate was provided, but not validated."""
774
Bill Janssen6e027db2007-11-15 22:23:56 +0000775 self._checkClosed()
Antoine Pitrou242db722013-05-01 20:52:07 +0200776 self._check_connected()
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200777 return self._sslobj.getpeercert(binary_form)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000778
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100779 def selected_npn_protocol(self):
780 self._checkClosed()
781 if not self._sslobj or not _ssl.HAS_NPN:
782 return None
783 else:
784 return self._sslobj.selected_npn_protocol()
785
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000786 def cipher(self):
Bill Janssen6e027db2007-11-15 22:23:56 +0000787 self._checkClosed()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000788 if not self._sslobj:
789 return None
790 else:
791 return self._sslobj.cipher()
Thomas Woutersed03b412007-08-28 21:37:11 +0000792
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600793 def shared_ciphers(self):
794 self._checkClosed()
795 if not self._sslobj:
796 return None
797 return self._sslobj.shared_ciphers()
798
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +0100799 def compression(self):
800 self._checkClosed()
801 if not self._sslobj:
802 return None
803 else:
804 return self._sslobj.compression()
805
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000806 def send(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000807 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000808 if self._sslobj:
809 if flags != 0:
810 raise ValueError(
811 "non-zero flags not allowed in calls to send() on %s" %
812 self.__class__)
Antoine Pitroub4bebda2014-04-29 10:03:28 +0200813 return self._sslobj.write(data)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000814 else:
815 return socket.send(self, data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000816
Antoine Pitroua468adc2010-09-14 14:43:44 +0000817 def sendto(self, data, flags_or_addr, addr=None):
Bill Janssen6e027db2007-11-15 22:23:56 +0000818 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000819 if self._sslobj:
Bill Janssen980f3142008-06-29 00:05:51 +0000820 raise ValueError("sendto not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000821 self.__class__)
Antoine Pitroua468adc2010-09-14 14:43:44 +0000822 elif addr is None:
823 return socket.sendto(self, data, flags_or_addr)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000824 else:
Antoine Pitroua468adc2010-09-14 14:43:44 +0000825 return socket.sendto(self, data, flags_or_addr, addr)
Thomas Woutersed03b412007-08-28 21:37:11 +0000826
Nick Coghlan513886a2011-08-28 00:00:27 +1000827 def sendmsg(self, *args, **kwargs):
828 # Ensure programs don't send data unencrypted if they try to
829 # use this method.
830 raise NotImplementedError("sendmsg not allowed on instances of %s" %
831 self.__class__)
832
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000833 def sendall(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000834 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000835 if self._sslobj:
Giampaolo Rodolà374f8352010-08-29 12:08:09 +0000836 if flags != 0:
837 raise ValueError(
838 "non-zero flags not allowed in calls to sendall() on %s" %
839 self.__class__)
Bill Janssen6e027db2007-11-15 22:23:56 +0000840 amount = len(data)
841 count = 0
842 while (count < amount):
843 v = self.send(data[count:])
844 count += v
845 return amount
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000846 else:
847 return socket.sendall(self, data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000848
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200849 def sendfile(self, file, offset=0, count=None):
850 """Send a file, possibly by using os.sendfile() if this is a
851 clear-text socket. Return the total number of bytes sent.
852 """
853 if self._sslobj is None:
854 # os.sendfile() works with plain sockets only
855 return super().sendfile(file, offset, count)
856 else:
857 return self._sendfile_use_send(file, offset, count)
858
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000859 def recv(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000860 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000861 if self._sslobj:
862 if flags != 0:
863 raise ValueError(
Antoine Pitrou5733c082010-03-22 14:49:10 +0000864 "non-zero flags not allowed in calls to recv() on %s" %
865 self.__class__)
866 return self.read(buflen)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000867 else:
868 return socket.recv(self, buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000869
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000870 def recv_into(self, buffer, nbytes=None, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000871 self._checkClosed()
872 if buffer and (nbytes is None):
873 nbytes = len(buffer)
874 elif nbytes is None:
875 nbytes = 1024
876 if self._sslobj:
877 if flags != 0:
878 raise ValueError(
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000879 "non-zero flags not allowed in calls to recv_into() on %s" %
880 self.__class__)
Antoine Pitrou5733c082010-03-22 14:49:10 +0000881 return self.read(nbytes, buffer)
Bill Janssen6e027db2007-11-15 22:23:56 +0000882 else:
883 return socket.recv_into(self, buffer, nbytes, flags)
884
Antoine Pitroua468adc2010-09-14 14:43:44 +0000885 def recvfrom(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000886 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000887 if self._sslobj:
Bill Janssen980f3142008-06-29 00:05:51 +0000888 raise ValueError("recvfrom not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000889 self.__class__)
890 else:
Antoine Pitroua468adc2010-09-14 14:43:44 +0000891 return socket.recvfrom(self, buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000892
Bill Janssen58afe4c2008-09-08 16:45:19 +0000893 def recvfrom_into(self, buffer, nbytes=None, flags=0):
894 self._checkClosed()
895 if self._sslobj:
896 raise ValueError("recvfrom_into not allowed on instances of %s" %
897 self.__class__)
898 else:
899 return socket.recvfrom_into(self, buffer, nbytes, flags)
900
Nick Coghlan513886a2011-08-28 00:00:27 +1000901 def recvmsg(self, *args, **kwargs):
902 raise NotImplementedError("recvmsg not allowed on instances of %s" %
903 self.__class__)
904
905 def recvmsg_into(self, *args, **kwargs):
906 raise NotImplementedError("recvmsg_into not allowed on instances of "
907 "%s" % self.__class__)
908
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000909 def pending(self):
Bill Janssen6e027db2007-11-15 22:23:56 +0000910 self._checkClosed()
911 if self._sslobj:
912 return self._sslobj.pending()
913 else:
914 return 0
915
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000916 def shutdown(self, how):
Bill Janssen6e027db2007-11-15 22:23:56 +0000917 self._checkClosed()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000918 self._sslobj = None
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000919 socket.shutdown(self, how)
Thomas Woutersed03b412007-08-28 21:37:11 +0000920
Ezio Melottidc55e672010-01-18 09:15:14 +0000921 def unwrap(self):
Bill Janssen40a0f662008-08-12 16:56:25 +0000922 if self._sslobj:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200923 s = self._sslobj.unwrap()
Bill Janssen40a0f662008-08-12 16:56:25 +0000924 self._sslobj = None
925 return s
926 else:
927 raise ValueError("No SSL wrapper around " + str(self))
928
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000929 def _real_close(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000930 self._sslobj = None
Bill Janssen54cc54c2007-12-14 22:08:56 +0000931 socket._real_close(self)
Bill Janssen6e027db2007-11-15 22:23:56 +0000932
Bill Janssen48dc27c2007-12-05 03:38:10 +0000933 def do_handshake(self, block=False):
Bill Janssen6e027db2007-11-15 22:23:56 +0000934 """Perform a TLS/SSL handshake."""
Antoine Pitrou242db722013-05-01 20:52:07 +0200935 self._check_connected()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000936 timeout = self.gettimeout()
Bill Janssen6e027db2007-11-15 22:23:56 +0000937 try:
Bill Janssen48dc27c2007-12-05 03:38:10 +0000938 if timeout == 0.0 and block:
939 self.settimeout(None)
Bill Janssen6e027db2007-11-15 22:23:56 +0000940 self._sslobj.do_handshake()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000941 finally:
942 self.settimeout(timeout)
Thomas Woutersed03b412007-08-28 21:37:11 +0000943
Antoine Pitroub4410db2011-05-18 18:51:06 +0200944 def _real_connect(self, addr, connect_ex):
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000945 if self.server_side:
946 raise ValueError("can't connect in server-side mode")
Thomas Woutersed03b412007-08-28 21:37:11 +0000947 # Here we assume that the socket is client-side, and not
948 # connected at the time of the call. We connect it, then wrap it.
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000949 if self._connected:
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000950 raise ValueError("attempt to connect already-connected SSLSocket!")
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200951 sslobj = self.context._wrap_socket(self, False, self.server_hostname)
952 self._sslobj = SSLObject(sslobj, owner=self)
Bill Janssen54cc54c2007-12-14 22:08:56 +0000953 try:
Antoine Pitroub4410db2011-05-18 18:51:06 +0200954 if connect_ex:
955 rc = socket.connect_ex(self, addr)
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000956 else:
Antoine Pitroub4410db2011-05-18 18:51:06 +0200957 rc = None
958 socket.connect(self, addr)
959 if not rc:
Antoine Pitrou242db722013-05-01 20:52:07 +0200960 self._connected = True
Antoine Pitroub4410db2011-05-18 18:51:06 +0200961 if self.do_handshake_on_connect:
962 self.do_handshake()
Antoine Pitroub4410db2011-05-18 18:51:06 +0200963 return rc
Christian Heimes1aa9a752013-12-02 02:41:19 +0100964 except (OSError, ValueError):
Antoine Pitroub4410db2011-05-18 18:51:06 +0200965 self._sslobj = None
966 raise
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000967
968 def connect(self, addr):
969 """Connects to remote ADDR, and then wraps the connection in
970 an SSL channel."""
971 self._real_connect(addr, False)
972
973 def connect_ex(self, addr):
974 """Connects to remote ADDR, and then wraps the connection in
975 an SSL channel."""
976 return self._real_connect(addr, True)
Thomas Woutersed03b412007-08-28 21:37:11 +0000977
978 def accept(self):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000979 """Accepts a new connection from a remote client, and returns
980 a tuple containing that new connection wrapped with a server-side
981 SSL channel, and the address of the remote client."""
982
983 newsock, addr = socket.accept(self)
Antoine Pitrou5c89b4e2012-11-11 01:25:36 +0100984 newsock = self.context.wrap_socket(newsock,
985 do_handshake_on_connect=self.do_handshake_on_connect,
986 suppress_ragged_eofs=self.suppress_ragged_eofs,
987 server_side=True)
988 return newsock, addr
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000989
Antoine Pitroud6494802011-07-21 01:11:30 +0200990 def get_channel_binding(self, cb_type="tls-unique"):
991 """Get channel binding data for current connection. Raise ValueError
992 if the requested `cb_type` is not supported. Return bytes of the data
993 or None if the data is not available (e.g. before the handshake).
994 """
Antoine Pitroud6494802011-07-21 01:11:30 +0200995 if self._sslobj is None:
996 return None
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200997 return self._sslobj.get_channel_binding(cb_type)
Antoine Pitroud6494802011-07-21 01:11:30 +0200998
Antoine Pitrou47e40422014-09-04 21:00:10 +0200999 def version(self):
1000 """
1001 Return a string identifying the protocol version used by the
1002 current SSL channel, or None if there is no established channel.
1003 """
1004 if self._sslobj is None:
1005 return None
1006 return self._sslobj.version()
1007
Bill Janssen54cc54c2007-12-14 22:08:56 +00001008
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001009def wrap_socket(sock, keyfile=None, certfile=None,
1010 server_side=False, cert_reqs=CERT_NONE,
Bill Janssen6e027db2007-11-15 22:23:56 +00001011 ssl_version=PROTOCOL_SSLv23, ca_certs=None,
Bill Janssen48dc27c2007-12-05 03:38:10 +00001012 do_handshake_on_connect=True,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001013 suppress_ragged_eofs=True,
1014 ciphers=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001015
Bill Janssen6e027db2007-11-15 22:23:56 +00001016 return SSLSocket(sock=sock, keyfile=keyfile, certfile=certfile,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001017 server_side=server_side, cert_reqs=cert_reqs,
Bill Janssen6e027db2007-11-15 22:23:56 +00001018 ssl_version=ssl_version, ca_certs=ca_certs,
Bill Janssen48dc27c2007-12-05 03:38:10 +00001019 do_handshake_on_connect=do_handshake_on_connect,
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +00001020 suppress_ragged_eofs=suppress_ragged_eofs,
1021 ciphers=ciphers)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001022
Thomas Woutersed03b412007-08-28 21:37:11 +00001023# some utility functions
1024
1025def cert_time_to_seconds(cert_time):
Antoine Pitrouc695c952014-04-28 20:57:36 +02001026 """Return the time in seconds since the Epoch, given the timestring
1027 representing the "notBefore" or "notAfter" date from a certificate
1028 in ``"%b %d %H:%M:%S %Y %Z"`` strptime format (C locale).
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001029
Antoine Pitrouc695c952014-04-28 20:57:36 +02001030 "notBefore" or "notAfter" dates must use UTC (RFC 5280).
1031
1032 Month is one of: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1033 UTC should be specified as GMT (see ASN1_TIME_print())
1034 """
1035 from time import strptime
1036 from calendar import timegm
1037
1038 months = (
1039 "Jan","Feb","Mar","Apr","May","Jun",
1040 "Jul","Aug","Sep","Oct","Nov","Dec"
1041 )
1042 time_format = ' %d %H:%M:%S %Y GMT' # NOTE: no month, fixed GMT
1043 try:
1044 month_number = months.index(cert_time[:3].title()) + 1
1045 except ValueError:
1046 raise ValueError('time data %r does not match '
1047 'format "%%b%s"' % (cert_time, time_format))
1048 else:
1049 # found valid month
1050 tt = strptime(cert_time[3:], time_format)
1051 # return an integer, the previous mktime()-based implementation
1052 # returned a float (fractional seconds are always zero here).
1053 return timegm((tt[0], month_number) + tt[2:6])
Thomas Woutersed03b412007-08-28 21:37:11 +00001054
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001055PEM_HEADER = "-----BEGIN CERTIFICATE-----"
1056PEM_FOOTER = "-----END CERTIFICATE-----"
1057
1058def DER_cert_to_PEM_cert(der_cert_bytes):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001059 """Takes a certificate in binary DER format and returns the
1060 PEM version of it as a string."""
1061
Bill Janssen6e027db2007-11-15 22:23:56 +00001062 f = str(base64.standard_b64encode(der_cert_bytes), 'ASCII', 'strict')
1063 return (PEM_HEADER + '\n' +
1064 textwrap.fill(f, 64) + '\n' +
1065 PEM_FOOTER + '\n')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001066
1067def PEM_cert_to_DER_cert(pem_cert_string):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001068 """Takes a certificate in ASCII PEM format and returns the
1069 DER-encoded version of it as a byte sequence"""
1070
1071 if not pem_cert_string.startswith(PEM_HEADER):
1072 raise ValueError("Invalid PEM encoding; must start with %s"
1073 % PEM_HEADER)
1074 if not pem_cert_string.strip().endswith(PEM_FOOTER):
1075 raise ValueError("Invalid PEM encoding; must end with %s"
1076 % PEM_FOOTER)
1077 d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
Georg Brandl706824f2009-06-04 09:42:55 +00001078 return base64.decodebytes(d.encode('ASCII', 'strict'))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001079
Antoine Pitrou94a5b662014-04-16 18:56:28 +02001080def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001081 """Retrieve the certificate from the server at the specified address,
1082 and return it as a PEM-encoded string.
1083 If 'ca_certs' is specified, validate the server cert against it.
1084 If 'ssl_version' is specified, use it in the connection attempt."""
1085
1086 host, port = addr
Christian Heimes67986f92013-11-23 22:43:47 +01001087 if ca_certs is not None:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001088 cert_reqs = CERT_REQUIRED
1089 else:
1090 cert_reqs = CERT_NONE
Christian Heimes67986f92013-11-23 22:43:47 +01001091 context = _create_stdlib_context(ssl_version,
1092 cert_reqs=cert_reqs,
1093 cafile=ca_certs)
1094 with create_connection(addr) as sock:
1095 with context.wrap_socket(sock) as sslsock:
1096 dercert = sslsock.getpeercert(True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001097 return DER_cert_to_PEM_cert(dercert)
1098
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001099def get_protocol_name(protocol_code):
Victor Stinner3de49192011-05-09 00:42:58 +02001100 return _PROTOCOL_NAMES.get(protocol_code, '<unknown>')