blob: 4afa46e5da5cd5ab60bac2912eeee1063141cd1d [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
Christian Heimes5fe668c2016-09-12 00:01:11 +020055PROTOCOL_TLS_CLIENT
56PROTOCOL_TLS_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +000057PROTOCOL_TLSv1
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010058PROTOCOL_TLSv1_1
59PROTOCOL_TLSv1_2
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +010060
61The following constants identify various SSL alert message descriptions as per
62http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6
63
64ALERT_DESCRIPTION_CLOSE_NOTIFY
65ALERT_DESCRIPTION_UNEXPECTED_MESSAGE
66ALERT_DESCRIPTION_BAD_RECORD_MAC
67ALERT_DESCRIPTION_RECORD_OVERFLOW
68ALERT_DESCRIPTION_DECOMPRESSION_FAILURE
69ALERT_DESCRIPTION_HANDSHAKE_FAILURE
70ALERT_DESCRIPTION_BAD_CERTIFICATE
71ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE
72ALERT_DESCRIPTION_CERTIFICATE_REVOKED
73ALERT_DESCRIPTION_CERTIFICATE_EXPIRED
74ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN
75ALERT_DESCRIPTION_ILLEGAL_PARAMETER
76ALERT_DESCRIPTION_UNKNOWN_CA
77ALERT_DESCRIPTION_ACCESS_DENIED
78ALERT_DESCRIPTION_DECODE_ERROR
79ALERT_DESCRIPTION_DECRYPT_ERROR
80ALERT_DESCRIPTION_PROTOCOL_VERSION
81ALERT_DESCRIPTION_INSUFFICIENT_SECURITY
82ALERT_DESCRIPTION_INTERNAL_ERROR
83ALERT_DESCRIPTION_USER_CANCELLED
84ALERT_DESCRIPTION_NO_RENEGOTIATION
85ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION
86ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE
87ALERT_DESCRIPTION_UNRECOGNIZED_NAME
88ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE
89ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE
90ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY
Thomas Woutersed03b412007-08-28 21:37:11 +000091"""
92
Christian Heimes46bebee2013-06-09 19:03:31 +020093import sys
Christian Heimes6d7ad132013-06-09 18:02:55 +020094import os
Christian Heimesa6bc95a2013-11-17 19:59:14 +010095from collections import namedtuple
Christian Heimes3aeacad2016-09-10 00:19:35 +020096from enum import Enum as _Enum, IntEnum as _IntEnum, IntFlag as _IntFlag
Thomas Woutersed03b412007-08-28 21:37:11 +000097
98import _ssl # if we can't import it, let the error propagate
Thomas Wouters1b7f8912007-09-19 03:06:30 +000099
Antoine Pitrou04f6a322010-04-05 21:40:07 +0000100from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
Christian Heimes99a65702016-09-10 23:44:53 +0200101from _ssl import _SSLContext, MemoryBIO, SSLSession
Antoine Pitrou41032a62011-10-27 23:56:55 +0200102from _ssl import (
103 SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700104 SSLSyscallError, SSLEOFError, SSLCertVerificationError
Antoine Pitrou41032a62011-10-27 23:56:55 +0200105 )
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100106from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj
Victor Stinnerbeeb5122014-11-28 13:28:25 +0100107from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes
108try:
109 from _ssl import RAND_egd
110except ImportError:
111 # LibreSSL does not provide RAND_egd
112 pass
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100113
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100114
Christian Heimes698dde12018-02-27 11:54:43 +0100115from _ssl import (
116 HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN, HAS_SSLv2, HAS_SSLv3, HAS_TLSv1,
117 HAS_TLSv1_1, HAS_TLSv1_2, HAS_TLSv1_3
118)
119from _ssl import _DEFAULT_CIPHERS, _OPENSSL_API_VERSION
Antoine Pitroub9ac25d2011-07-08 18:47:06 +0200120
Christian Heimes3aeacad2016-09-10 00:19:35 +0200121
orlnub1230fb9fad2018-09-12 20:28:53 +0300122_IntEnum._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200123 '_SSLMethod', __name__,
124 lambda name: name.startswith('PROTOCOL_') and name != 'PROTOCOL_SSLv23',
125 source=_ssl)
126
orlnub1230fb9fad2018-09-12 20:28:53 +0300127_IntFlag._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200128 'Options', __name__,
129 lambda name: name.startswith('OP_'),
130 source=_ssl)
131
orlnub1230fb9fad2018-09-12 20:28:53 +0300132_IntEnum._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200133 'AlertDescription', __name__,
134 lambda name: name.startswith('ALERT_DESCRIPTION_'),
135 source=_ssl)
136
orlnub1230fb9fad2018-09-12 20:28:53 +0300137_IntEnum._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200138 'SSLErrorNumber', __name__,
139 lambda name: name.startswith('SSL_ERROR_'),
140 source=_ssl)
141
orlnub1230fb9fad2018-09-12 20:28:53 +0300142_IntFlag._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200143 'VerifyFlags', __name__,
144 lambda name: name.startswith('VERIFY_'),
145 source=_ssl)
146
orlnub1230fb9fad2018-09-12 20:28:53 +0300147_IntEnum._convert_(
Christian Heimes3aeacad2016-09-10 00:19:35 +0200148 'VerifyMode', __name__,
149 lambda name: name.startswith('CERT_'),
150 source=_ssl)
151
Christian Heimes598894f2016-09-05 23:19:05 +0200152PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_SSLv23 = _SSLMethod.PROTOCOL_TLS
Antoine Pitrou172f0252014-04-18 20:33:08 +0200153_PROTOCOL_NAMES = {value: name for name, value in _SSLMethod.__members__.items()}
154
Christian Heimes3aeacad2016-09-10 00:19:35 +0200155_SSLv2_IF_EXISTS = getattr(_SSLMethod, 'PROTOCOL_SSLv2', None)
156
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100157
Christian Heimes698dde12018-02-27 11:54:43 +0100158class TLSVersion(_IntEnum):
159 MINIMUM_SUPPORTED = _ssl.PROTO_MINIMUM_SUPPORTED
160 SSLv3 = _ssl.PROTO_SSLv3
161 TLSv1 = _ssl.PROTO_TLSv1
162 TLSv1_1 = _ssl.PROTO_TLSv1_1
163 TLSv1_2 = _ssl.PROTO_TLSv1_2
164 TLSv1_3 = _ssl.PROTO_TLSv1_3
165 MAXIMUM_SUPPORTED = _ssl.PROTO_MAXIMUM_SUPPORTED
166
167
Christian Heimesc7f70692019-05-31 11:44:05 +0200168class _TLSContentType(_IntEnum):
169 """Content types (record layer)
170
171 See RFC 8446, section B.1
172 """
173 CHANGE_CIPHER_SPEC = 20
174 ALERT = 21
175 HANDSHAKE = 22
176 APPLICATION_DATA = 23
177 # pseudo content types
178 HEADER = 0x100
179 INNER_CONTENT_TYPE = 0x101
180
181
182class _TLSAlertType(_IntEnum):
183 """Alert types for TLSContentType.ALERT messages
184
185 See RFC 8466, section B.2
186 """
187 CLOSE_NOTIFY = 0
188 UNEXPECTED_MESSAGE = 10
189 BAD_RECORD_MAC = 20
190 DECRYPTION_FAILED = 21
191 RECORD_OVERFLOW = 22
192 DECOMPRESSION_FAILURE = 30
193 HANDSHAKE_FAILURE = 40
194 NO_CERTIFICATE = 41
195 BAD_CERTIFICATE = 42
196 UNSUPPORTED_CERTIFICATE = 43
197 CERTIFICATE_REVOKED = 44
198 CERTIFICATE_EXPIRED = 45
199 CERTIFICATE_UNKNOWN = 46
200 ILLEGAL_PARAMETER = 47
201 UNKNOWN_CA = 48
202 ACCESS_DENIED = 49
203 DECODE_ERROR = 50
204 DECRYPT_ERROR = 51
205 EXPORT_RESTRICTION = 60
206 PROTOCOL_VERSION = 70
207 INSUFFICIENT_SECURITY = 71
208 INTERNAL_ERROR = 80
209 INAPPROPRIATE_FALLBACK = 86
210 USER_CANCELED = 90
211 NO_RENEGOTIATION = 100
212 MISSING_EXTENSION = 109
213 UNSUPPORTED_EXTENSION = 110
214 CERTIFICATE_UNOBTAINABLE = 111
215 UNRECOGNIZED_NAME = 112
216 BAD_CERTIFICATE_STATUS_RESPONSE = 113
217 BAD_CERTIFICATE_HASH_VALUE = 114
218 UNKNOWN_PSK_IDENTITY = 115
219 CERTIFICATE_REQUIRED = 116
220 NO_APPLICATION_PROTOCOL = 120
221
222
223class _TLSMessageType(_IntEnum):
224 """Message types (handshake protocol)
225
226 See RFC 8446, section B.3
227 """
228 HELLO_REQUEST = 0
229 CLIENT_HELLO = 1
230 SERVER_HELLO = 2
231 HELLO_VERIFY_REQUEST = 3
232 NEWSESSION_TICKET = 4
233 END_OF_EARLY_DATA = 5
234 HELLO_RETRY_REQUEST = 6
235 ENCRYPTED_EXTENSIONS = 8
236 CERTIFICATE = 11
237 SERVER_KEY_EXCHANGE = 12
238 CERTIFICATE_REQUEST = 13
239 SERVER_DONE = 14
240 CERTIFICATE_VERIFY = 15
241 CLIENT_KEY_EXCHANGE = 16
242 FINISHED = 20
243 CERTIFICATE_URL = 21
244 CERTIFICATE_STATUS = 22
245 SUPPLEMENTAL_DATA = 23
246 KEY_UPDATE = 24
247 NEXT_PROTO = 67
248 MESSAGE_HASH = 254
249 CHANGE_CIPHER_SPEC = 0x0101
250
251
Christian Heimes46bebee2013-06-09 19:03:31 +0200252if sys.platform == "win32":
Christian Heimes44109d72013-11-22 01:51:30 +0100253 from _ssl import enum_certificates, enum_crls
Christian Heimes46bebee2013-06-09 19:03:31 +0200254
Antoine Pitrou15399c32011-04-28 19:23:55 +0200255from socket import socket, AF_INET, SOCK_STREAM, create_connection
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100256from socket import SOL_SOCKET, SO_TYPE
Christian Heimesaef12832018-02-24 14:35:56 +0100257import socket as _socket
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000258import base64 # for DER-to-PEM translation
Antoine Pitroude8cf322010-04-26 17:29:05 +0000259import errno
Steve Dower33bc4a22016-05-26 12:18:12 -0700260import warnings
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000261
Andrew Svetlov0832af62012-12-18 23:10:48 +0200262
263socket_error = OSError # keep that public name in module namespace
264
Christian Heimes141c5e82018-02-24 21:10:57 +0100265CHANNEL_BINDING_TYPES = ['tls-unique']
Thomas Woutersed03b412007-08-28 21:37:11 +0000266
Christian Heimes61d478c2018-01-27 15:51:38 +0100267HAS_NEVER_CHECK_COMMON_NAME = hasattr(_ssl, 'HOSTFLAG_NEVER_CHECK_SUBJECT')
268
Christian Heimes03d13c02016-09-06 20:06:47 +0200269
Christian Heimes892d66e2018-01-29 14:10:18 +0100270_RESTRICTED_SERVER_CIPHERS = _DEFAULT_CIPHERS
Christian Heimes4c05b472013-11-23 15:58:30 +0100271
Christian Heimes61d478c2018-01-27 15:51:38 +0100272CertificateError = SSLCertVerificationError
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000273
274
Mandeep Singhede2ac92017-11-27 04:01:27 +0530275def _dnsname_match(dn, hostname):
Georg Brandl72c98d32013-10-27 07:16:53 +0100276 """Matching according to RFC 6125, section 6.4.3
277
Christian Heimesaef12832018-02-24 14:35:56 +0100278 - Hostnames are compared lower case.
279 - For IDNA, both dn and hostname must be encoded as IDN A-label (ACE).
280 - Partial wildcards like 'www*.example.org', multiple wildcards, sole
281 wildcard or wildcards in labels other then the left-most label are not
282 supported and a CertificateError is raised.
283 - A wildcard must match at least one character.
Georg Brandl72c98d32013-10-27 07:16:53 +0100284 """
Georg Brandl72c98d32013-10-27 07:16:53 +0100285 if not dn:
286 return False
287
Christian Heimesaef12832018-02-24 14:35:56 +0100288 wildcards = dn.count('*')
Georg Brandl72c98d32013-10-27 07:16:53 +0100289 # speed up common case w/o wildcards
290 if not wildcards:
291 return dn.lower() == hostname.lower()
292
Christian Heimesaef12832018-02-24 14:35:56 +0100293 if wildcards > 1:
294 raise CertificateError(
295 "too many wildcards in certificate DNS name: {!r}.".format(dn))
Georg Brandl72c98d32013-10-27 07:16:53 +0100296
Christian Heimesaef12832018-02-24 14:35:56 +0100297 dn_leftmost, sep, dn_remainder = dn.partition('.')
Georg Brandl72c98d32013-10-27 07:16:53 +0100298
Christian Heimesaef12832018-02-24 14:35:56 +0100299 if '*' in dn_remainder:
300 # Only match wildcard in leftmost segment.
301 raise CertificateError(
302 "wildcard can only be present in the leftmost label: "
303 "{!r}.".format(dn))
304
305 if not sep:
306 # no right side
307 raise CertificateError(
308 "sole wildcard without additional labels are not support: "
309 "{!r}.".format(dn))
310
311 if dn_leftmost != '*':
312 # no partial wildcard matching
313 raise CertificateError(
314 "partial wildcards in leftmost label are not supported: "
315 "{!r}.".format(dn))
316
317 hostname_leftmost, sep, hostname_remainder = hostname.partition('.')
318 if not hostname_leftmost or not sep:
319 # wildcard must match at least one char
320 return False
321 return dn_remainder.lower() == hostname_remainder.lower()
322
323
324def _inet_paton(ipname):
325 """Try to convert an IP address to packed binary form
326
327 Supports IPv4 addresses on all platforms and IPv6 on platforms with IPv6
328 support.
329 """
330 # inet_aton() also accepts strings like '1'
331 if ipname.count('.') == 3:
332 try:
333 return _socket.inet_aton(ipname)
334 except OSError:
335 pass
336
337 try:
338 return _socket.inet_pton(_socket.AF_INET6, ipname)
339 except OSError:
340 raise ValueError("{!r} is neither an IPv4 nor an IP6 "
341 "address.".format(ipname))
342 except AttributeError:
343 # AF_INET6 not available
344 pass
345
346 raise ValueError("{!r} is not an IPv4 address.".format(ipname))
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000347
348
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100349def _ipaddress_match(ipname, host_ip):
350 """Exact matching of IP addresses.
351
352 RFC 6125 explicitly doesn't define an algorithm for this
353 (section 1.7.2 - "Out of Scope").
354 """
355 # OpenSSL may add a trailing newline to a subjectAltName's IP address
Christian Heimesaef12832018-02-24 14:35:56 +0100356 ip = _inet_paton(ipname.rstrip())
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100357 return ip == host_ip
358
359
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000360def match_hostname(cert, hostname):
361 """Verify that *cert* (in decoded format as returned by
Georg Brandl72c98d32013-10-27 07:16:53 +0100362 SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
Christian Heimesaef12832018-02-24 14:35:56 +0100363 rules are followed.
364
365 The function matches IP addresses rather than dNSNames if hostname is a
366 valid ipaddress string. IPv4 addresses are supported on all platforms.
367 IPv6 addresses are supported on platforms with IPv6 support (AF_INET6
368 and inet_pton).
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000369
370 CertificateError is raised on failure. On success, the function
371 returns nothing.
372 """
373 if not cert:
Christian Heimes1aa9a752013-12-02 02:41:19 +0100374 raise ValueError("empty or no certificate, match_hostname needs a "
375 "SSL socket or SSL context with either "
376 "CERT_OPTIONAL or CERT_REQUIRED")
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100377 try:
Christian Heimesaef12832018-02-24 14:35:56 +0100378 host_ip = _inet_paton(hostname)
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100379 except ValueError:
380 # Not an IP address (common case)
381 host_ip = None
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000382 dnsnames = []
383 san = cert.get('subjectAltName', ())
384 for key, value in san:
385 if key == 'DNS':
Antoine Pitrouc481bfb2015-02-15 18:12:20 +0100386 if host_ip is None and _dnsname_match(value, hostname):
387 return
388 dnsnames.append(value)
389 elif key == 'IP Address':
390 if host_ip is not None and _ipaddress_match(value, host_ip):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000391 return
392 dnsnames.append(value)
Antoine Pitrou1c86b442011-05-06 15:19:49 +0200393 if not dnsnames:
394 # The subject is only checked when there is no dNSName entry
395 # in subjectAltName
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000396 for sub in cert.get('subject', ()):
397 for key, value in sub:
398 # XXX according to RFC 2818, the most specific Common Name
399 # must be used.
400 if key == 'commonName':
Georg Brandl72c98d32013-10-27 07:16:53 +0100401 if _dnsname_match(value, hostname):
Antoine Pitrou59fdd672010-10-08 10:37:08 +0000402 return
403 dnsnames.append(value)
404 if len(dnsnames) > 1:
405 raise CertificateError("hostname %r "
406 "doesn't match either of %s"
407 % (hostname, ', '.join(map(repr, dnsnames))))
408 elif len(dnsnames) == 1:
409 raise CertificateError("hostname %r "
410 "doesn't match %r"
411 % (hostname, dnsnames[0]))
412 else:
413 raise CertificateError("no appropriate commonName or "
414 "subjectAltName fields were found")
415
416
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100417DefaultVerifyPaths = namedtuple("DefaultVerifyPaths",
Christian Heimes6d7ad132013-06-09 18:02:55 +0200418 "cafile capath openssl_cafile_env openssl_cafile openssl_capath_env "
419 "openssl_capath")
420
421def get_default_verify_paths():
422 """Return paths to default cafile and capath.
423 """
424 parts = _ssl.get_default_verify_paths()
425
426 # environment vars shadow paths
427 cafile = os.environ.get(parts[0], parts[1])
428 capath = os.environ.get(parts[2], parts[3])
429
430 return DefaultVerifyPaths(cafile if os.path.isfile(cafile) else None,
431 capath if os.path.isdir(capath) else None,
432 *parts)
433
434
Christian Heimesa6bc95a2013-11-17 19:59:14 +0100435class _ASN1Object(namedtuple("_ASN1Object", "nid shortname longname oid")):
436 """ASN.1 object identifier lookup
437 """
438 __slots__ = ()
439
440 def __new__(cls, oid):
441 return super().__new__(cls, *_txt2obj(oid, name=False))
442
443 @classmethod
444 def fromnid(cls, nid):
445 """Create _ASN1Object from OpenSSL numeric ID
446 """
447 return super().__new__(cls, *_nid2obj(nid))
448
449 @classmethod
450 def fromname(cls, name):
451 """Create _ASN1Object from short name, long name or OID
452 """
453 return super().__new__(cls, *_txt2obj(name, name=True))
454
455
Christian Heimes72d28502013-11-23 13:56:58 +0100456class Purpose(_ASN1Object, _Enum):
457 """SSLContext purpose flags with X509v3 Extended Key Usage objects
458 """
459 SERVER_AUTH = '1.3.6.1.5.5.7.3.1'
460 CLIENT_AUTH = '1.3.6.1.5.5.7.3.2'
461
462
Antoine Pitrou152efa22010-05-16 18:19:27 +0000463class SSLContext(_SSLContext):
464 """An SSLContext holds various SSL-related configuration options and
465 data, such as certificates and possibly a private key."""
Christian Heimes72d28502013-11-23 13:56:58 +0100466 _windows_cert_stores = ("CA", "ROOT")
Antoine Pitrou152efa22010-05-16 18:19:27 +0000467
Christian Heimes4df60f12017-09-15 20:26:05 +0200468 sslsocket_class = None # SSLSocket is assigned later.
469 sslobject_class = None # SSLObject is assigned later.
470
Christian Heimes598894f2016-09-05 23:19:05 +0200471 def __new__(cls, protocol=PROTOCOL_TLS, *args, **kwargs):
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100472 self = _SSLContext.__new__(cls, protocol)
Antoine Pitrou8f85f902012-01-03 22:46:48 +0100473 return self
Antoine Pitrou152efa22010-05-16 18:19:27 +0000474
Christian Heimes11a14932018-02-24 02:35:08 +0100475 def _encode_hostname(self, hostname):
476 if hostname is None:
477 return None
478 elif isinstance(hostname, str):
479 return hostname.encode('idna').decode('ascii')
480 else:
481 return hostname.decode('ascii')
Antoine Pitrou152efa22010-05-16 18:19:27 +0000482
483 def wrap_socket(self, sock, server_side=False,
484 do_handshake_on_connect=True,
Antoine Pitroud5323212010-10-22 18:19:07 +0000485 suppress_ragged_eofs=True,
Christian Heimes99a65702016-09-10 23:44:53 +0200486 server_hostname=None, session=None):
Christian Heimes11a14932018-02-24 02:35:08 +0100487 # SSLSocket class handles server_hostname encoding before it calls
488 # ctx._wrap_socket()
Christian Heimes9d50ab52018-02-27 10:17:30 +0100489 return self.sslsocket_class._create(
Christian Heimes4df60f12017-09-15 20:26:05 +0200490 sock=sock,
491 server_side=server_side,
492 do_handshake_on_connect=do_handshake_on_connect,
493 suppress_ragged_eofs=suppress_ragged_eofs,
494 server_hostname=server_hostname,
Christian Heimes9d50ab52018-02-27 10:17:30 +0100495 context=self,
496 session=session
Christian Heimes4df60f12017-09-15 20:26:05 +0200497 )
Antoine Pitrou152efa22010-05-16 18:19:27 +0000498
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200499 def wrap_bio(self, incoming, outgoing, server_side=False,
Christian Heimes99a65702016-09-10 23:44:53 +0200500 server_hostname=None, session=None):
Christian Heimes11a14932018-02-24 02:35:08 +0100501 # Need to encode server_hostname here because _wrap_bio() can only
502 # handle ASCII str.
Christian Heimes9d50ab52018-02-27 10:17:30 +0100503 return self.sslobject_class._create(
Christian Heimes11a14932018-02-24 02:35:08 +0100504 incoming, outgoing, server_side=server_side,
Christian Heimes141c5e82018-02-24 21:10:57 +0100505 server_hostname=self._encode_hostname(server_hostname),
Christian Heimes9d50ab52018-02-27 10:17:30 +0100506 session=session, context=self,
Christian Heimes11a14932018-02-24 02:35:08 +0100507 )
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200508
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100509 def set_npn_protocols(self, npn_protocols):
510 protos = bytearray()
511 for protocol in npn_protocols:
512 b = bytes(protocol, 'ascii')
513 if len(b) == 0 or len(b) > 255:
514 raise SSLError('NPN protocols must be 1 to 255 in length')
515 protos.append(len(b))
516 protos.extend(b)
517
518 self._set_npn_protocols(protos)
519
Christian Heimes11a14932018-02-24 02:35:08 +0100520 def set_servername_callback(self, server_name_callback):
521 if server_name_callback is None:
522 self.sni_callback = None
523 else:
524 if not callable(server_name_callback):
525 raise TypeError("not a callable object")
526
527 def shim_cb(sslobj, servername, sslctx):
528 servername = self._encode_hostname(servername)
529 return server_name_callback(sslobj, servername, sslctx)
530
531 self.sni_callback = shim_cb
532
Benjamin Petersoncca27322015-01-23 16:35:37 -0500533 def set_alpn_protocols(self, alpn_protocols):
534 protos = bytearray()
535 for protocol in alpn_protocols:
536 b = bytes(protocol, 'ascii')
537 if len(b) == 0 or len(b) > 255:
538 raise SSLError('ALPN protocols must be 1 to 255 in length')
539 protos.append(len(b))
540 protos.extend(b)
541
542 self._set_alpn_protocols(protos)
543
Christian Heimes72d28502013-11-23 13:56:58 +0100544 def _load_windows_store_certs(self, storename, purpose):
545 certs = bytearray()
Steve Dower33bc4a22016-05-26 12:18:12 -0700546 try:
547 for cert, encoding, trust in enum_certificates(storename):
548 # CA certs are never PKCS#7 encoded
549 if encoding == "x509_asn":
550 if trust is True or purpose.oid in trust:
551 certs.extend(cert)
552 except PermissionError:
553 warnings.warn("unable to enumerate Windows certificate store")
Steve Dower8dd7aeb2016-03-17 15:02:39 -0700554 if certs:
555 self.load_verify_locations(cadata=certs)
Christian Heimes72d28502013-11-23 13:56:58 +0100556 return certs
557
558 def load_default_certs(self, purpose=Purpose.SERVER_AUTH):
559 if not isinstance(purpose, _ASN1Object):
560 raise TypeError(purpose)
561 if sys.platform == "win32":
562 for storename in self._windows_cert_stores:
563 self._load_windows_store_certs(storename, purpose)
Benjamin Peterson5915b0f2014-10-03 17:27:05 -0400564 self.set_default_verify_paths()
Christian Heimes72d28502013-11-23 13:56:58 +0100565
Christian Heimes698dde12018-02-27 11:54:43 +0100566 if hasattr(_SSLContext, 'minimum_version'):
567 @property
568 def minimum_version(self):
569 return TLSVersion(super().minimum_version)
570
571 @minimum_version.setter
572 def minimum_version(self, value):
573 if value == TLSVersion.SSLv3:
574 self.options &= ~Options.OP_NO_SSLv3
575 super(SSLContext, SSLContext).minimum_version.__set__(self, value)
576
577 @property
578 def maximum_version(self):
579 return TLSVersion(super().maximum_version)
580
581 @maximum_version.setter
582 def maximum_version(self, value):
583 super(SSLContext, SSLContext).maximum_version.__set__(self, value)
584
Christian Heimes3aeacad2016-09-10 00:19:35 +0200585 @property
586 def options(self):
587 return Options(super().options)
588
589 @options.setter
590 def options(self, value):
591 super(SSLContext, SSLContext).options.__set__(self, value)
592
Christian Heimes61d478c2018-01-27 15:51:38 +0100593 if hasattr(_ssl, 'HOSTFLAG_NEVER_CHECK_SUBJECT'):
594 @property
595 def hostname_checks_common_name(self):
596 ncs = self._host_flags & _ssl.HOSTFLAG_NEVER_CHECK_SUBJECT
597 return ncs != _ssl.HOSTFLAG_NEVER_CHECK_SUBJECT
598
599 @hostname_checks_common_name.setter
600 def hostname_checks_common_name(self, value):
601 if value:
602 self._host_flags &= ~_ssl.HOSTFLAG_NEVER_CHECK_SUBJECT
603 else:
604 self._host_flags |= _ssl.HOSTFLAG_NEVER_CHECK_SUBJECT
605 else:
606 @property
607 def hostname_checks_common_name(self):
608 return True
609
Christian Heimes3aeacad2016-09-10 00:19:35 +0200610 @property
Christian Heimesc7f70692019-05-31 11:44:05 +0200611 def _msg_callback(self):
612 """TLS message callback
613
614 The message callback provides a debugging hook to analyze TLS
615 connections. The callback is called for any TLS protocol message
616 (header, handshake, alert, and more), but not for application data.
617 Due to technical limitations, the callback can't be used to filter
618 traffic or to abort a connection. Any exception raised in the
619 callback is delayed until the handshake, read, or write operation
620 has been performed.
621
622 def msg_cb(conn, direction, version, content_type, msg_type, data):
623 pass
624
625 conn
626 :class:`SSLSocket` or :class:`SSLObject` instance
627 direction
628 ``read`` or ``write``
629 version
630 :class:`TLSVersion` enum member or int for unknown version. For a
631 frame header, it's the header version.
632 content_type
633 :class:`_TLSContentType` enum member or int for unsupported
634 content type.
635 msg_type
636 Either a :class:`_TLSContentType` enum number for a header
637 message, a :class:`_TLSAlertType` enum member for an alert
638 message, a :class:`_TLSMessageType` enum member for other
639 messages, or int for unsupported message types.
640 data
641 Raw, decrypted message content as bytes
642 """
643 inner = super()._msg_callback
644 if inner is not None:
645 return inner.user_function
646 else:
647 return None
648
649 @_msg_callback.setter
650 def _msg_callback(self, callback):
651 if callback is None:
652 super(SSLContext, SSLContext)._msg_callback.__set__(self, None)
653 return
654
655 if not hasattr(callback, '__call__'):
656 raise TypeError(f"{callback} is not callable.")
657
658 def inner(conn, direction, version, content_type, msg_type, data):
659 try:
660 version = TLSVersion(version)
661 except TypeError:
662 pass
663
664 try:
665 content_type = _TLSContentType(content_type)
666 except TypeError:
667 pass
668
669 if content_type == _TLSContentType.HEADER:
670 msg_enum = _TLSContentType
671 elif content_type == _TLSContentType.ALERT:
672 msg_enum = _TLSAlertType
673 else:
674 msg_enum = _TLSMessageType
675 try:
676 msg_type = msg_enum(msg_type)
677 except TypeError:
678 pass
679
680 return callback(conn, direction, version,
681 content_type, msg_type, data)
682
683 inner.user_function = callback
684
685 super(SSLContext, SSLContext)._msg_callback.__set__(self, inner)
686
687 @property
Christian Heimes11a14932018-02-24 02:35:08 +0100688 def protocol(self):
689 return _SSLMethod(super().protocol)
690
691 @property
Christian Heimes3aeacad2016-09-10 00:19:35 +0200692 def verify_flags(self):
693 return VerifyFlags(super().verify_flags)
694
695 @verify_flags.setter
696 def verify_flags(self, value):
697 super(SSLContext, SSLContext).verify_flags.__set__(self, value)
698
699 @property
700 def verify_mode(self):
701 value = super().verify_mode
702 try:
703 return VerifyMode(value)
704 except ValueError:
705 return value
706
707 @verify_mode.setter
708 def verify_mode(self, value):
709 super(SSLContext, SSLContext).verify_mode.__set__(self, value)
710
Antoine Pitrou152efa22010-05-16 18:19:27 +0000711
Christian Heimes4c05b472013-11-23 15:58:30 +0100712def create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None,
713 capath=None, cadata=None):
714 """Create a SSLContext object with default settings.
715
716 NOTE: The protocol and settings may change anytime without prior
717 deprecation. The values represent a fair balance between maximum
718 compatibility and security.
719 """
720 if not isinstance(purpose, _ASN1Object):
721 raise TypeError(purpose)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400722
Christian Heimes358cfd42016-09-10 22:43:48 +0200723 # SSLContext sets OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION,
724 # OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE and OP_SINGLE_ECDH_USE
725 # by default.
Christian Heimes598894f2016-09-05 23:19:05 +0200726 context = SSLContext(PROTOCOL_TLS)
Donald Stufft6a2ba942014-03-23 19:05:28 -0400727
Christian Heimes4c05b472013-11-23 15:58:30 +0100728 if purpose == Purpose.SERVER_AUTH:
Donald Stufft6a2ba942014-03-23 19:05:28 -0400729 # verify certs and host name in client mode
Christian Heimes4c05b472013-11-23 15:58:30 +0100730 context.verify_mode = CERT_REQUIRED
Christian Heimes1aa9a752013-12-02 02:41:19 +0100731 context.check_hostname = True
Donald Stufft6a2ba942014-03-23 19:05:28 -0400732
Christian Heimes4c05b472013-11-23 15:58:30 +0100733 if cafile or capath or cadata:
734 context.load_verify_locations(cafile, capath, cadata)
735 elif context.verify_mode != CERT_NONE:
736 # no explicit cafile, capath or cadata but the verify mode is
737 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
738 # root CA certificates for the given purpose. This may fail silently.
739 context.load_default_certs(purpose)
Christian Heimesc7f70692019-05-31 11:44:05 +0200740 # OpenSSL 1.1.1 keylog file
741 if hasattr(context, 'keylog_filename'):
742 keylogfile = os.environ.get('SSLKEYLOGFILE')
743 if keylogfile and not sys.flags.ignore_environment:
744 context.keylog_filename = keylogfile
Christian Heimes4c05b472013-11-23 15:58:30 +0100745 return context
746
Christian Heimesa170fa12017-09-15 20:27:30 +0200747def _create_unverified_context(protocol=PROTOCOL_TLS, *, cert_reqs=CERT_NONE,
Christian Heimesa02c69a2013-12-02 20:59:28 +0100748 check_hostname=False, purpose=Purpose.SERVER_AUTH,
Christian Heimes67986f92013-11-23 22:43:47 +0100749 certfile=None, keyfile=None,
750 cafile=None, capath=None, cadata=None):
751 """Create a SSLContext object for Python stdlib modules
752
753 All Python stdlib modules shall use this function to create SSLContext
754 objects in order to keep common settings in one place. The configuration
755 is less restrict than create_default_context()'s to increase backward
756 compatibility.
757 """
758 if not isinstance(purpose, _ASN1Object):
759 raise TypeError(purpose)
760
Christian Heimes358cfd42016-09-10 22:43:48 +0200761 # SSLContext sets OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION,
762 # OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE and OP_SINGLE_ECDH_USE
763 # by default.
Christian Heimes67986f92013-11-23 22:43:47 +0100764 context = SSLContext(protocol)
Christian Heimes67986f92013-11-23 22:43:47 +0100765
Christian Heimesa170fa12017-09-15 20:27:30 +0200766 if not check_hostname:
767 context.check_hostname = False
Christian Heimes67986f92013-11-23 22:43:47 +0100768 if cert_reqs is not None:
769 context.verify_mode = cert_reqs
Christian Heimesa170fa12017-09-15 20:27:30 +0200770 if check_hostname:
771 context.check_hostname = True
Christian Heimes67986f92013-11-23 22:43:47 +0100772
773 if keyfile and not certfile:
774 raise ValueError("certfile must be specified")
775 if certfile or keyfile:
776 context.load_cert_chain(certfile, keyfile)
777
778 # load CA root certs
779 if cafile or capath or cadata:
780 context.load_verify_locations(cafile, capath, cadata)
781 elif context.verify_mode != CERT_NONE:
782 # no explicit cafile, capath or cadata but the verify mode is
783 # CERT_OPTIONAL or CERT_REQUIRED. Let's try to load default system
784 # root CA certificates for the given purpose. This may fail silently.
785 context.load_default_certs(purpose)
Christian Heimesc7f70692019-05-31 11:44:05 +0200786 # OpenSSL 1.1.1 keylog file
787 if hasattr(context, 'keylog_filename'):
788 keylogfile = os.environ.get('SSLKEYLOGFILE')
789 if keylogfile and not sys.flags.ignore_environment:
790 context.keylog_filename = keylogfile
Christian Heimes67986f92013-11-23 22:43:47 +0100791 return context
792
Benjamin Peterson4ffb0752014-11-03 14:29:33 -0500793# Used by http.client if no context is explicitly passed.
794_create_default_https_context = create_default_context
795
796
797# Backwards compatibility alias, even though it's not a public name.
798_create_stdlib_context = _create_unverified_context
799
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200800
801class SSLObject:
802 """This class implements an interface on top of a low-level SSL object as
803 implemented by OpenSSL. This object captures the state of an SSL connection
804 but does not provide any network IO itself. IO needs to be performed
805 through separate "BIO" objects which are OpenSSL's IO abstraction layer.
806
807 This class does not have a public constructor. Instances are returned by
808 ``SSLContext.wrap_bio``. This class is typically used by framework authors
809 that want to implement asynchronous IO for SSL through memory buffers.
810
811 When compared to ``SSLSocket``, this object lacks the following features:
812
Matt Eatonfc7d1b32018-10-05 02:00:45 -0500813 * Any form of network IO, including methods such as ``recv`` and ``send``.
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200814 * The ``do_handshake_on_connect`` and ``suppress_ragged_eofs`` machinery.
815 """
Christian Heimes9d50ab52018-02-27 10:17:30 +0100816 def __init__(self, *args, **kwargs):
817 raise TypeError(
818 f"{self.__class__.__name__} does not have a public "
819 f"constructor. Instances are returned by SSLContext.wrap_bio()."
820 )
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200821
Christian Heimes9d50ab52018-02-27 10:17:30 +0100822 @classmethod
823 def _create(cls, incoming, outgoing, server_side=False,
824 server_hostname=None, session=None, context=None):
825 self = cls.__new__(cls)
826 sslobj = context._wrap_bio(
Christian Heimes141c5e82018-02-24 21:10:57 +0100827 incoming, outgoing, server_side=server_side,
828 server_hostname=server_hostname,
829 owner=self, session=session
830 )
Christian Heimes9d50ab52018-02-27 10:17:30 +0100831 self._sslobj = sslobj
832 return self
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200833
834 @property
835 def context(self):
836 """The SSLContext that is currently in use."""
837 return self._sslobj.context
838
839 @context.setter
840 def context(self, ctx):
841 self._sslobj.context = ctx
842
843 @property
Christian Heimes99a65702016-09-10 23:44:53 +0200844 def session(self):
845 """The SSLSession for client socket."""
846 return self._sslobj.session
847
848 @session.setter
849 def session(self, session):
850 self._sslobj.session = session
851
852 @property
853 def session_reused(self):
854 """Was the client session reused during handshake"""
855 return self._sslobj.session_reused
856
857 @property
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200858 def server_side(self):
859 """Whether this is a server-side socket."""
860 return self._sslobj.server_side
861
862 @property
863 def server_hostname(self):
864 """The currently set server hostname (for SNI), or ``None`` if no
Xtreak0d702272019-06-03 04:42:33 +0530865 server hostname is set."""
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200866 return self._sslobj.server_hostname
867
Martin Panterf6b1d662016-03-28 00:22:09 +0000868 def read(self, len=1024, buffer=None):
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200869 """Read up to 'len' bytes from the SSL object and return them.
870
871 If 'buffer' is provided, read into this buffer and return the number of
872 bytes read.
873 """
874 if buffer is not None:
875 v = self._sslobj.read(len, buffer)
876 else:
Martin Panterf6b1d662016-03-28 00:22:09 +0000877 v = self._sslobj.read(len)
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200878 return v
879
880 def write(self, data):
881 """Write 'data' to the SSL object and return the number of bytes
882 written.
883
884 The 'data' argument must support the buffer interface.
885 """
886 return self._sslobj.write(data)
887
888 def getpeercert(self, binary_form=False):
889 """Returns a formatted version of the data in the certificate provided
890 by the other end of the SSL channel.
891
892 Return None if no certificate was provided, {} if a certificate was
893 provided, but not validated.
894 """
Christian Heimes141c5e82018-02-24 21:10:57 +0100895 return self._sslobj.getpeercert(binary_form)
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200896
897 def selected_npn_protocol(self):
898 """Return the currently selected NPN protocol as a string, or ``None``
899 if a next protocol was not negotiated or if NPN is not supported by one
900 of the peers."""
901 if _ssl.HAS_NPN:
902 return self._sslobj.selected_npn_protocol()
903
Benjamin Petersoncca27322015-01-23 16:35:37 -0500904 def selected_alpn_protocol(self):
905 """Return the currently selected ALPN protocol as a string, or ``None``
906 if a next protocol was not negotiated or if ALPN is not supported by one
907 of the peers."""
908 if _ssl.HAS_ALPN:
909 return self._sslobj.selected_alpn_protocol()
910
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200911 def cipher(self):
912 """Return the currently selected cipher as a 3-tuple ``(name,
913 ssl_version, secret_bits)``."""
914 return self._sslobj.cipher()
915
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600916 def shared_ciphers(self):
Benjamin Petersonc114e7d2015-01-11 15:22:07 -0500917 """Return a list of ciphers shared by the client during the handshake or
918 None if this is not a valid server connection.
Benjamin Peterson5318c7a2015-01-07 11:26:50 -0600919 """
Benjamin Peterson4cb17812015-01-07 11:14:26 -0600920 return self._sslobj.shared_ciphers()
921
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200922 def compression(self):
923 """Return the current compression algorithm in use, or ``None`` if
924 compression was not negotiated or not supported by one of the peers."""
925 return self._sslobj.compression()
926
927 def pending(self):
928 """Return the number of bytes that can be read immediately."""
929 return self._sslobj.pending()
930
Antoine Pitrou3cb93792014-10-06 00:21:09 +0200931 def do_handshake(self):
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200932 """Start the SSL/TLS handshake."""
933 self._sslobj.do_handshake()
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200934
935 def unwrap(self):
936 """Start the SSL shutdown handshake."""
937 return self._sslobj.shutdown()
938
939 def get_channel_binding(self, cb_type="tls-unique"):
940 """Get channel binding data for current connection. Raise ValueError
941 if the requested `cb_type` is not supported. Return bytes of the data
942 or None if the data is not available (e.g. before the handshake)."""
Christian Heimes141c5e82018-02-24 21:10:57 +0100943 return self._sslobj.get_channel_binding(cb_type)
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200944
945 def version(self):
946 """Return a string identifying the protocol version used by the
947 current SSL channel. """
948 return self._sslobj.version()
949
Christian Heimes9fb051f2018-09-23 08:32:31 +0200950 def verify_client_post_handshake(self):
951 return self._sslobj.verify_client_post_handshake()
952
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200953
Christian Heimes80ed3532019-05-17 13:08:14 +0200954def _sslcopydoc(func):
955 """Copy docstring from SSLObject to SSLSocket"""
956 func.__doc__ = getattr(SSLObject, func.__name__).__doc__
957 return func
958
959
Antoine Pitrou152efa22010-05-16 18:19:27 +0000960class SSLSocket(socket):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000961 """This class implements a subtype of socket.socket that wraps
962 the underlying OS socket in an SSL context when necessary, and
Christian Heimes9d50ab52018-02-27 10:17:30 +0100963 provides read and write methods over that channel. """
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000964
Christian Heimes9d50ab52018-02-27 10:17:30 +0100965 def __init__(self, *args, **kwargs):
966 raise TypeError(
967 f"{self.__class__.__name__} does not have a public "
968 f"constructor. Instances are returned by "
969 f"SSLContext.wrap_socket()."
970 )
Bill Janssen6e027db2007-11-15 22:23:56 +0000971
Christian Heimes9d50ab52018-02-27 10:17:30 +0100972 @classmethod
973 def _create(cls, sock, server_side=False, do_handshake_on_connect=True,
974 suppress_ragged_eofs=True, server_hostname=None,
975 context=None, session=None):
Antoine Pitrou3e86ba42013-12-28 17:26:33 +0100976 if sock.getsockopt(SOL_SOCKET, SO_TYPE) != SOCK_STREAM:
977 raise NotImplementedError("only stream sockets are supported")
Christian Heimes99a65702016-09-10 23:44:53 +0200978 if server_side:
979 if server_hostname:
980 raise ValueError("server_hostname can only be specified "
981 "in client mode")
Christian Heimes9d50ab52018-02-27 10:17:30 +0100982 if session is not None:
Christian Heimes99a65702016-09-10 23:44:53 +0200983 raise ValueError("session can only be specified in "
984 "client mode")
Christian Heimes9d50ab52018-02-27 10:17:30 +0100985 if context.check_hostname and not server_hostname:
Benjamin Peterson7243b572014-11-23 17:04:34 -0600986 raise ValueError("check_hostname requires server_hostname")
Christian Heimes9d50ab52018-02-27 10:17:30 +0100987
988 kwargs = dict(
989 family=sock.family, type=sock.type, proto=sock.proto,
990 fileno=sock.fileno()
991 )
992 self = cls.__new__(cls, **kwargs)
993 super(SSLSocket, self).__init__(**kwargs)
994 self.settimeout(sock.gettimeout())
995 sock.detach()
996
997 self._context = context
998 self._session = session
999 self._closed = False
1000 self._sslobj = None
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001001 self.server_side = server_side
Christian Heimes9d50ab52018-02-27 10:17:30 +01001002 self.server_hostname = context._encode_hostname(server_hostname)
Antoine Pitrou152efa22010-05-16 18:19:27 +00001003 self.do_handshake_on_connect = do_handshake_on_connect
1004 self.suppress_ragged_eofs = suppress_ragged_eofs
Bill Janssen6e027db2007-11-15 22:23:56 +00001005
Antoine Pitrou242db722013-05-01 20:52:07 +02001006 # See if we are connected
1007 try:
1008 self.getpeername()
1009 except OSError as e:
1010 if e.errno != errno.ENOTCONN:
1011 raise
1012 connected = False
1013 else:
1014 connected = True
1015
Antoine Pitroue93bf7a2011-02-26 23:24:06 +00001016 self._connected = connected
Antoine Pitroufa2b9382010-04-26 22:17:47 +00001017 if connected:
1018 # create the SSL object
Bill Janssen6e027db2007-11-15 22:23:56 +00001019 try:
Christian Heimes141c5e82018-02-24 21:10:57 +01001020 self._sslobj = self._context._wrap_socket(
1021 self, server_side, self.server_hostname,
1022 owner=self, session=self._session,
1023 )
Bill Janssen6e027db2007-11-15 22:23:56 +00001024 if do_handshake_on_connect:
Bill Janssen48dc27c2007-12-05 03:38:10 +00001025 timeout = self.gettimeout()
1026 if timeout == 0.0:
1027 # non-blocking
1028 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets")
Bill Janssen6e027db2007-11-15 22:23:56 +00001029 self.do_handshake()
Christian Heimes1aa9a752013-12-02 02:41:19 +01001030 except (OSError, ValueError):
Bill Janssen6e027db2007-11-15 22:23:56 +00001031 self.close()
Christian Heimes1aa9a752013-12-02 02:41:19 +01001032 raise
Christian Heimes9d50ab52018-02-27 10:17:30 +01001033 return self
Antoine Pitrou242db722013-05-01 20:52:07 +02001034
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01001035 @property
Christian Heimes80ed3532019-05-17 13:08:14 +02001036 @_sslcopydoc
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01001037 def context(self):
1038 return self._context
1039
1040 @context.setter
1041 def context(self, ctx):
1042 self._context = ctx
1043 self._sslobj.context = ctx
Bill Janssen6e027db2007-11-15 22:23:56 +00001044
Christian Heimes99a65702016-09-10 23:44:53 +02001045 @property
Christian Heimes80ed3532019-05-17 13:08:14 +02001046 @_sslcopydoc
Christian Heimes99a65702016-09-10 23:44:53 +02001047 def session(self):
Christian Heimes99a65702016-09-10 23:44:53 +02001048 if self._sslobj is not None:
1049 return self._sslobj.session
1050
1051 @session.setter
1052 def session(self, session):
1053 self._session = session
1054 if self._sslobj is not None:
1055 self._sslobj.session = session
1056
1057 @property
Christian Heimes80ed3532019-05-17 13:08:14 +02001058 @_sslcopydoc
Christian Heimes99a65702016-09-10 23:44:53 +02001059 def session_reused(self):
Christian Heimes99a65702016-09-10 23:44:53 +02001060 if self._sslobj is not None:
1061 return self._sslobj.session_reused
1062
Guido van Rossumb7b030e2007-11-16 01:28:45 +00001063 def dup(self):
Serhiy Storchaka42b1d612018-12-06 22:36:55 +02001064 raise NotImplementedError("Can't dup() %s instances" %
1065 self.__class__.__name__)
Guido van Rossumb7b030e2007-11-16 01:28:45 +00001066
Bill Janssen6e027db2007-11-15 22:23:56 +00001067 def _checkClosed(self, msg=None):
1068 # raise an exception here if you wish to check for spurious closes
1069 pass
1070
Antoine Pitrou242db722013-05-01 20:52:07 +02001071 def _check_connected(self):
1072 if not self._connected:
1073 # getpeername() will raise ENOTCONN if the socket is really
1074 # not connected; note that we can be connected even without
1075 # _connected being set, e.g. if connect() first returned
1076 # EAGAIN.
1077 self.getpeername()
1078
Martin Panterf6b1d662016-03-28 00:22:09 +00001079 def read(self, len=1024, buffer=None):
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001080 """Read up to LEN bytes and return them.
1081 Return zero-length string on EOF."""
1082
Bill Janssen6e027db2007-11-15 22:23:56 +00001083 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001084 if self._sslobj is None:
Antoine Pitrou60a26e02013-07-20 19:35:16 +02001085 raise ValueError("Read on closed or unwrapped SSL socket.")
Bill Janssen6e027db2007-11-15 22:23:56 +00001086 try:
Christian Heimes141c5e82018-02-24 21:10:57 +01001087 if buffer is not None:
1088 return self._sslobj.read(len, buffer)
1089 else:
1090 return self._sslobj.read(len)
Bill Janssen6e027db2007-11-15 22:23:56 +00001091 except SSLError as x:
1092 if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001093 if buffer is not None:
Bill Janssen54cc54c2007-12-14 22:08:56 +00001094 return 0
1095 else:
1096 return b''
Bill Janssen6e027db2007-11-15 22:23:56 +00001097 else:
1098 raise
Thomas Woutersed03b412007-08-28 21:37:11 +00001099
1100 def write(self, data):
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001101 """Write DATA to the underlying SSL channel. Returns
1102 number of bytes of DATA actually transmitted."""
1103
Bill Janssen6e027db2007-11-15 22:23:56 +00001104 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001105 if self._sslobj is None:
Antoine Pitrou60a26e02013-07-20 19:35:16 +02001106 raise ValueError("Write on closed or unwrapped SSL socket.")
Thomas Woutersed03b412007-08-28 21:37:11 +00001107 return self._sslobj.write(data)
1108
Christian Heimes80ed3532019-05-17 13:08:14 +02001109 @_sslcopydoc
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001110 def getpeercert(self, binary_form=False):
Bill Janssen6e027db2007-11-15 22:23:56 +00001111 self._checkClosed()
Antoine Pitrou242db722013-05-01 20:52:07 +02001112 self._check_connected()
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001113 return self._sslobj.getpeercert(binary_form)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001114
Christian Heimes80ed3532019-05-17 13:08:14 +02001115 @_sslcopydoc
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001116 def selected_npn_protocol(self):
1117 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001118 if self._sslobj is None or not _ssl.HAS_NPN:
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001119 return None
1120 else:
1121 return self._sslobj.selected_npn_protocol()
1122
Christian Heimes80ed3532019-05-17 13:08:14 +02001123 @_sslcopydoc
Benjamin Petersoncca27322015-01-23 16:35:37 -05001124 def selected_alpn_protocol(self):
1125 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001126 if self._sslobj is None or not _ssl.HAS_ALPN:
Benjamin Petersoncca27322015-01-23 16:35:37 -05001127 return None
1128 else:
1129 return self._sslobj.selected_alpn_protocol()
1130
Christian Heimes80ed3532019-05-17 13:08:14 +02001131 @_sslcopydoc
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001132 def cipher(self):
Bill Janssen6e027db2007-11-15 22:23:56 +00001133 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001134 if self._sslobj is None:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001135 return None
1136 else:
1137 return self._sslobj.cipher()
Thomas Woutersed03b412007-08-28 21:37:11 +00001138
Christian Heimes80ed3532019-05-17 13:08:14 +02001139 @_sslcopydoc
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001140 def shared_ciphers(self):
1141 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001142 if self._sslobj is None:
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001143 return None
Christian Heimes141c5e82018-02-24 21:10:57 +01001144 else:
1145 return self._sslobj.shared_ciphers()
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001146
Christian Heimes80ed3532019-05-17 13:08:14 +02001147 @_sslcopydoc
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01001148 def compression(self):
1149 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001150 if self._sslobj is None:
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01001151 return None
1152 else:
1153 return self._sslobj.compression()
1154
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001155 def send(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +00001156 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001157 if self._sslobj is not None:
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001158 if flags != 0:
1159 raise ValueError(
1160 "non-zero flags not allowed in calls to send() on %s" %
1161 self.__class__)
Antoine Pitroub4bebda2014-04-29 10:03:28 +02001162 return self._sslobj.write(data)
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001163 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001164 return super().send(data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +00001165
Antoine Pitroua468adc2010-09-14 14:43:44 +00001166 def sendto(self, data, flags_or_addr, addr=None):
Bill Janssen6e027db2007-11-15 22:23:56 +00001167 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001168 if self._sslobj is not None:
Bill Janssen980f3142008-06-29 00:05:51 +00001169 raise ValueError("sendto not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001170 self.__class__)
Antoine Pitroua468adc2010-09-14 14:43:44 +00001171 elif addr is None:
Mads Jensen746cc752018-01-27 13:34:28 +01001172 return super().sendto(data, flags_or_addr)
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001173 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001174 return super().sendto(data, flags_or_addr, addr)
Thomas Woutersed03b412007-08-28 21:37:11 +00001175
Nick Coghlan513886a2011-08-28 00:00:27 +10001176 def sendmsg(self, *args, **kwargs):
1177 # Ensure programs don't send data unencrypted if they try to
1178 # use this method.
1179 raise NotImplementedError("sendmsg not allowed on instances of %s" %
1180 self.__class__)
1181
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001182 def sendall(self, data, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +00001183 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001184 if self._sslobj is not None:
Giampaolo Rodolà374f8352010-08-29 12:08:09 +00001185 if flags != 0:
1186 raise ValueError(
1187 "non-zero flags not allowed in calls to sendall() on %s" %
1188 self.__class__)
Bill Janssen6e027db2007-11-15 22:23:56 +00001189 count = 0
Christian Heimes888bbdc2017-09-07 14:18:21 -07001190 with memoryview(data) as view, view.cast("B") as byte_view:
1191 amount = len(byte_view)
1192 while count < amount:
1193 v = self.send(byte_view[count:])
1194 count += v
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001195 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001196 return super().sendall(data, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +00001197
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02001198 def sendfile(self, file, offset=0, count=None):
1199 """Send a file, possibly by using os.sendfile() if this is a
1200 clear-text socket. Return the total number of bytes sent.
1201 """
Christian Heimes141c5e82018-02-24 21:10:57 +01001202 if self._sslobj is not None:
1203 return self._sendfile_use_send(file, offset, count)
1204 else:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02001205 # os.sendfile() works with plain sockets only
1206 return super().sendfile(file, offset, count)
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02001207
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001208 def recv(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +00001209 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001210 if self._sslobj is not None:
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001211 if flags != 0:
1212 raise ValueError(
Antoine Pitrou5733c082010-03-22 14:49:10 +00001213 "non-zero flags not allowed in calls to recv() on %s" %
1214 self.__class__)
1215 return self.read(buflen)
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001216 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001217 return super().recv(buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +00001218
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001219 def recv_into(self, buffer, nbytes=None, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +00001220 self._checkClosed()
1221 if buffer and (nbytes is None):
1222 nbytes = len(buffer)
1223 elif nbytes is None:
1224 nbytes = 1024
Christian Heimes141c5e82018-02-24 21:10:57 +01001225 if self._sslobj is not None:
Bill Janssen6e027db2007-11-15 22:23:56 +00001226 if flags != 0:
1227 raise ValueError(
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001228 "non-zero flags not allowed in calls to recv_into() on %s" %
1229 self.__class__)
Antoine Pitrou5733c082010-03-22 14:49:10 +00001230 return self.read(nbytes, buffer)
Bill Janssen6e027db2007-11-15 22:23:56 +00001231 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001232 return super().recv_into(buffer, nbytes, flags)
Bill Janssen6e027db2007-11-15 22:23:56 +00001233
Antoine Pitroua468adc2010-09-14 14:43:44 +00001234 def recvfrom(self, buflen=1024, flags=0):
Bill Janssen6e027db2007-11-15 22:23:56 +00001235 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001236 if self._sslobj is not None:
Bill Janssen980f3142008-06-29 00:05:51 +00001237 raise ValueError("recvfrom not allowed on instances of %s" %
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001238 self.__class__)
1239 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001240 return super().recvfrom(buflen, flags)
Thomas Woutersed03b412007-08-28 21:37:11 +00001241
Bill Janssen58afe4c2008-09-08 16:45:19 +00001242 def recvfrom_into(self, buffer, nbytes=None, flags=0):
1243 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001244 if self._sslobj is not None:
Bill Janssen58afe4c2008-09-08 16:45:19 +00001245 raise ValueError("recvfrom_into not allowed on instances of %s" %
1246 self.__class__)
1247 else:
Mads Jensen746cc752018-01-27 13:34:28 +01001248 return super().recvfrom_into(buffer, nbytes, flags)
Bill Janssen58afe4c2008-09-08 16:45:19 +00001249
Nick Coghlan513886a2011-08-28 00:00:27 +10001250 def recvmsg(self, *args, **kwargs):
1251 raise NotImplementedError("recvmsg not allowed on instances of %s" %
1252 self.__class__)
1253
1254 def recvmsg_into(self, *args, **kwargs):
1255 raise NotImplementedError("recvmsg_into not allowed on instances of "
1256 "%s" % self.__class__)
1257
Christian Heimes80ed3532019-05-17 13:08:14 +02001258 @_sslcopydoc
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001259 def pending(self):
Bill Janssen6e027db2007-11-15 22:23:56 +00001260 self._checkClosed()
Christian Heimes141c5e82018-02-24 21:10:57 +01001261 if self._sslobj is not None:
Bill Janssen6e027db2007-11-15 22:23:56 +00001262 return self._sslobj.pending()
1263 else:
1264 return 0
1265
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001266 def shutdown(self, how):
Bill Janssen6e027db2007-11-15 22:23:56 +00001267 self._checkClosed()
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001268 self._sslobj = None
Mads Jensen746cc752018-01-27 13:34:28 +01001269 super().shutdown(how)
Thomas Woutersed03b412007-08-28 21:37:11 +00001270
Christian Heimes80ed3532019-05-17 13:08:14 +02001271 @_sslcopydoc
Ezio Melottidc55e672010-01-18 09:15:14 +00001272 def unwrap(self):
Bill Janssen40a0f662008-08-12 16:56:25 +00001273 if self._sslobj:
Christian Heimes141c5e82018-02-24 21:10:57 +01001274 s = self._sslobj.shutdown()
Bill Janssen40a0f662008-08-12 16:56:25 +00001275 self._sslobj = None
1276 return s
1277 else:
1278 raise ValueError("No SSL wrapper around " + str(self))
1279
Christian Heimes80ed3532019-05-17 13:08:14 +02001280 @_sslcopydoc
Christian Heimes9fb051f2018-09-23 08:32:31 +02001281 def verify_client_post_handshake(self):
1282 if self._sslobj:
1283 return self._sslobj.verify_client_post_handshake()
1284 else:
1285 raise ValueError("No SSL wrapper around " + str(self))
1286
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001287 def _real_close(self):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001288 self._sslobj = None
Mads Jensen746cc752018-01-27 13:34:28 +01001289 super()._real_close()
Bill Janssen6e027db2007-11-15 22:23:56 +00001290
Christian Heimes80ed3532019-05-17 13:08:14 +02001291 @_sslcopydoc
Bill Janssen48dc27c2007-12-05 03:38:10 +00001292 def do_handshake(self, block=False):
Antoine Pitrou242db722013-05-01 20:52:07 +02001293 self._check_connected()
Bill Janssen48dc27c2007-12-05 03:38:10 +00001294 timeout = self.gettimeout()
Bill Janssen6e027db2007-11-15 22:23:56 +00001295 try:
Bill Janssen48dc27c2007-12-05 03:38:10 +00001296 if timeout == 0.0 and block:
1297 self.settimeout(None)
Bill Janssen6e027db2007-11-15 22:23:56 +00001298 self._sslobj.do_handshake()
Bill Janssen48dc27c2007-12-05 03:38:10 +00001299 finally:
1300 self.settimeout(timeout)
Thomas Woutersed03b412007-08-28 21:37:11 +00001301
Antoine Pitroub4410db2011-05-18 18:51:06 +02001302 def _real_connect(self, addr, connect_ex):
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001303 if self.server_side:
1304 raise ValueError("can't connect in server-side mode")
Thomas Woutersed03b412007-08-28 21:37:11 +00001305 # Here we assume that the socket is client-side, and not
1306 # connected at the time of the call. We connect it, then wrap it.
Christian Heimes141c5e82018-02-24 21:10:57 +01001307 if self._connected or self._sslobj is not None:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001308 raise ValueError("attempt to connect already-connected SSLSocket!")
Christian Heimes141c5e82018-02-24 21:10:57 +01001309 self._sslobj = self.context._wrap_socket(
1310 self, False, self.server_hostname,
1311 owner=self, session=self._session
1312 )
Bill Janssen54cc54c2007-12-14 22:08:56 +00001313 try:
Antoine Pitroub4410db2011-05-18 18:51:06 +02001314 if connect_ex:
Mads Jensen746cc752018-01-27 13:34:28 +01001315 rc = super().connect_ex(addr)
Antoine Pitroue93bf7a2011-02-26 23:24:06 +00001316 else:
Antoine Pitroub4410db2011-05-18 18:51:06 +02001317 rc = None
Mads Jensen746cc752018-01-27 13:34:28 +01001318 super().connect(addr)
Antoine Pitroub4410db2011-05-18 18:51:06 +02001319 if not rc:
Antoine Pitrou242db722013-05-01 20:52:07 +02001320 self._connected = True
Antoine Pitroub4410db2011-05-18 18:51:06 +02001321 if self.do_handshake_on_connect:
1322 self.do_handshake()
Antoine Pitroub4410db2011-05-18 18:51:06 +02001323 return rc
Christian Heimes1aa9a752013-12-02 02:41:19 +01001324 except (OSError, ValueError):
Antoine Pitroub4410db2011-05-18 18:51:06 +02001325 self._sslobj = None
1326 raise
Antoine Pitroue93bf7a2011-02-26 23:24:06 +00001327
1328 def connect(self, addr):
1329 """Connects to remote ADDR, and then wraps the connection in
1330 an SSL channel."""
1331 self._real_connect(addr, False)
1332
1333 def connect_ex(self, addr):
1334 """Connects to remote ADDR, and then wraps the connection in
1335 an SSL channel."""
1336 return self._real_connect(addr, True)
Thomas Woutersed03b412007-08-28 21:37:11 +00001337
1338 def accept(self):
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001339 """Accepts a new connection from a remote client, and returns
1340 a tuple containing that new connection wrapped with a server-side
1341 SSL channel, and the address of the remote client."""
1342
Mads Jensen746cc752018-01-27 13:34:28 +01001343 newsock, addr = super().accept()
Antoine Pitrou5c89b4e2012-11-11 01:25:36 +01001344 newsock = self.context.wrap_socket(newsock,
1345 do_handshake_on_connect=self.do_handshake_on_connect,
1346 suppress_ragged_eofs=self.suppress_ragged_eofs,
1347 server_side=True)
1348 return newsock, addr
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001349
Christian Heimes80ed3532019-05-17 13:08:14 +02001350 @_sslcopydoc
Antoine Pitroud6494802011-07-21 01:11:30 +02001351 def get_channel_binding(self, cb_type="tls-unique"):
Christian Heimes141c5e82018-02-24 21:10:57 +01001352 if self._sslobj is not None:
1353 return self._sslobj.get_channel_binding(cb_type)
1354 else:
1355 if cb_type not in CHANNEL_BINDING_TYPES:
1356 raise ValueError(
1357 "{0} channel binding type not implemented".format(cb_type)
1358 )
Antoine Pitroud6494802011-07-21 01:11:30 +02001359 return None
Antoine Pitroud6494802011-07-21 01:11:30 +02001360
Christian Heimes80ed3532019-05-17 13:08:14 +02001361 @_sslcopydoc
Antoine Pitrou47e40422014-09-04 21:00:10 +02001362 def version(self):
Christian Heimes141c5e82018-02-24 21:10:57 +01001363 if self._sslobj is not None:
1364 return self._sslobj.version()
1365 else:
Antoine Pitrou47e40422014-09-04 21:00:10 +02001366 return None
Antoine Pitrou47e40422014-09-04 21:00:10 +02001367
Bill Janssen54cc54c2007-12-14 22:08:56 +00001368
Christian Heimes4df60f12017-09-15 20:26:05 +02001369# Python does not support forward declaration of types.
1370SSLContext.sslsocket_class = SSLSocket
1371SSLContext.sslobject_class = SSLObject
1372
1373
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001374def wrap_socket(sock, keyfile=None, certfile=None,
1375 server_side=False, cert_reqs=CERT_NONE,
Christian Heimes598894f2016-09-05 23:19:05 +02001376 ssl_version=PROTOCOL_TLS, ca_certs=None,
Bill Janssen48dc27c2007-12-05 03:38:10 +00001377 do_handshake_on_connect=True,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001378 suppress_ragged_eofs=True,
1379 ciphers=None):
Christian Heimes9d50ab52018-02-27 10:17:30 +01001380
1381 if server_side and not certfile:
1382 raise ValueError("certfile must be specified for server-side "
1383 "operations")
1384 if keyfile and not certfile:
1385 raise ValueError("certfile must be specified")
1386 context = SSLContext(ssl_version)
1387 context.verify_mode = cert_reqs
1388 if ca_certs:
1389 context.load_verify_locations(ca_certs)
1390 if certfile:
1391 context.load_cert_chain(certfile, keyfile)
1392 if ciphers:
1393 context.set_ciphers(ciphers)
1394 return context.wrap_socket(
1395 sock=sock, server_side=server_side,
1396 do_handshake_on_connect=do_handshake_on_connect,
1397 suppress_ragged_eofs=suppress_ragged_eofs
1398 )
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001399
Thomas Woutersed03b412007-08-28 21:37:11 +00001400# some utility functions
1401
1402def cert_time_to_seconds(cert_time):
Antoine Pitrouc695c952014-04-28 20:57:36 +02001403 """Return the time in seconds since the Epoch, given the timestring
1404 representing the "notBefore" or "notAfter" date from a certificate
1405 in ``"%b %d %H:%M:%S %Y %Z"`` strptime format (C locale).
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001406
Antoine Pitrouc695c952014-04-28 20:57:36 +02001407 "notBefore" or "notAfter" dates must use UTC (RFC 5280).
1408
1409 Month is one of: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1410 UTC should be specified as GMT (see ASN1_TIME_print())
1411 """
1412 from time import strptime
1413 from calendar import timegm
1414
1415 months = (
1416 "Jan","Feb","Mar","Apr","May","Jun",
1417 "Jul","Aug","Sep","Oct","Nov","Dec"
1418 )
1419 time_format = ' %d %H:%M:%S %Y GMT' # NOTE: no month, fixed GMT
1420 try:
1421 month_number = months.index(cert_time[:3].title()) + 1
1422 except ValueError:
1423 raise ValueError('time data %r does not match '
1424 'format "%%b%s"' % (cert_time, time_format))
1425 else:
1426 # found valid month
1427 tt = strptime(cert_time[3:], time_format)
1428 # return an integer, the previous mktime()-based implementation
1429 # returned a float (fractional seconds are always zero here).
1430 return timegm((tt[0], month_number) + tt[2:6])
Thomas Woutersed03b412007-08-28 21:37:11 +00001431
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001432PEM_HEADER = "-----BEGIN CERTIFICATE-----"
1433PEM_FOOTER = "-----END CERTIFICATE-----"
1434
1435def DER_cert_to_PEM_cert(der_cert_bytes):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001436 """Takes a certificate in binary DER format and returns the
1437 PEM version of it as a string."""
1438
Bill Janssen6e027db2007-11-15 22:23:56 +00001439 f = str(base64.standard_b64encode(der_cert_bytes), 'ASCII', 'strict')
INADA Naokib75a2282017-10-02 16:33:42 +09001440 ss = [PEM_HEADER]
1441 ss += [f[i:i+64] for i in range(0, len(f), 64)]
1442 ss.append(PEM_FOOTER + '\n')
1443 return '\n'.join(ss)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001444
1445def PEM_cert_to_DER_cert(pem_cert_string):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001446 """Takes a certificate in ASCII PEM format and returns the
1447 DER-encoded version of it as a byte sequence"""
1448
1449 if not pem_cert_string.startswith(PEM_HEADER):
1450 raise ValueError("Invalid PEM encoding; must start with %s"
1451 % PEM_HEADER)
1452 if not pem_cert_string.strip().endswith(PEM_FOOTER):
1453 raise ValueError("Invalid PEM encoding; must end with %s"
1454 % PEM_FOOTER)
1455 d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)]
Georg Brandl706824f2009-06-04 09:42:55 +00001456 return base64.decodebytes(d.encode('ASCII', 'strict'))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001457
Christian Heimes598894f2016-09-05 23:19:05 +02001458def get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None):
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001459 """Retrieve the certificate from the server at the specified address,
1460 and return it as a PEM-encoded string.
1461 If 'ca_certs' is specified, validate the server cert against it.
1462 If 'ssl_version' is specified, use it in the connection attempt."""
1463
1464 host, port = addr
Christian Heimes67986f92013-11-23 22:43:47 +01001465 if ca_certs is not None:
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001466 cert_reqs = CERT_REQUIRED
1467 else:
1468 cert_reqs = CERT_NONE
Christian Heimes67986f92013-11-23 22:43:47 +01001469 context = _create_stdlib_context(ssl_version,
1470 cert_reqs=cert_reqs,
1471 cafile=ca_certs)
1472 with create_connection(addr) as sock:
1473 with context.wrap_socket(sock) as sslsock:
1474 dercert = sslsock.getpeercert(True)
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001475 return DER_cert_to_PEM_cert(dercert)
1476
Guido van Rossum5b8b1552007-11-16 00:06:11 +00001477def get_protocol_name(protocol_code):
Victor Stinner3de49192011-05-09 00:42:58 +02001478 return _PROTOCOL_NAMES.get(protocol_code, '<unknown>')