blob: 2ea51112ed314f33e66b857c3e8950dbc6942ed5 [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
Christian Heimes598894f2016-09-05 23:19:05 +020054PROTOCOL_TLS
Thomas Woutersed03b412007-08-28 21:37:11 +000055PROTOCOL_TLSv1
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010056PROTOCOL_TLSv1_1
57PROTOCOL_TLSv1_2
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +010058
59The following constants identify various SSL alert message descriptions as per
60http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6
61
62ALERT_DESCRIPTION_CLOSE_NOTIFY
63ALERT_DESCRIPTION_UNEXPECTED_MESSAGE
64ALERT_DESCRIPTION_BAD_RECORD_MAC
65ALERT_DESCRIPTION_RECORD_OVERFLOW
66ALERT_DESCRIPTION_DECOMPRESSION_FAILURE
67ALERT_DESCRIPTION_HANDSHAKE_FAILURE
68ALERT_DESCRIPTION_BAD_CERTIFICATE
69ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE
70ALERT_DESCRIPTION_CERTIFICATE_REVOKED
71ALERT_DESCRIPTION_CERTIFICATE_EXPIRED
72ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN
73ALERT_DESCRIPTION_ILLEGAL_PARAMETER
74ALERT_DESCRIPTION_UNKNOWN_CA
75ALERT_DESCRIPTION_ACCESS_DENIED
76ALERT_DESCRIPTION_DECODE_ERROR
77ALERT_DESCRIPTION_DECRYPT_ERROR
78ALERT_DESCRIPTION_PROTOCOL_VERSION
79ALERT_DESCRIPTION_INSUFFICIENT_SECURITY
80ALERT_DESCRIPTION_INTERNAL_ERROR
81ALERT_DESCRIPTION_USER_CANCELLED
82ALERT_DESCRIPTION_NO_RENEGOTIATION
83ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION
84ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
85ALERT_DESCRIPTION_UNRECOGNIZED_NAME
86ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE
87ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE
88ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY
Thomas Woutersed03b412007-08-28 21:37:11 +000089"""
90
Antoine Pitrouc481bfb2015-02-15 18:12:20 +010091import ipaddress
Christian Heimes05e8be12008-02-23 18:30:17 +000092import textwrap
Antoine Pitrou59fdd672010-10-08 10:37:08 +000093import re
Christian Heimes46bebee2013-06-09 19:03:31 +020094import sys
Christian Heimes6d7ad132013-06-09 18:02:55 +020095import os
Christian Heimesa6bc95a2013-11-17 19:59:14 +010096from collections import namedtuple
Antoine Pitrou172f0252014-04-18 20:33:08 +020097from enum import Enum as _Enum, IntEnum as _IntEnum
Thomas Woutersed03b412007-08-28 21:37:11 +000098
99import _ssl # if we can't import it, let the error propagate
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000100
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000101from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200102from _ssl import _SSLContext, MemoryBIO
Antoine Pitrou41032a62011-10-27 23:56:55 +0200103from _ssl import (
104 SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
105 SSLSyscallError, SSLEOFError,
106 )
Thomas Woutersed03b412007-08-28 21:37:11 +0000107from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
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_')
Benjamin Peterson7bcf9a52015-03-04 23:18:57 -0500124_import_symbols('VERIFY_')
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100125
Benjamin Petersoncca27322015-01-23 16:35:37 -0500126from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100127
Antoine Pitroub9ac25d2011-07-08 18:47:06 +0200128from _ssl import _OPENSSL_API_VERSION
129
Ethan Furman24e837f2015-03-18 17:27:57 -0700130_IntEnum._convert(
131 '_SSLMethod', __name__,
Christian Heimes598894f2016-09-05 23:19:05 +0200132 lambda name: name.startswith('PROTOCOL_') and name != 'PROTOCOL_SSLv23',
Ethan Furman24e837f2015-03-18 17:27:57 -0700133 source=_ssl)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100134
Christian Heimes598894f2016-09-05 23:19:05 +0200135PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
Antoine Pitrou172f0252014-04-18 20:33:08 +0200136_PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
137
Victor Stinner3de49192011-05-09 00:42:58 +0200138try:
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100139 _SSLv2_IF_EXISTS = PROTOCOL_SSLv2
Antoine Pitrou172f0252014-04-18 20:33:08 +0200140except NameError:
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100141 _SSLv2_IF_EXISTS = None
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100142
Christian Heimes46bebee2013-06-09 19:03:31 +0200143if sys.platform == "win32":
Christian Heimes44109d72013-11-22 01:51:30 +0100144 from _ssl import enum_certificates, enum_crls
Christian Heimes46bebee2013-06-09 19:03:31 +0200145
Antoine Pitrou15399c32011-04-28 19:23:55 +0200146from socket import socket, AF_INET, SOCK_STREAM, create_connection
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100147from socket import SOL_SOCKET, SO_TYPE
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000148import base64 # for DER-to-PEM translation
Antoine Pitroude8cf322010-04-26 17:29:05 +0000149import errno
Steve Dower33bc4a22016-05-26 12:18:12 -0700150import warnings
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000151
Andrew Svetlov0832af62012-12-18 23:10:48 +0200152
153socket_error = OSError # keep that public name in module namespace
154
Antoine Pitroud6494802011-07-21 01:11:30 +0200155if _ssl.HAS_TLS_UNIQUE:
156 CHANNEL_BINDING_TYPES = ['tls-unique']
157else:
158 CHANNEL_BINDING_TYPES = []
Thomas Woutersed03b412007-08-28 21:37:11 +0000159
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100160# Disable weak or insecure ciphers by default
161# (OpenSSL's default setting is 'DEFAULT:!aNULL:!eNULL')
Donald Stufft79ccaa22014-03-21 21:33:34 -0400162# Enable a better set of ciphers by default
163# This list has been explicitly chosen to:
164# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
165# * Prefer ECDHE over DHE for better performance
166# * Prefer any AES-GCM over any AES-CBC for better performance and security
167# * Then Use HIGH cipher suites as a fallback
168# * Then Use 3DES as fallback which is secure but slow
Donald Stufft79ccaa22014-03-21 21:33:34 -0400169# * Disable NULL authentication, NULL encryption, and MD5 MACs for security
170# reasons
171_DEFAULT_CIPHERS = (
172 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
Benjamin Peterson500af332015-02-19 17:57:08 -0500173 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
174 '!eNULL:!MD5'
Donald Stufft79ccaa22014-03-21 21:33:34 -0400175)
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100176
Donald Stufft6a2ba942014-03-23 19:05:28 -0400177# Restricted and more secure ciphers for the server side
Donald Stufft79ccaa22014-03-21 21:33:34 -0400178# This list has been explicitly chosen to:
179# * Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE)
180# * Prefer ECDHE over DHE for better performance
181# * Prefer any AES-GCM over any AES-CBC for better performance and security
182# * Then Use HIGH cipher suites as a fallback
183# * Then Use 3DES as fallback which is secure but slow
184# * Disable NULL authentication, NULL encryption, MD5 MACs, DSS, and RC4 for
185# security reasons
Donald Stufft6a2ba942014-03-23 19:05:28 -0400186_RESTRICTED_SERVER_CIPHERS = (
Donald Stufft79ccaa22014-03-21 21:33:34 -0400187 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
188 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
189 '!eNULL:!MD5:!DSS:!RC4'
190)
Christian Heimes4c05b472013-11-23 15:58:30 +0100191
Thomas Woutersed03b412007-08-28 21:37:11 +0000192
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000193class CertificateError(ValueError):
194 pass
195
196
Georg Brandl72c98d32013-10-27 07:16:53 +0100197def _dnsname_match(dn, hostname, max_wildcards=1):
198 """Matching according to RFC 6125, section 6.4.3
199
200 http://tools.ietf.org/html/rfc6125#section-6.4.3
201 """
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000202 pats = []
Georg Brandl72c98d32013-10-27 07:16:53 +0100203 if not dn:
204 return False
205
206 leftmost, *remainder = dn.split(r'.')
207
208 wildcards = leftmost.count('*')
209 if wildcards > max_wildcards:
210 # Issue #17980: avoid denials of service by refusing more
Berker Peksagf23530f2014-10-19 18:04:38 +0300211 # than one wildcard per fragment. A survey of established
Georg Brandl72c98d32013-10-27 07:16:53 +0100212 # policy among SSL implementations showed it to be a
213 # reasonable choice.
214 raise CertificateError(
215 "too many wildcards in certificate DNS name: " + repr(dn))
216
217 # speed up common case w/o wildcards
218 if not wildcards:
219 return dn.lower() == hostname.lower()
220
221 # RFC 6125, section 6.4.3, subitem 1.
222 # The client SHOULD NOT attempt to match a presented identifier in which
223 # the wildcard character comprises a label other than the left-most label.
224 if leftmost == '*':
225 # When '*' is a fragment by itself, it matches a non-empty dotless
226 # fragment.
227 pats.append('[^.]+')
228 elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
229 # RFC 6125, section 6.4.3, subitem 3.
230 # The client SHOULD NOT attempt to match a presented identifier
231 # where the wildcard character is embedded within an A-label or
232 # U-label of an internationalized domain name.
233 pats.append(re.escape(leftmost))
234 else:
235 # Otherwise, '*' matches any dotless string, e.g. www*
236 pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))
237
238 # add the remaining fragments, ignore any wildcards
239 for frag in remainder:
240 pats.append(re.escape(frag))
241
242 pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
243 return pat.match(hostname)
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000244
245
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100246def _ipaddress_match(ipname, host_ip):
247 """Exact matching of IP addresses.
248
249 RFC 6125 explicitly doesn't define an algorithm for this
250 (section 1.7.2 - "Out of Scope").
251 """
252 # OpenSSL may add a trailing newline to a subjectAltName's IP address
253 ip = ipaddress.ip_address(ipname.rstrip())
254 return ip == host_ip
255
256
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000257def match_hostname(cert, hostname):
258 """Verify that *cert* (in decoded format as returned by
Georg Brandl72c98d32013-10-27 07:16:53 +0100259 SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
260 rules are followed, but IP addresses are not accepted for *hostname*.
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000261
262 CertificateError is raised on failure. On success, the function
263 returns nothing.
264 """
265 if not cert:
Christian Heimes1aa9a752013-12-02 02:41:19 +0100266 raise ValueError("empty or no certificate, match_hostname needs a "
267 "SSL socket or SSL context with either "
268 "CERT_OPTIONAL or CERT_REQUIRED")
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100269 try:
270 host_ip = ipaddress.ip_address(hostname)
271 except ValueError:
272 # Not an IP address (common case)
273 host_ip = None
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000274 dnsnames = []
275 san = cert.get('subjectAltName', ())
276 for key, value in san:
277 if key == 'DNS':
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100278 if host_ip is None and _dnsname_match(value, hostname):
279 return
280 dnsnames.append(value)
281 elif key == 'IP Address':
282 if host_ip is not None and _ipaddress_match(value, host_ip):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000283 return
284 dnsnames.append(value)
Antoine Pitrou1c86b442011-05-06 15:19:49 +0200285 if not dnsnames:
286 # The subject is only checked when there is no dNSName entry
287 # in subjectAltName
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000288 for sub in cert.get('subject', ()):
289 for key, value in sub:
290 # XXX according to RFC 2818, the most specific Common Name
291 # must be used.
292 if key == 'commonName':
Georg Brandl72c98d32013-10-27 07:16:53 +0100293 if _dnsname_match(value, hostname):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000294 return
295 dnsnames.append(value)
296 if len(dnsnames) > 1:
297 raise CertificateError("hostname %r "
298 "doesn't match either of %s"
299 % (hostname, ', '.join(map(repr, dnsnames))))
300 elif len(dnsnames) == 1:
301 raise CertificateError("hostname %r "
302 "doesn't match %r"
303 % (hostname, dnsnames[0]))
304 else:
305 raise CertificateError("no appropriate commonName or "
306 "subjectAltName fields were found")
307
308
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100309DefaultVerifyPaths = namedtuple("DefaultVerifyPaths",
Christian Heimes6d7ad132013-06-09 18:02:55 +0200310 "cafile capath openssl_cafile_env openssl_cafile openssl_capath_env "
311 "openssl_capath")
312
313def get_default_verify_paths():
314 """Return paths to default cafile and capath.
315 """
316 parts = _ssl.get_default_verify_paths()
317
318 # environment vars shadow paths
319 cafile = os.environ.get(parts[0], parts[1])
320 capath = os.environ.get(parts[2], parts[3])
321
322 return DefaultVerifyPaths(cafile if os.path.isfile(cafile) else None,
323 capath if os.path.isdir(capath) else None,
324 *parts)
325
326
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100327class _ASN1Object(namedtuple("_ASN1Object", "nid shortname longname oid")):
328 """ASN.1 object identifier lookup
329 """
330 __slots__ = ()
331
332 def __new__(cls, oid):
333 return super().__new__(cls, *_txt2obj(oid, name=False))
334
335 @classmethod
336 def fromnid(cls, nid):
337 """Create _ASN1Object from OpenSSL numeric ID
338 """
339 return super().__new__(cls, *_nid2obj(nid))
340
341 @classmethod
342 def fromname(cls, name):
343 """Create _ASN1Object from short name, long name or OID
344 """
345 return super().__new__(cls, *_txt2obj(name, name=True))
346
347
Christian Heimes72d28502013-11-23 13:56:58 +0100348class Purpose(_ASN1Object, _Enum):
349 """SSLContext purpose flags with X509v3 Extended Key Usage objects
350 """
351 SERVER_AUTH = '1.3.6.1.5.5.7.3.1'
352 CLIENT_AUTH = '1.3.6.1.5.5.7.3.2'
353
354
Antoine Pitrou152efa22010-05-16 18:19:27 +0000355class SSLContext(_SSLContext):
356 """An SSLContext holds various SSL-related configuration options and
357 data, such as certificates and possibly a private key."""
358
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100359 __slots__ = ('protocol', '__weakref__')
Christian Heimes72d28502013-11-23 13:56:58 +0100360 _windows_cert_stores = ("CA", "ROOT")
Antoine Pitrou152efa22010-05-16 18:19:27 +0000361
Christian Heimes598894f2016-09-05 23:19:05 +0200362 def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100363 self = _SSLContext.__new__(cls, protocol)
364 if protocol != _SSLv2_IF_EXISTS:
365 self.set_ciphers(_DEFAULT_CIPHERS)
366 return self
Antoine Pitrou152efa22010-05-16 18:19:27 +0000367
Christian Heimes598894f2016-09-05 23:19:05 +0200368 def __init__(self, protocol=PROTOCOL_TLS):
Antoine Pitrou152efa22010-05-16 18:19:27 +0000369 self.protocol = protocol
370
371 def wrap_socket(self, sock, server_side=False,
372 do_handshake_on_connect=True,
Antoine Pitroud5323212010-10-22 18:19:07 +0000373 suppress_ragged_eofs=True,
374 server_hostname=None):
Antoine Pitrou152efa22010-05-16 18:19:27 +0000375 return SSLSocket(sock=sock, server_side=server_side,
376 do_handshake_on_connect=do_handshake_on_connect,
377 suppress_ragged_eofs=suppress_ragged_eofs,
Antoine Pitroud5323212010-10-22 18:19:07 +0000378 server_hostname=server_hostname,
Antoine Pitrou152efa22010-05-16 18:19:27 +0000379 _context=self)
380
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200381 def wrap_bio(self, incoming, outgoing, server_side=False,
382 server_hostname=None):
383 sslobj = self._wrap_bio(incoming, outgoing, server_side=server_side,
384 server_hostname=server_hostname)
385 return SSLObject(sslobj)
386
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100387 def set_npn_protocols(self, npn_protocols):
388 protos = bytearray()
389 for protocol in npn_protocols:
390 b = bytes(protocol, 'ascii')
391 if len(b) == 0 or len(b) > 255:
392 raise SSLError('NPN protocols must be 1 to 255 in length')
393 protos.append(len(b))
394 protos.extend(b)
395
396 self._set_npn_protocols(protos)
397
Benjamin Petersoncca27322015-01-23 16:35:37 -0500398 def set_alpn_protocols(self, alpn_protocols):
399 protos = bytearray()
400 for protocol in alpn_protocols:
401 b = bytes(protocol, 'ascii')
402 if len(b) == 0 or len(b) > 255:
403 raise SSLError('ALPN protocols must be 1 to 255 in length')
404 protos.append(len(b))
405 protos.extend(b)
406
407 self._set_alpn_protocols(protos)
408
Christian Heimes72d28502013-11-23 13:56:58 +0100409 def _load_windows_store_certs(self, storename, purpose):
410 certs = bytearray()
Steve Dower33bc4a22016-05-26 12:18:12 -0700411 try:
412 for cert, encoding, trust in enum_certificates(storename):
413 # CA certs are never PKCS#7 encoded
414 if encoding == "x509_asn":
415 if trust is True or purpose.oid in trust:
416 certs.extend(cert)
417 except PermissionError:
418 warnings.warn("unable to enumerate Windows certificate store")
Steve Dower8dd7aeb2016-03-17 15:02:39 -0700419 if certs:
420 self.load_verify_locations(cadata=certs)
Christian Heimes72d28502013-11-23 13:56:58 +0100421 return certs
422
423 def load_default_certs(self, purpose=Purpose.SERVER_AUTH):
424 if not isinstance(purpose, _ASN1Object):
425 raise TypeError(purpose)
426 if sys.platform == "win32":
427 for storename in self._windows_cert_stores:
428 self._load_windows_store_certs(storename, purpose)
Benjamin Peterson5915b0f2014-10-03 17:27:05 -0400429 self.set_default_verify_paths()
Christian Heimes72d28502013-11-23 13:56:58 +0100430
Antoine Pitrou152efa22010-05-16 18:19:27 +0000431
Christian Heimes4c05b472013-11-23 15:58:30 +0100432def create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None,
433 capath=None, cadata=None):
434 """Create a SSLContext object with default settings.
435
436 NOTE: The protocol and settings may change anytime without prior
437 deprecation. The values represent a fair balance between maximum
438 compatibility and security.
439 """
440 if not isinstance(purpose, _ASN1Object):
441 raise TypeError(purpose)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400442
Christian Heimes598894f2016-09-05 23:19:05 +0200443 context = SSLContext(PROTOCOL_TLS)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400444
Christian Heimes4c05b472013-11-23 15:58:30 +0100445 # SSLv2 considered harmful.
446 context.options |= OP_NO_SSLv2
Donald Stufft6a2ba942014-03-23 19:05:28 -0400447
448 # SSLv3 has problematic security and is only required for really old
449 # clients such as IE6 on Windows XP
450 context.options |= OP_NO_SSLv3
451
Christian Heimesdec813f2013-11-28 08:06:54 +0100452 # disable compression to prevent CRIME attacks (OpenSSL 1.0+)
453 context.options |= getattr(_ssl, "OP_NO_COMPRESSION", 0)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400454
Christian Heimes4c05b472013-11-23 15:58:30 +0100455 if purpose == Purpose.SERVER_AUTH:
Donald Stufft6a2ba942014-03-23 19:05:28 -0400456 # verify certs and host name in client mode
Christian Heimes4c05b472013-11-23 15:58:30 +0100457 context.verify_mode = CERT_REQUIRED
Christian Heimes1aa9a752013-12-02 02:41:19 +0100458 context.check_hostname = True
Donald Stufft6a2ba942014-03-23 19:05:28 -0400459 elif purpose == Purpose.CLIENT_AUTH:
460 # Prefer the server's ciphers by default so that we get stronger
461 # encryption
462 context.options |= getattr(_ssl, "OP_CIPHER_SERVER_PREFERENCE", 0)
463
464 # Use single use keys in order to improve forward secrecy
465 context.options |= getattr(_ssl, "OP_SINGLE_DH_USE", 0)
466 context.options |= getattr(_ssl, "OP_SINGLE_ECDH_USE", 0)
467
468 # disallow ciphers with known vulnerabilities
469 context.set_ciphers(_RESTRICTED_SERVER_CIPHERS)
470
Christian Heimes4c05b472013-11-23 15:58:30 +0100471 if cafile or capath or cadata:
472 context.load_verify_locations(cafile, capath, cadata)
473 elif context.verify_mode != CERT_NONE:
474 # no explicit cafile, capath or cadata but the verify mode is
475 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
476 # root CA certificates for the given purpose. This may fail silently.
477 context.load_default_certs(purpose)
478 return context
479
Christian Heimes598894f2016-09-05 23:19:05 +0200480def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=None,
Christian Heimesa02c69a2013-12-02 20:59:28 +0100481 check_hostname=False, purpose=Purpose.SERVER_AUTH,
Christian Heimes67986f92013-11-23 22:43:47 +0100482 certfile=None, keyfile=None,
483 cafile=None, capath=None, cadata=None):
484 """Create a SSLContext object for Python stdlib modules
485
486 All Python stdlib modules shall use this function to create SSLContext
487 objects in order to keep common settings in one place. The configuration
488 is less restrict than create_default_context()'s to increase backward
489 compatibility.
490 """
491 if not isinstance(purpose, _ASN1Object):
492 raise TypeError(purpose)
493
494 context = SSLContext(protocol)
495 # SSLv2 considered harmful.
496 context.options |= OP_NO_SSLv2
Antoine Pitroue4eda4d2014-10-17 19:28:30 +0200497 # SSLv3 has problematic security and is only required for really old
498 # clients such as IE6 on Windows XP
499 context.options |= OP_NO_SSLv3
Christian Heimes67986f92013-11-23 22:43:47 +0100500
501 if cert_reqs is not None:
502 context.verify_mode = cert_reqs
Christian Heimesa02c69a2013-12-02 20:59:28 +0100503 context.check_hostname = check_hostname
Christian Heimes67986f92013-11-23 22:43:47 +0100504
505 if keyfile and not certfile:
506 raise ValueError("certfile must be specified")
507 if certfile or keyfile:
508 context.load_cert_chain(certfile, keyfile)
509
510 # load CA root certs
511 if cafile or capath or cadata:
512 context.load_verify_locations(cafile, capath, cadata)
513 elif context.verify_mode != CERT_NONE:
514 # no explicit cafile, capath or cadata but the verify mode is
515 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
516 # root CA certificates for the given purpose. This may fail silently.
517 context.load_default_certs(purpose)
518
519 return context
520
Benjamin Peterson4ffb0752014-11-03 14:29:33 -0500521# Used by http.client if no context is explicitly passed.
522_create_default_https_context = create_default_context
523
524
525# Backwards compatibility alias, even though it's not a public name.
526_create_stdlib_context = _create_unverified_context
527
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200528
529class SSLObject:
530 """This class implements an interface on top of a low-level SSL object as
531 implemented by OpenSSL. This object captures the state of an SSL connection
532 but does not provide any network IO itself. IO needs to be performed
533 through separate "BIO" objects which are OpenSSL's IO abstraction layer.
534
535 This class does not have a public constructor. Instances are returned by
536 ``SSLContext.wrap_bio``. This class is typically used by framework authors
537 that want to implement asynchronous IO for SSL through memory buffers.
538
539 When compared to ``SSLSocket``, this object lacks the following features:
540
541 * Any form of network IO incluging methods such as ``recv`` and ``send``.
542 * The ``do_handshake_on_connect`` and ``suppress_ragged_eofs`` machinery.
543 """
544
545 def __init__(self, sslobj, owner=None):
546 self._sslobj = sslobj
547 # Note: _sslobj takes a weak reference to owner
548 self._sslobj.owner = owner or self
549
550 @property
551 def context(self):
552 """The SSLContext that is currently in use."""
553 return self._sslobj.context
554
555 @context.setter
556 def context(self, ctx):
557 self._sslobj.context = ctx
558
559 @property
560 def server_side(self):
561 """Whether this is a server-side socket."""
562 return self._sslobj.server_side
563
564 @property
565 def server_hostname(self):
566 """The currently set server hostname (for SNI), or ``None`` if no
567 server hostame is set."""
568 return self._sslobj.server_hostname
569
Martin Panterf6b1d662016-03-28 00:22:09 +0000570 def read(self, len=1024, buffer=None):
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200571 """Read up to 'len' bytes from the SSL object and return them.
572
573 If 'buffer' is provided, read into this buffer and return the number of
574 bytes read.
575 """
576 if buffer is not None:
577 v = self._sslobj.read(len, buffer)
578 else:
Martin Panterf6b1d662016-03-28 00:22:09 +0000579 v = self._sslobj.read(len)
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200580 return v
581
582 def write(self, data):
583 """Write 'data' to the SSL object and return the number of bytes
584 written.
585
586 The 'data' argument must support the buffer interface.
587 """
588 return self._sslobj.write(data)
589
590 def getpeercert(self, binary_form=False):
591 """Returns a formatted version of the data in the certificate provided
592 by the other end of the SSL channel.
593
594 Return None if no certificate was provided, {} if a certificate was
595 provided, but not validated.
596 """
597 return self._sslobj.peer_certificate(binary_form)
598
599 def selected_npn_protocol(self):
600 """Return the currently selected NPN protocol as a string, or ``None``
601 if a next protocol was not negotiated or if NPN is not supported by one
602 of the peers."""
603 if _ssl.HAS_NPN:
604 return self._sslobj.selected_npn_protocol()
605
Benjamin Petersoncca27322015-01-23 16:35:37 -0500606 def selected_alpn_protocol(self):
607 """Return the currently selected ALPN protocol as a string, or ``None``
608 if a next protocol was not negotiated or if ALPN is not supported by one
609 of the peers."""
610 if _ssl.HAS_ALPN:
611 return self._sslobj.selected_alpn_protocol()
612
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200613 def cipher(self):
614 """Return the currently selected cipher as a 3-tuple ``(name,
615 ssl_version, secret_bits)``."""
616 return self._sslobj.cipher()
617
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600618 def shared_ciphers(self):
Benjamin Petersonc114e7d2015-01-11 15:22:07 -0500619 """Return a list of ciphers shared by the client during the handshake or
620 None if this is not a valid server connection.
Benjamin Peterson5318c7a2015-01-07 11:26:50 -0600621 """
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600622 return self._sslobj.shared_ciphers()
623
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200624 def compression(self):
625 """Return the current compression algorithm in use, or ``None`` if
626 compression was not negotiated or not supported by one of the peers."""
627 return self._sslobj.compression()
628
629 def pending(self):
630 """Return the number of bytes that can be read immediately."""
631 return self._sslobj.pending()
632
Antoine Pitrou3cb93792014-10-06 00:21:09 +0200633 def do_handshake(self):
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200634 """Start the SSL/TLS handshake."""
635 self._sslobj.do_handshake()
636 if self.context.check_hostname:
637 if not self.server_hostname:
638 raise ValueError("check_hostname needs server_hostname "
639 "argument")
640 match_hostname(self.getpeercert(), self.server_hostname)
641
642 def unwrap(self):
643 """Start the SSL shutdown handshake."""
644 return self._sslobj.shutdown()
645
646 def get_channel_binding(self, cb_type="tls-unique"):
647 """Get channel binding data for current connection. Raise ValueError
648 if the requested `cb_type` is not supported. Return bytes of the data
649 or None if the data is not available (e.g. before the handshake)."""
650 if cb_type not in CHANNEL_BINDING_TYPES:
651 raise ValueError("Unsupported channel binding type")
652 if cb_type != "tls-unique":
653 raise NotImplementedError(
654 "{0} channel binding type not implemented"
655 .format(cb_type))
656 return self._sslobj.tls_unique_cb()
657
658 def version(self):
659 """Return a string identifying the protocol version used by the
660 current SSL channel. """
661 return self._sslobj.version()
662
663
Antoine Pitrou152efa22010-05-16 18:19:27 +0000664class SSLSocket(socket):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000665 """This class implements a subtype of socket.socket that wraps
666 the underlying OS socket in an SSL context when necessary, and
667 provides read and write methods over that channel."""
668
Bill Janssen6e027db2007-11-15 22:23:56 +0000669 def __init__(self, sock=None, keyfile=None, certfile=None,
Thomas Woutersed03b412007-08-28 21:37:11 +0000670 server_side=False, cert_reqs=CERT_NONE,
Christian Heimes598894f2016-09-05 23:19:05 +0200671 ssl_version=PROTOCOL_TLS, ca_certs=None,
Bill Janssen6e027db2007-11-15 22:23:56 +0000672 do_handshake_on_connect=True,
673 family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100674 suppress_ragged_eofs=True, npn_protocols=None, ciphers=None,
Antoine Pitroud5323212010-10-22 18:19:07 +0000675 server_hostname=None,
Antoine Pitrou152efa22010-05-16 18:19:27 +0000676 _context=None):
Bill Janssen6e027db2007-11-15 22:23:56 +0000677
Antoine Pitrou152efa22010-05-16 18:19:27 +0000678 if _context:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100679 self._context = _context
Antoine Pitrou152efa22010-05-16 18:19:27 +0000680 else:
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000681 if server_side and not certfile:
682 raise ValueError("certfile must be specified for server-side "
683 "operations")
Giampaolo Rodolà8b7da622010-08-30 18:28:05 +0000684 if keyfile and not certfile:
685 raise ValueError("certfile must be specified")
Antoine Pitrou152efa22010-05-16 18:19:27 +0000686 if certfile and not keyfile:
687 keyfile = certfile
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100688 self._context = SSLContext(ssl_version)
689 self._context.verify_mode = cert_reqs
Antoine Pitrou152efa22010-05-16 18:19:27 +0000690 if ca_certs:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100691 self._context.load_verify_locations(ca_certs)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000692 if certfile:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100693 self._context.load_cert_chain(certfile, keyfile)
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100694 if npn_protocols:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100695 self._context.set_npn_protocols(npn_protocols)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000696 if ciphers:
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100697 self._context.set_ciphers(ciphers)
Antoine Pitrou152efa22010-05-16 18:19:27 +0000698 self.keyfile = keyfile
699 self.certfile = certfile
700 self.cert_reqs = cert_reqs
701 self.ssl_version = ssl_version
702 self.ca_certs = ca_certs
703 self.ciphers = ciphers
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100704 # Can't use sock.type as other flags (such as SOCK_NONBLOCK) get
705 # mixed in.
706 if sock.getsockopt(SOL_SOCKET, SO_TYPE) != SOCK_STREAM:
707 raise NotImplementedError("only stream sockets are supported")
Antoine Pitroud5323212010-10-22 18:19:07 +0000708 if server_side and server_hostname:
709 raise ValueError("server_hostname can only be specified "
710 "in client mode")
Christian Heimes1aa9a752013-12-02 02:41:19 +0100711 if self._context.check_hostname and not server_hostname:
Benjamin Peterson7243b572014-11-23 17:04:34 -0600712 raise ValueError("check_hostname requires server_hostname")
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000713 self.server_side = server_side
Antoine Pitroud5323212010-10-22 18:19:07 +0000714 self.server_hostname = server_hostname
Antoine Pitrou152efa22010-05-16 18:19:27 +0000715 self.do_handshake_on_connect = do_handshake_on_connect
716 self.suppress_ragged_eofs = suppress_ragged_eofs
Bill Janssen6e027db2007-11-15 22:23:56 +0000717 if sock is not None:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000718 socket.__init__(self,
719 family=sock.family,
720 type=sock.type,
721 proto=sock.proto,
Antoine Pitroue43f9d02010-08-08 23:24:50 +0000722 fileno=sock.fileno())
Antoine Pitrou40f08742010-04-24 22:04:40 +0000723 self.settimeout(sock.gettimeout())
Antoine Pitrou6e451df2010-08-09 20:39:54 +0000724 sock.detach()
Bill Janssen6e027db2007-11-15 22:23:56 +0000725 elif fileno is not None:
726 socket.__init__(self, fileno=fileno)
727 else:
728 socket.__init__(self, family=family, type=type, proto=proto)
729
Antoine Pitrou242db722013-05-01 20:52:07 +0200730 # See if we are connected
731 try:
732 self.getpeername()
733 except OSError as e:
734 if e.errno != errno.ENOTCONN:
735 raise
736 connected = False
737 else:
738 connected = True
739
Antoine Pitroufa2b9382010-04-26 22:17:47 +0000740 self._closed = False
741 self._sslobj = None
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000742 self._connected = connected
Antoine Pitroufa2b9382010-04-26 22:17:47 +0000743 if connected:
744 # create the SSL object
Bill Janssen6e027db2007-11-15 22:23:56 +0000745 try:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200746 sslobj = self._context._wrap_socket(self, server_side,
747 server_hostname)
748 self._sslobj = SSLObject(sslobj, owner=self)
Bill Janssen6e027db2007-11-15 22:23:56 +0000749 if do_handshake_on_connect:
Bill Janssen48dc27c2007-12-05 03:38:10 +0000750 timeout = self.gettimeout()
751 if timeout == 0.0:
752 # non-blocking
753 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
Bill Janssen6e027db2007-11-15 22:23:56 +0000754 self.do_handshake()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000755
Christian Heimes1aa9a752013-12-02 02:41:19 +0100756 except (OSError, ValueError):
Bill Janssen6e027db2007-11-15 22:23:56 +0000757 self.close()
Christian Heimes1aa9a752013-12-02 02:41:19 +0100758 raise
Antoine Pitrou242db722013-05-01 20:52:07 +0200759
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100760 @property
761 def context(self):
762 return self._context
763
764 @context.setter
765 def context(self, ctx):
766 self._context = ctx
767 self._sslobj.context = ctx
Bill Janssen6e027db2007-11-15 22:23:56 +0000768
Guido van Rossumb7b030e2007-11-16 01:28:45 +0000769 def dup(self):
770 raise NotImplemented("Can't dup() %s instances" %
771 self.__class__.__name__)
772
Bill Janssen6e027db2007-11-15 22:23:56 +0000773 def _checkClosed(self, msg=None):
774 # raise an exception here if you wish to check for spurious closes
775 pass
776
Antoine Pitrou242db722013-05-01 20:52:07 +0200777 def _check_connected(self):
778 if not self._connected:
779 # getpeername() will raise ENOTCONN if the socket is really
780 # not connected; note that we can be connected even without
781 # _connected being set, e.g. if connect() first returned
782 # EAGAIN.
783 self.getpeername()
784
Martin Panterf6b1d662016-03-28 00:22:09 +0000785 def read(self, len=1024, buffer=None):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000786 """Read up to LEN bytes and return them.
787 Return zero-length string on EOF."""
788
Bill Janssen6e027db2007-11-15 22:23:56 +0000789 self._checkClosed()
Antoine Pitrou60a26e02013-07-20 19:35:16 +0200790 if not self._sslobj:
791 raise ValueError("Read on closed or unwrapped SSL socket.")
Bill Janssen6e027db2007-11-15 22:23:56 +0000792 try:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200793 return self._sslobj.read(len, buffer)
Bill Janssen6e027db2007-11-15 22:23:56 +0000794 except SSLError as x:
795 if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
Antoine Pitrou24e561a2010-09-03 18:38:17 +0000796 if buffer is not None:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000797 return 0
798 else:
799 return b''
Bill Janssen6e027db2007-11-15 22:23:56 +0000800 else:
801 raise
Thomas Woutersed03b412007-08-28 21:37:11 +0000802
803 def write(self, data):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000804 """Write DATA to the underlying SSL channel. Returns
805 number of bytes of DATA actually transmitted."""
806
Bill Janssen6e027db2007-11-15 22:23:56 +0000807 self._checkClosed()
Antoine Pitrou60a26e02013-07-20 19:35:16 +0200808 if not self._sslobj:
809 raise ValueError("Write on closed or unwrapped SSL socket.")
Thomas Woutersed03b412007-08-28 21:37:11 +0000810 return self._sslobj.write(data)
811
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000812 def getpeercert(self, binary_form=False):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000813 """Returns a formatted version of the data in the
814 certificate provided by the other end of the SSL channel.
815 Return None if no certificate was provided, {} if a
816 certificate was provided, but not validated."""
817
Bill Janssen6e027db2007-11-15 22:23:56 +0000818 self._checkClosed()
Antoine Pitrou242db722013-05-01 20:52:07 +0200819 self._check_connected()
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200820 return self._sslobj.getpeercert(binary_form)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000821
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100822 def selected_npn_protocol(self):
823 self._checkClosed()
824 if not self._sslobj or not _ssl.HAS_NPN:
825 return None
826 else:
827 return self._sslobj.selected_npn_protocol()
828
Benjamin Petersoncca27322015-01-23 16:35:37 -0500829 def selected_alpn_protocol(self):
830 self._checkClosed()
831 if not self._sslobj or not _ssl.HAS_ALPN:
832 return None
833 else:
834 return self._sslobj.selected_alpn_protocol()
835
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000836 def cipher(self):
Bill Janssen6e027db2007-11-15 22:23:56 +0000837 self._checkClosed()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000838 if not self._sslobj:
839 return None
840 else:
841 return self._sslobj.cipher()
Thomas Woutersed03b412007-08-28 21:37:11 +0000842
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600843 def shared_ciphers(self):
844 self._checkClosed()
845 if not self._sslobj:
846 return None
847 return self._sslobj.shared_ciphers()
848
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +0100849 def compression(self):
850 self._checkClosed()
851 if not self._sslobj:
852 return None
853 else:
854 return self._sslobj.compression()
855
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000856 def send(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000857 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000858 if self._sslobj:
859 if flags != 0:
860 raise ValueError(
861 "non-zero flags not allowed in calls to send() on %s" %
862 self.__class__)
Antoine Pitroub4bebda2014-04-29 10:03:28 +0200863 return self._sslobj.write(data)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000864 else:
865 return socket.send(self, data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000866
Antoine Pitroua468adc2010-09-14 14:43:44 +0000867 def sendto(self, data, flags_or_addr, addr=None):
Bill Janssen6e027db2007-11-15 22:23:56 +0000868 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000869 if self._sslobj:
Bill Janssen980f3142008-06-29 00:05:51 +0000870 raise ValueError("sendto not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000871 self.__class__)
Antoine Pitroua468adc2010-09-14 14:43:44 +0000872 elif addr is None:
873 return socket.sendto(self, data, flags_or_addr)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000874 else:
Antoine Pitroua468adc2010-09-14 14:43:44 +0000875 return socket.sendto(self, data, flags_or_addr, addr)
Thomas Woutersed03b412007-08-28 21:37:11 +0000876
Nick Coghlan513886a2011-08-28 00:00:27 +1000877 def sendmsg(self, *args, **kwargs):
878 # Ensure programs don't send data unencrypted if they try to
879 # use this method.
880 raise NotImplementedError("sendmsg not allowed on instances of %s" %
881 self.__class__)
882
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000883 def sendall(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000884 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000885 if self._sslobj:
Giampaolo Rodolà374f8352010-08-29 12:08:09 +0000886 if flags != 0:
887 raise ValueError(
888 "non-zero flags not allowed in calls to sendall() on %s" %
889 self.__class__)
Bill Janssen6e027db2007-11-15 22:23:56 +0000890 amount = len(data)
891 count = 0
892 while (count < amount):
893 v = self.send(data[count:])
894 count += v
895 return amount
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000896 else:
897 return socket.sendall(self, data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000898
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200899 def sendfile(self, file, offset=0, count=None):
900 """Send a file, possibly by using os.sendfile() if this is a
901 clear-text socket. Return the total number of bytes sent.
902 """
903 if self._sslobj is None:
904 # os.sendfile() works with plain sockets only
905 return super().sendfile(file, offset, count)
906 else:
907 return self._sendfile_use_send(file, offset, count)
908
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000909 def recv(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000910 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000911 if self._sslobj:
912 if flags != 0:
913 raise ValueError(
Antoine Pitrou5733c082010-03-22 14:49:10 +0000914 "non-zero flags not allowed in calls to recv() on %s" %
915 self.__class__)
916 return self.read(buflen)
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000917 else:
918 return socket.recv(self, buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000919
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000920 def recv_into(self, buffer, nbytes=None, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000921 self._checkClosed()
922 if buffer and (nbytes is None):
923 nbytes = len(buffer)
924 elif nbytes is None:
925 nbytes = 1024
926 if self._sslobj:
927 if flags != 0:
928 raise ValueError(
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000929 "non-zero flags not allowed in calls to recv_into() on %s" %
930 self.__class__)
Antoine Pitrou5733c082010-03-22 14:49:10 +0000931 return self.read(nbytes, buffer)
Bill Janssen6e027db2007-11-15 22:23:56 +0000932 else:
933 return socket.recv_into(self, buffer, nbytes, flags)
934
Antoine Pitroua468adc2010-09-14 14:43:44 +0000935 def recvfrom(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +0000936 self._checkClosed()
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000937 if self._sslobj:
Bill Janssen980f3142008-06-29 00:05:51 +0000938 raise ValueError("recvfrom not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000939 self.__class__)
940 else:
Antoine Pitroua468adc2010-09-14 14:43:44 +0000941 return socket.recvfrom(self, buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +0000942
Bill Janssen58afe4c2008-09-08 16:45:19 +0000943 def recvfrom_into(self, buffer, nbytes=None, flags=0):
944 self._checkClosed()
945 if self._sslobj:
946 raise ValueError("recvfrom_into not allowed on instances of %s" %
947 self.__class__)
948 else:
949 return socket.recvfrom_into(self, buffer, nbytes, flags)
950
Nick Coghlan513886a2011-08-28 00:00:27 +1000951 def recvmsg(self, *args, **kwargs):
952 raise NotImplementedError("recvmsg not allowed on instances of %s" %
953 self.__class__)
954
955 def recvmsg_into(self, *args, **kwargs):
956 raise NotImplementedError("recvmsg_into not allowed on instances of "
957 "%s" % self.__class__)
958
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000959 def pending(self):
Bill Janssen6e027db2007-11-15 22:23:56 +0000960 self._checkClosed()
961 if self._sslobj:
962 return self._sslobj.pending()
963 else:
964 return 0
965
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000966 def shutdown(self, how):
Bill Janssen6e027db2007-11-15 22:23:56 +0000967 self._checkClosed()
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000968 self._sslobj = None
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000969 socket.shutdown(self, how)
Thomas Woutersed03b412007-08-28 21:37:11 +0000970
Ezio Melottidc55e672010-01-18 09:15:14 +0000971 def unwrap(self):
Bill Janssen40a0f662008-08-12 16:56:25 +0000972 if self._sslobj:
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200973 s = self._sslobj.unwrap()
Bill Janssen40a0f662008-08-12 16:56:25 +0000974 self._sslobj = None
975 return s
976 else:
977 raise ValueError("No SSL wrapper around " + str(self))
978
Guido van Rossum5b8b1552007-11-16 00:06:11 +0000979 def _real_close(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000980 self._sslobj = None
Bill Janssen54cc54c2007-12-14 22:08:56 +0000981 socket._real_close(self)
Bill Janssen6e027db2007-11-15 22:23:56 +0000982
Bill Janssen48dc27c2007-12-05 03:38:10 +0000983 def do_handshake(self, block=False):
Bill Janssen6e027db2007-11-15 22:23:56 +0000984 """Perform a TLS/SSL handshake."""
Antoine Pitrou242db722013-05-01 20:52:07 +0200985 self._check_connected()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000986 timeout = self.gettimeout()
Bill Janssen6e027db2007-11-15 22:23:56 +0000987 try:
Bill Janssen48dc27c2007-12-05 03:38:10 +0000988 if timeout == 0.0 and block:
989 self.settimeout(None)
Bill Janssen6e027db2007-11-15 22:23:56 +0000990 self._sslobj.do_handshake()
Bill Janssen48dc27c2007-12-05 03:38:10 +0000991 finally:
992 self.settimeout(timeout)
Thomas Woutersed03b412007-08-28 21:37:11 +0000993
Antoine Pitroub4410db2011-05-18 18:51:06 +0200994 def _real_connect(self, addr, connect_ex):
Giampaolo Rodolà745ab382010-08-29 19:25:49 +0000995 if self.server_side:
996 raise ValueError("can't connect in server-side mode")
Thomas Woutersed03b412007-08-28 21:37:11 +0000997 # Here we assume that the socket is client-side, and not
998 # connected at the time of the call. We connect it, then wrap it.
Antoine Pitroue93bf7a2011-02-26 23:24:06 +0000999 if self._connected:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001000 raise ValueError("attempt to connect already-connected SSLSocket!")
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001001 sslobj = self.context._wrap_socket(self, False, self.server_hostname)
1002 self._sslobj = SSLObject(sslobj, owner=self)
Bill Janssen54cc54c2007-12-14 22:08:56 +00001003 try:
Antoine Pitroub4410db2011-05-18 18:51:06 +02001004 if connect_ex:
1005 rc = socket.connect_ex(self, addr)
Antoine Pitroue93bf7a2011-02-26 23:24:06 +00001006 else:
Antoine Pitroub4410db2011-05-18 18:51:06 +02001007 rc = None
1008 socket.connect(self, addr)
1009 if not rc:
Antoine Pitrou242db722013-05-01 20:52:07 +02001010 self._connected = True
Antoine Pitroub4410db2011-05-18 18:51:06 +02001011 if self.do_handshake_on_connect:
1012 self.do_handshake()
Antoine Pitroub4410db2011-05-18 18:51:06 +02001013 return rc
Christian Heimes1aa9a752013-12-02 02:41:19 +01001014 except (OSError, ValueError):
Antoine Pitroub4410db2011-05-18 18:51:06 +02001015 self._sslobj = None
1016 raise
Antoine Pitroue93bf7a2011-02-26 23:24:06 +00001017
1018 def connect(self, addr):
1019 """Connects to remote ADDR, and then wraps the connection in
1020 an SSL channel."""
1021 self._real_connect(addr, False)
1022
1023 def connect_ex(self, addr):
1024 """Connects to remote ADDR, and then wraps the connection in
1025 an SSL channel."""
1026 return self._real_connect(addr, True)
Thomas Woutersed03b412007-08-28 21:37:11 +00001027
1028 def accept(self):
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001029 """Accepts a new connection from a remote client, and returns
1030 a tuple containing that new connection wrapped with a server-side
1031 SSL channel, and the address of the remote client."""
1032
1033 newsock, addr = socket.accept(self)
Antoine Pitrou5c89b4e2012-11-11 01:25:36 +01001034 newsock = self.context.wrap_socket(newsock,
1035 do_handshake_on_connect=self.do_handshake_on_connect,
1036 suppress_ragged_eofs=self.suppress_ragged_eofs,
1037 server_side=True)
1038 return newsock, addr
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001039
Antoine Pitroud6494802011-07-21 01:11:30 +02001040 def get_channel_binding(self, cb_type="tls-unique"):
1041 """Get channel binding data for current connection. Raise ValueError
1042 if the requested `cb_type` is not supported. Return bytes of the data
1043 or None if the data is not available (e.g. before the handshake).
1044 """
Antoine Pitroud6494802011-07-21 01:11:30 +02001045 if self._sslobj is None:
1046 return None
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001047 return self._sslobj.get_channel_binding(cb_type)
Antoine Pitroud6494802011-07-21 01:11:30 +02001048
Antoine Pitrou47e40422014-09-04 21:00:10 +02001049 def version(self):
1050 """
1051 Return a string identifying the protocol version used by the
1052 current SSL channel, or None if there is no established channel.
1053 """
1054 if self._sslobj is None:
1055 return None
1056 return self._sslobj.version()
1057
Bill Janssen54cc54c2007-12-14 22:08:56 +00001058
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001059def wrap_socket(sock, keyfile=None, certfile=None,
1060 server_side=False, cert_reqs=CERT_NONE,
Christian Heimes598894f2016-09-05 23:19:05 +02001061 ssl_version=PROTOCOL_TLS, ca_certs=None,
Bill Janssen48dc27c2007-12-05 03:38:10 +00001062 do_handshake_on_connect=True,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001063 suppress_ragged_eofs=True,
1064 ciphers=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001065
Bill Janssen6e027db2007-11-15 22:23:56 +00001066 return SSLSocket(sock=sock, keyfile=keyfile, certfile=certfile,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001067 server_side=server_side, cert_reqs=cert_reqs,
Bill Janssen6e027db2007-11-15 22:23:56 +00001068 ssl_version=ssl_version, ca_certs=ca_certs,
Bill Janssen48dc27c2007-12-05 03:38:10 +00001069 do_handshake_on_connect=do_handshake_on_connect,
Antoine Pitrou2d9cb9c2010-04-17 17:40:45 +00001070 suppress_ragged_eofs=suppress_ragged_eofs,
1071 ciphers=ciphers)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001072
Thomas Woutersed03b412007-08-28 21:37:11 +00001073# some utility functions
1074
1075def cert_time_to_seconds(cert_time):
Antoine Pitrouc695c952014-04-28 20:57:36 +02001076 """Return the time in seconds since the Epoch, given the timestring
1077 representing the "notBefore" or "notAfter" date from a certificate
1078 in ``"%b %d %H:%M:%S %Y %Z"`` strptime format (C locale).
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001079
Antoine Pitrouc695c952014-04-28 20:57:36 +02001080 "notBefore" or "notAfter" dates must use UTC (RFC 5280).
1081
1082 Month is one of: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1083 UTC should be specified as GMT (see ASN1_TIME_print())
1084 """
1085 from time import strptime
1086 from calendar import timegm
1087
1088 months = (
1089 "Jan","Feb","Mar","Apr","May","Jun",
1090 "Jul","Aug","Sep","Oct","Nov","Dec"
1091 )
1092 time_format = ' %d %H:%M:%S %Y GMT' # NOTE: no month, fixed GMT
1093 try:
1094 month_number = months.index(cert_time[:3].title()) + 1
1095 except ValueError:
1096 raise ValueError('time data %r does not match '
1097 'format "%%b%s"' % (cert_time, time_format))
1098 else:
1099 # found valid month
1100 tt = strptime(cert_time[3:], time_format)
1101 # return an integer, the previous mktime()-based implementation
1102 # returned a float (fractional seconds are always zero here).
1103 return timegm((tt[0], month_number) + tt[2:6])
Thomas Woutersed03b412007-08-28 21:37:11 +00001104
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001105PEM_HEADER = "-----BEGIN CERTIFICATE-----"
1106PEM_FOOTER = "-----END CERTIFICATE-----"
1107
1108def DER_cert_to_PEM_cert(der_cert_bytes):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001109 """Takes a certificate in binary DER format and returns the
1110 PEM version of it as a string."""
1111
Bill Janssen6e027db2007-11-15 22:23:56 +00001112 f = str(base64.standard_b64encode(der_cert_bytes), 'ASCII', 'strict')
1113 return (PEM_HEADER + '\n' +
1114 textwrap.fill(f, 64) + '\n' +
1115 PEM_FOOTER + '\n')
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001116
1117def PEM_cert_to_DER_cert(pem_cert_string):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001118 """Takes a certificate in ASCII PEM format and returns the
1119 DER-encoded version of it as a byte sequence"""
1120
1121 if not pem_cert_string.startswith(PEM_HEADER):
1122 raise ValueError("Invalid PEM encoding; must start with %s"
1123 % PEM_HEADER)
1124 if not pem_cert_string.strip().endswith(PEM_FOOTER):
1125 raise ValueError("Invalid PEM encoding; must end with %s"
1126 % PEM_FOOTER)
1127 d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
Georg Brandl706824f2009-06-04 09:42:55 +00001128 return base64.decodebytes(d.encode('ASCII', 'strict'))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001129
Christian Heimes598894f2016-09-05 23:19:05 +02001130def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001131 """Retrieve the certificate from the server at the specified address,
1132 and return it as a PEM-encoded string.
1133 If 'ca_certs' is specified, validate the server cert against it.
1134 If 'ssl_version' is specified, use it in the connection attempt."""
1135
1136 host, port = addr
Christian Heimes67986f92013-11-23 22:43:47 +01001137 if ca_certs is not None:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001138 cert_reqs = CERT_REQUIRED
1139 else:
1140 cert_reqs = CERT_NONE
Christian Heimes67986f92013-11-23 22:43:47 +01001141 context = _create_stdlib_context(ssl_version,
1142 cert_reqs=cert_reqs,
1143 cafile=ca_certs)
1144 with create_connection(addr) as sock:
1145 with context.wrap_socket(sock) as sslsock:
1146 dercert = sslsock.getpeercert(True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001147 return DER_cert_to_PEM_cert(dercert)
1148
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001149def get_protocol_name(protocol_code):
Victor Stinner3de49192011-05-09 00:42:58 +02001150 return _PROTOCOL_NAMES.get(protocol_code, '<unknown>')