ssl
— TLS/SSL wrapper for socket objects¶
Source code: Lib/ssl.py
This module provides access to Transport Layer Security (often known as “Secure Sockets Layer”) encryption and peer authentication facilities for network sockets, both client-side and server-side. This module uses the OpenSSL library. It is available on all modern Unix systems, Windows, macOS, and probably additional platforms, as long as OpenSSL is installed on that platform.
Note
Some behavior may be platform dependent, since calls are made to the operating system socket APIs. The installed version of OpenSSL may also cause variations in behavior. For example, TLSv1.3 with OpenSSL version 1.1.1.
Warning
Don’t use this module without reading the Security considerations. Doing so may lead to a false sense of security, as the default settings of the ssl module are not necessarily appropriate for your application.
This section documents the objects and functions in the ssl
module; for more
general information about TLS, SSL, and certificates, the reader is referred to
the documents in the “See Also” section at the bottom.
This module provides a class, ssl.SSLSocket
, which is derived from the
socket.socket
type, and provides a socket-like wrapper that also
encrypts and decrypts the data going over the socket with SSL. It supports
additional methods such as getpeercert()
, which retrieves the
certificate of the other side of the connection, and cipher()
, which
retrieves the cipher being used for the secure connection.
For more sophisticated applications, the ssl.SSLContext
class
helps manage settings and certificates, which can then be inherited
by SSL sockets created through the SSLContext.wrap_socket()
method.
Changed in version 3.5.3: Updated to support linking with OpenSSL 1.1.0
Changed in version 3.6: OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported. In the future the ssl module will require at least OpenSSL 1.0.2 or 1.1.0.
Changed in version 3.10: PEP 644 has been implemented. The ssl module requires OpenSSL 1.1.1 or newer.
Use of deprecated constants and functions result in deprecation warnings.
Functions, Constants, and Exceptions¶
Socket creation¶
Since Python 3.2 and 2.7.9, it is recommended to use the
SSLContext.wrap_socket()
of an SSLContext
instance to wrap
sockets as SSLSocket
objects. The helper functions
create_default_context()
returns a new context with secure default
settings. The old wrap_socket()
function is deprecated since it is
both inefficient and has no support for server name indication (SNI) and
hostname matching.
Client socket example with default context and IPv4/IPv6 dual stack:
import socket
import ssl
hostname = 'www.python.org'
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Client socket example with custom context and IPv4:
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Server socket example listening on localhost IPv4:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
sock.bind(('127.0.0.1', 8443))
sock.listen(5)
with context.wrap_socket(sock, server_side=True) as ssock:
conn, addr = ssock.accept()
...
Context creation¶
A convenience function helps create SSLContext
objects for common
purposes.
-
ssl.
create_default_context
(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)¶ Return a new
SSLContext
object with default settings for the given purpose. The settings are chosen by thessl
module, and usually represent a higher security level than when calling theSSLContext
constructor directly.cafile, capath, cadata represent optional CA certificates to trust for certificate verification, as in
SSLContext.load_verify_locations()
. If all three areNone
, this function can choose to trust the system’s default CA certificates instead.The settings are:
PROTOCOL_TLS_CLIENT
orPROTOCOL_TLS_SERVER
,OP_NO_SSLv2
, andOP_NO_SSLv3
with high encryption cipher suites without RC4 and without unauthenticated cipher suites. PassingSERVER_AUTH
as purpose setsverify_mode
toCERT_REQUIRED
and either loads CA certificates (when at least one of cafile, capath or cadata is given) or usesSSLContext.load_default_certs()
to load default CA certificates.When
keylog_filename
is supported and the environment variableSSLKEYLOGFILE
is set,create_default_context()
enables key logging.Note
The protocol, options, cipher and other settings may change to more restrictive values anytime without prior deprecation. The values represent a fair balance between compatibility and security.
If your application needs specific settings, you should create a
SSLContext
and apply the settings yourself.Note
If you find that when certain older clients or servers attempt to connect with a
SSLContext
created by this function that they get an error stating “Protocol or cipher suite mismatch”, it may be that they only support SSL3.0 which this function excludes using theOP_NO_SSLv3
. SSL3.0 is widely considered to be completely broken. If you still wish to continue to use this function but still allow SSL 3.0 connections you can re-enable them using:ctx = ssl.create_default_context(Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3
New in version 3.4.
Changed in version 3.4.4: RC4 was dropped from the default cipher string.
Changed in version 3.6: ChaCha20/Poly1305 was added to the default cipher string.
3DES was dropped from the default cipher string.
Changed in version 3.8: Support for key logging to
SSLKEYLOGFILE
was added.Changed in version 3.10: The context now uses
PROTOCOL_TLS_CLIENT
orPROTOCOL_TLS_SERVER
protocol instead of genericPROTOCOL_TLS
.
Exceptions¶
-
exception
ssl.
SSLError
¶ Raised to signal an error from the underlying SSL implementation (currently provided by the OpenSSL library). This signifies some problem in the higher-level encryption and authentication layer that’s superimposed on the underlying network connection. This error is a subtype of
OSError
. The error code and message ofSSLError
instances are provided by the OpenSSL library.Changed in version 3.3:
SSLError
used to be a subtype ofsocket.error
.-
library
¶ A string mnemonic designating the OpenSSL submodule in which the error occurred, such as
SSL
,PEM
orX509
. The range of possible values depends on the OpenSSL version.New in version 3.3.
-
reason
¶ A string mnemonic designating the reason this error occurred, for example
CERTIFICATE_VERIFY_FAILED
. The range of possible values depends on the OpenSSL version.New in version 3.3.
-
-
exception
ssl.
SSLZeroReturnError
¶ A subclass of
SSLError
raised when trying to read or write and the SSL connection has been closed cleanly. Note that this doesn’t mean that the underlying transport (read TCP) has been closed.New in version 3.3.
-
exception
ssl.
SSLWantReadError
¶ A subclass of
SSLError
raised by a non-blocking SSL socket when trying to read or write data, but more data needs to be received on the underlying TCP transport before the request can be fulfilled.New in version 3.3.
-
exception
ssl.
SSLWantWriteError
¶ A subclass of
SSLError
raised by a non-blocking SSL socket when trying to read or write data, but more data needs to be sent on the underlying TCP transport before the request can be fulfilled.New in version 3.3.
-
exception
ssl.
SSLSyscallError
¶ A subclass of
SSLError
raised when a system error was encountered while trying to fulfill an operation on a SSL socket. Unfortunately, there is no easy way to inspect the original errno number.New in version 3.3.
-
exception
ssl.
SSLEOFError
¶ A subclass of
SSLError
raised when the SSL connection has been terminated abruptly. Generally, you shouldn’t try to reuse the underlying transport when this error is encountered.New in version 3.3.
-
exception
ssl.
SSLCertVerificationError
¶ A subclass of
SSLError
raised when certificate validation has failed.New in version 3.7.
-
verify_code
¶ A numeric error number that denotes the verification error.
-
verify_message
¶ A human readable string of the verification error.
-
-
exception
ssl.
CertificateError
¶ An alias for
SSLCertVerificationError
.Changed in version 3.7: The exception is now an alias for
SSLCertVerificationError
.
Random generation¶
-
ssl.
RAND_bytes
(num)¶ Return num cryptographically strong pseudo-random bytes. Raises an
SSLError
if the PRNG has not been seeded with enough data or if the operation is not supported by the current RAND method.RAND_status()
can be used to check the status of the PRNG andRAND_add()
can be used to seed the PRNG.For almost all applications
os.urandom()
is preferable.Read the Wikipedia article, Cryptographically secure pseudorandom number generator (CSPRNG), to get the requirements of a cryptographically strong generator.
New in version 3.3.
-
ssl.
RAND_pseudo_bytes
(num)¶ Return (bytes, is_cryptographic): bytes are num pseudo-random bytes, is_cryptographic is
True
if the bytes generated are cryptographically strong. Raises anSSLError
if the operation is not supported by the current RAND method.Generated pseudo-random byte sequences will be unique if they are of sufficient length, but are not necessarily unpredictable. They can be used for non-cryptographic purposes and for certain purposes in cryptographic protocols, but usually not for key generation etc.
For almost all applications
os.urandom()
is preferable.New in version 3.3.
Deprecated since version 3.6: OpenSSL has deprecated
ssl.RAND_pseudo_bytes()
, usessl.RAND_bytes()
instead.