17db96d56Sopenharmony_ci:mod:`ssl` --- TLS/SSL wrapper for socket objects
27db96d56Sopenharmony_ci=================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: ssl
57db96d56Sopenharmony_ci   :synopsis: TLS/SSL wrapper for socket objects
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Bill Janssen <bill.janssen@gmail.com>
87db96d56Sopenharmony_ci.. sectionauthor::  Bill Janssen <bill.janssen@gmail.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/ssl.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci.. index:: single: OpenSSL; (use in module ssl)
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci.. index:: TLS, SSL, Transport Layer Security, Secure Sockets Layer
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci--------------
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciThis module provides access to Transport Layer Security (often known as "Secure
197db96d56Sopenharmony_ciSockets Layer") encryption and peer authentication facilities for network
207db96d56Sopenharmony_cisockets, both client-side and server-side.  This module uses the OpenSSL
217db96d56Sopenharmony_cilibrary. It is available on all modern Unix systems, Windows, macOS, and
227db96d56Sopenharmony_ciprobably additional platforms, as long as OpenSSL is installed on that platform.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci.. note::
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci   Some behavior may be platform dependent, since calls are made to the
277db96d56Sopenharmony_ci   operating system socket APIs.  The installed version of OpenSSL may also
287db96d56Sopenharmony_ci   cause variations in behavior. For example, TLSv1.3 with OpenSSL version
297db96d56Sopenharmony_ci   1.1.1.
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci.. warning::
327db96d56Sopenharmony_ci   Don't use this module without reading the :ref:`ssl-security`.  Doing so
337db96d56Sopenharmony_ci   may lead to a false sense of security, as the default settings of the
347db96d56Sopenharmony_ci   ssl module are not necessarily appropriate for your application.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci.. include:: ../includes/wasm-notavail.rst
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciThis section documents the objects and functions in the ``ssl`` module; for more
397db96d56Sopenharmony_cigeneral information about TLS, SSL, and certificates, the reader is referred to
407db96d56Sopenharmony_cithe documents in the "See Also" section at the bottom.
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciThis module provides a class, :class:`ssl.SSLSocket`, which is derived from the
437db96d56Sopenharmony_ci:class:`socket.socket` type, and provides a socket-like wrapper that also
447db96d56Sopenharmony_ciencrypts and decrypts the data going over the socket with SSL.  It supports
457db96d56Sopenharmony_ciadditional methods such as :meth:`getpeercert`, which retrieves the
467db96d56Sopenharmony_cicertificate of the other side of the connection, and :meth:`cipher`, which
477db96d56Sopenharmony_ciretrieves the cipher being used for the secure connection.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ciFor more sophisticated applications, the :class:`ssl.SSLContext` class
507db96d56Sopenharmony_cihelps manage settings and certificates, which can then be inherited
517db96d56Sopenharmony_ciby SSL sockets created through the :meth:`SSLContext.wrap_socket` method.
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci.. versionchanged:: 3.5.3
547db96d56Sopenharmony_ci   Updated to support linking with OpenSSL 1.1.0
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci.. versionchanged:: 3.6
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   OpenSSL 0.9.8, 1.0.0 and 1.0.1 are deprecated and no longer supported.
597db96d56Sopenharmony_ci   In the future the ssl module will require at least OpenSSL 1.0.2 or
607db96d56Sopenharmony_ci   1.1.0.
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci.. versionchanged:: 3.10
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci   :pep:`644` has been implemented. The ssl module requires OpenSSL 1.1.1
657db96d56Sopenharmony_ci   or newer.
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci   Use of deprecated constants and functions result in deprecation warnings.
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ciFunctions, Constants, and Exceptions
717db96d56Sopenharmony_ci------------------------------------
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ciSocket creation
757db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ciSince Python 3.2 and 2.7.9, it is recommended to use the
787db96d56Sopenharmony_ci:meth:`SSLContext.wrap_socket` of an :class:`SSLContext` instance to wrap
797db96d56Sopenharmony_cisockets as :class:`SSLSocket` objects. The helper functions
807db96d56Sopenharmony_ci:func:`create_default_context` returns a new context with secure default
817db96d56Sopenharmony_cisettings. The old :func:`wrap_socket` function is deprecated since it is
827db96d56Sopenharmony_ciboth inefficient and has no support for server name indication (SNI) and
837db96d56Sopenharmony_cihostname matching.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ciClient socket example with default context and IPv4/IPv6 dual stack::
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    import socket
887db96d56Sopenharmony_ci    import ssl
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    hostname = 'www.python.org'
917db96d56Sopenharmony_ci    context = ssl.create_default_context()
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci    with socket.create_connection((hostname, 443)) as sock:
947db96d56Sopenharmony_ci        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
957db96d56Sopenharmony_ci            print(ssock.version())
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ciClient socket example with custom context and IPv4::
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    hostname = 'www.python.org'
1017db96d56Sopenharmony_ci    # PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
1027db96d56Sopenharmony_ci    context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
1037db96d56Sopenharmony_ci    context.load_verify_locations('path/to/cabundle.pem')
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
1067db96d56Sopenharmony_ci        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
1077db96d56Sopenharmony_ci            print(ssock.version())
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ciServer socket example listening on localhost IPv4::
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
1137db96d56Sopenharmony_ci    context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
1167db96d56Sopenharmony_ci        sock.bind(('127.0.0.1', 8443))
1177db96d56Sopenharmony_ci        sock.listen(5)
1187db96d56Sopenharmony_ci        with context.wrap_socket(sock, server_side=True) as ssock:
1197db96d56Sopenharmony_ci            conn, addr = ssock.accept()
1207db96d56Sopenharmony_ci            ...
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ciContext creation
1247db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ciA convenience function helps create :class:`SSLContext` objects for common
1277db96d56Sopenharmony_cipurposes.
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci.. function:: create_default_context(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   Return a new :class:`SSLContext` object with default settings for
1327db96d56Sopenharmony_ci   the given *purpose*.  The settings are chosen by the :mod:`ssl` module,
1337db96d56Sopenharmony_ci   and usually represent a higher security level than when calling the
1347db96d56Sopenharmony_ci   :class:`SSLContext` constructor directly.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   *cafile*, *capath*, *cadata* represent optional CA certificates to
1377db96d56Sopenharmony_ci   trust for certificate verification, as in
1387db96d56Sopenharmony_ci   :meth:`SSLContext.load_verify_locations`.  If all three are
1397db96d56Sopenharmony_ci   :const:`None`, this function can choose to trust the system's default
1407db96d56Sopenharmony_ci   CA certificates instead.
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci   The settings are: :data:`PROTOCOL_TLS_CLIENT` or
1437db96d56Sopenharmony_ci   :data:`PROTOCOL_TLS_SERVER`, :data:`OP_NO_SSLv2`, and :data:`OP_NO_SSLv3`
1447db96d56Sopenharmony_ci   with high encryption cipher suites without RC4 and
1457db96d56Sopenharmony_ci   without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH`
1467db96d56Sopenharmony_ci   as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED`
1477db96d56Sopenharmony_ci   and either loads CA certificates (when at least one of *cafile*, *capath* or
1487db96d56Sopenharmony_ci   *cadata* is given) or uses :meth:`SSLContext.load_default_certs` to load
1497db96d56Sopenharmony_ci   default CA certificates.
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci   When :attr:`~SSLContext.keylog_filename` is supported and the environment
1527db96d56Sopenharmony_ci   variable :envvar:`SSLKEYLOGFILE` is set, :func:`create_default_context`
1537db96d56Sopenharmony_ci   enables key logging.
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci   .. note::
1567db96d56Sopenharmony_ci      The protocol, options, cipher and other settings may change to more
1577db96d56Sopenharmony_ci      restrictive values anytime without prior deprecation.  The values
1587db96d56Sopenharmony_ci      represent a fair balance between compatibility and security.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci      If your application needs specific settings, you should create a
1617db96d56Sopenharmony_ci      :class:`SSLContext` and apply the settings yourself.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci   .. note::
1647db96d56Sopenharmony_ci      If you find that when certain older clients or servers attempt to connect
1657db96d56Sopenharmony_ci      with a :class:`SSLContext` created by this function that they get an error
1667db96d56Sopenharmony_ci      stating "Protocol or cipher suite mismatch", it may be that they only
1677db96d56Sopenharmony_ci      support SSL3.0 which this function excludes using the
1687db96d56Sopenharmony_ci      :data:`OP_NO_SSLv3`. SSL3.0 is widely considered to be `completely broken
1697db96d56Sopenharmony_ci      <https://en.wikipedia.org/wiki/POODLE>`_. If you still wish to continue to
1707db96d56Sopenharmony_ci      use this function but still allow SSL 3.0 connections you can re-enable
1717db96d56Sopenharmony_ci      them using::
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci         ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)
1747db96d56Sopenharmony_ci         ctx.options &= ~ssl.OP_NO_SSLv3
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci   .. versionadded:: 3.4
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci   .. versionchanged:: 3.4.4
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci     RC4 was dropped from the default cipher string.
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci   .. versionchanged:: 3.6
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci     ChaCha20/Poly1305 was added to the default cipher string.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci     3DES was dropped from the default cipher string.
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci   .. versionchanged:: 3.8
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci      Support for key logging to :envvar:`SSLKEYLOGFILE` was added.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci   .. versionchanged:: 3.10
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci      The context now uses :data:`PROTOCOL_TLS_CLIENT` or
1957db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS_SERVER` protocol instead of generic
1967db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS`.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ciExceptions
2007db96d56Sopenharmony_ci^^^^^^^^^^
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. exception:: SSLError
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   Raised to signal an error from the underlying SSL implementation
2057db96d56Sopenharmony_ci   (currently provided by the OpenSSL library).  This signifies some
2067db96d56Sopenharmony_ci   problem in the higher-level encryption and authentication layer that's
2077db96d56Sopenharmony_ci   superimposed on the underlying network connection.  This error
2087db96d56Sopenharmony_ci   is a subtype of :exc:`OSError`.  The error code and message of
2097db96d56Sopenharmony_ci   :exc:`SSLError` instances are provided by the OpenSSL library.
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci   .. versionchanged:: 3.3
2127db96d56Sopenharmony_ci      :exc:`SSLError` used to be a subtype of :exc:`socket.error`.
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci   .. attribute:: library
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci      A string mnemonic designating the OpenSSL submodule in which the error
2177db96d56Sopenharmony_ci      occurred, such as ``SSL``, ``PEM`` or ``X509``.  The range of possible
2187db96d56Sopenharmony_ci      values depends on the OpenSSL version.
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci      .. versionadded:: 3.3
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci   .. attribute:: reason
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci      A string mnemonic designating the reason this error occurred, for
2257db96d56Sopenharmony_ci      example ``CERTIFICATE_VERIFY_FAILED``.  The range of possible
2267db96d56Sopenharmony_ci      values depends on the OpenSSL version.
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci      .. versionadded:: 3.3
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci.. exception:: SSLZeroReturnError
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised when trying to read or write and
2337db96d56Sopenharmony_ci   the SSL connection has been closed cleanly.  Note that this doesn't
2347db96d56Sopenharmony_ci   mean that the underlying transport (read TCP) has been closed.
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   .. versionadded:: 3.3
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci.. exception:: SSLWantReadError
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket
2417db96d56Sopenharmony_ci   <ssl-nonblocking>` when trying to read or write data, but more data needs
2427db96d56Sopenharmony_ci   to be received on the underlying TCP transport before the request can be
2437db96d56Sopenharmony_ci   fulfilled.
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci   .. versionadded:: 3.3
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci.. exception:: SSLWantWriteError
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket
2507db96d56Sopenharmony_ci   <ssl-nonblocking>` when trying to read or write data, but more data needs
2517db96d56Sopenharmony_ci   to be sent on the underlying TCP transport before the request can be
2527db96d56Sopenharmony_ci   fulfilled.
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   .. versionadded:: 3.3
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci.. exception:: SSLSyscallError
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised when a system error was encountered
2597db96d56Sopenharmony_ci   while trying to fulfill an operation on a SSL socket.  Unfortunately,
2607db96d56Sopenharmony_ci   there is no easy way to inspect the original errno number.
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci   .. versionadded:: 3.3
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci.. exception:: SSLEOFError
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised when the SSL connection has been
2677db96d56Sopenharmony_ci   terminated abruptly.  Generally, you shouldn't try to reuse the underlying
2687db96d56Sopenharmony_ci   transport when this error is encountered.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci   .. versionadded:: 3.3
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci.. exception:: SSLCertVerificationError
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci   A subclass of :exc:`SSLError` raised when certificate validation has
2757db96d56Sopenharmony_ci   failed.
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci   .. versionadded:: 3.7
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   .. attribute:: verify_code
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci      A numeric error number that denotes the verification error.
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   .. attribute:: verify_message
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci      A human readable string of the verification error.
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci.. exception:: CertificateError
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci   An alias for :exc:`SSLCertVerificationError`.
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci   .. versionchanged:: 3.7
2927db96d56Sopenharmony_ci      The exception is now an alias for :exc:`SSLCertVerificationError`.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ciRandom generation
2967db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci.. function:: RAND_bytes(num)
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci   Return *num* cryptographically strong pseudo-random bytes. Raises an
3017db96d56Sopenharmony_ci   :class:`SSLError` if the PRNG has not been seeded with enough data or if the
3027db96d56Sopenharmony_ci   operation is not supported by the current RAND method. :func:`RAND_status`
3037db96d56Sopenharmony_ci   can be used to check the status of the PRNG and :func:`RAND_add` can be used
3047db96d56Sopenharmony_ci   to seed the PRNG.
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci   For almost all applications :func:`os.urandom` is preferable.
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci   Read the Wikipedia article, `Cryptographically secure pseudorandom number
3097db96d56Sopenharmony_ci   generator (CSPRNG)
3107db96d56Sopenharmony_ci   <https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator>`_,
3117db96d56Sopenharmony_ci   to get the requirements of a cryptographically strong generator.
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci   .. versionadded:: 3.3
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci.. function:: RAND_pseudo_bytes(num)
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci   Return (bytes, is_cryptographic): bytes are *num* pseudo-random bytes,
3187db96d56Sopenharmony_ci   is_cryptographic is ``True`` if the bytes generated are cryptographically
3197db96d56Sopenharmony_ci   strong. Raises an :class:`SSLError` if the operation is not supported by the
3207db96d56Sopenharmony_ci   current RAND method.
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci   Generated pseudo-random byte sequences will be unique if they are of
3237db96d56Sopenharmony_ci   sufficient length, but are not necessarily unpredictable. They can be used
3247db96d56Sopenharmony_ci   for non-cryptographic purposes and for certain purposes in cryptographic
3257db96d56Sopenharmony_ci   protocols, but usually not for key generation etc.
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci   For almost all applications :func:`os.urandom` is preferable.
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci   .. versionadded:: 3.3
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci   .. deprecated:: 3.6
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci      OpenSSL has deprecated :func:`ssl.RAND_pseudo_bytes`, use
3347db96d56Sopenharmony_ci      :func:`ssl.RAND_bytes` instead.
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci.. function:: RAND_status()
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci   Return ``True`` if the SSL pseudo-random number generator has been seeded
3397db96d56Sopenharmony_ci   with 'enough' randomness, and ``False`` otherwise.  You can use
3407db96d56Sopenharmony_ci   :func:`ssl.RAND_egd` and :func:`ssl.RAND_add` to increase the randomness of
3417db96d56Sopenharmony_ci   the pseudo-random number generator.
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci.. function:: RAND_add(bytes, entropy)
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci   Mix the given *bytes* into the SSL pseudo-random number generator.  The
3467db96d56Sopenharmony_ci   parameter *entropy* (a float) is a lower bound on the entropy contained in
3477db96d56Sopenharmony_ci   string (so you can always use :const:`0.0`).  See :rfc:`1750` for more
3487db96d56Sopenharmony_ci   information on sources of entropy.
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci   .. versionchanged:: 3.5
3517db96d56Sopenharmony_ci      Writable :term:`bytes-like object` is now accepted.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ciCertificate handling
3547db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci.. testsetup::
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci   import ssl
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci.. function:: match_hostname(cert, hostname)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci   Verify that *cert* (in decoded format as returned by
3637db96d56Sopenharmony_ci   :meth:`SSLSocket.getpeercert`) matches the given *hostname*.  The rules
3647db96d56Sopenharmony_ci   applied are those for checking the identity of HTTPS servers as outlined
3657db96d56Sopenharmony_ci   in :rfc:`2818`, :rfc:`5280` and :rfc:`6125`.  In addition to HTTPS, this
3667db96d56Sopenharmony_ci   function should be suitable for checking the identity of servers in
3677db96d56Sopenharmony_ci   various SSL-based protocols such as FTPS, IMAPS, POPS and others.
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci   :exc:`CertificateError` is raised on failure. On success, the function
3707db96d56Sopenharmony_ci   returns nothing::
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci      >>> cert = {'subject': ((('commonName', 'example.com'),),)}
3737db96d56Sopenharmony_ci      >>> ssl.match_hostname(cert, "example.com")
3747db96d56Sopenharmony_ci      >>> ssl.match_hostname(cert, "example.org")
3757db96d56Sopenharmony_ci      Traceback (most recent call last):
3767db96d56Sopenharmony_ci        File "<stdin>", line 1, in <module>
3777db96d56Sopenharmony_ci        File "/home/py3k/Lib/ssl.py", line 130, in match_hostname
3787db96d56Sopenharmony_ci      ssl.CertificateError: hostname 'example.org' doesn't match 'example.com'
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci   .. versionadded:: 3.2
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci   .. versionchanged:: 3.3.3
3837db96d56Sopenharmony_ci      The function now follows :rfc:`6125`, section 6.4.3 and does neither
3847db96d56Sopenharmony_ci      match multiple wildcards (e.g. ``*.*.com`` or ``*a*.example.org``) nor
3857db96d56Sopenharmony_ci      a wildcard inside an internationalized domain names (IDN) fragment.
3867db96d56Sopenharmony_ci      IDN A-labels such as ``www*.xn--pthon-kva.org`` are still supported,
3877db96d56Sopenharmony_ci      but ``x*.python.org`` no longer matches ``xn--tda.python.org``.
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci   .. versionchanged:: 3.5
3907db96d56Sopenharmony_ci      Matching of IP addresses, when present in the subjectAltName field
3917db96d56Sopenharmony_ci      of the certificate, is now supported.
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci   .. versionchanged:: 3.7
3947db96d56Sopenharmony_ci      The function is no longer used to TLS connections. Hostname matching
3957db96d56Sopenharmony_ci      is now performed by OpenSSL.
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci      Allow wildcard when it is the leftmost and the only character
3987db96d56Sopenharmony_ci      in that segment. Partial wildcards like ``www*.example.com`` are no
3997db96d56Sopenharmony_ci      longer supported.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci   .. deprecated:: 3.7
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci.. function:: cert_time_to_seconds(cert_time)
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci   Return the time in seconds since the Epoch, given the ``cert_time``
4067db96d56Sopenharmony_ci   string representing the "notBefore" or "notAfter" date from a
4077db96d56Sopenharmony_ci   certificate in ``"%b %d %H:%M:%S %Y %Z"`` strptime format (C
4087db96d56Sopenharmony_ci   locale).
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci   Here's an example:
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci   .. doctest:: newcontext
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci      >>> import ssl
4157db96d56Sopenharmony_ci      >>> timestamp = ssl.cert_time_to_seconds("Jan  5 09:34:43 2018 GMT")
4167db96d56Sopenharmony_ci      >>> timestamp  # doctest: +SKIP
4177db96d56Sopenharmony_ci      1515144883
4187db96d56Sopenharmony_ci      >>> from datetime import datetime
4197db96d56Sopenharmony_ci      >>> print(datetime.utcfromtimestamp(timestamp))  # doctest: +SKIP
4207db96d56Sopenharmony_ci      2018-01-05 09:34:43
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci   "notBefore" or "notAfter" dates must use GMT (:rfc:`5280`).
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci   .. versionchanged:: 3.5
4257db96d56Sopenharmony_ci      Interpret the input time as a time in UTC as specified by 'GMT'
4267db96d56Sopenharmony_ci      timezone in the input string. Local timezone was used
4277db96d56Sopenharmony_ci      previously. Return an integer (no fractions of a second in the
4287db96d56Sopenharmony_ci      input format)
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, \
4317db96d56Sopenharmony_ci                                     ca_certs=None[, timeout])
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci   Given the address ``addr`` of an SSL-protected server, as a (*hostname*,
4347db96d56Sopenharmony_ci   *port-number*) pair, fetches the server's certificate, and returns it as a
4357db96d56Sopenharmony_ci   PEM-encoded string.  If ``ssl_version`` is specified, uses that version of
4367db96d56Sopenharmony_ci   the SSL protocol to attempt to connect to the server.  If ``ca_certs`` is
4377db96d56Sopenharmony_ci   specified, it should be a file containing a list of root certificates, the
4387db96d56Sopenharmony_ci   same format as used for the same parameter in
4397db96d56Sopenharmony_ci   :meth:`SSLContext.wrap_socket`.  The call will attempt to validate the
4407db96d56Sopenharmony_ci   server certificate against that set of root certificates, and will fail
4417db96d56Sopenharmony_ci   if the validation attempt fails.  A timeout can be specified with the
4427db96d56Sopenharmony_ci   ``timeout`` parameter.
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci   .. versionchanged:: 3.3
4457db96d56Sopenharmony_ci      This function is now IPv6-compatible.
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci   .. versionchanged:: 3.5
4487db96d56Sopenharmony_ci      The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to
4497db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS` for maximum compatibility with modern servers.
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci   .. versionchanged:: 3.10
4527db96d56Sopenharmony_ci      The *timeout* parameter was added.
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci.. function:: DER_cert_to_PEM_cert(DER_cert_bytes)
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci   Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded
4577db96d56Sopenharmony_ci   string version of the same certificate.
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci.. function:: PEM_cert_to_DER_cert(PEM_cert_string)
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci   Given a certificate as an ASCII PEM string, returns a DER-encoded sequence of
4627db96d56Sopenharmony_ci   bytes for that same certificate.
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci.. function:: get_default_verify_paths()
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci   Returns a named tuple with paths to OpenSSL's default cafile and capath.
4677db96d56Sopenharmony_ci   The paths are the same as used by
4687db96d56Sopenharmony_ci   :meth:`SSLContext.set_default_verify_paths`. The return value is a
4697db96d56Sopenharmony_ci   :term:`named tuple` ``DefaultVerifyPaths``:
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci   * :attr:`cafile` - resolved path to cafile or ``None`` if the file doesn't exist,
4727db96d56Sopenharmony_ci   * :attr:`capath` - resolved path to capath or ``None`` if the directory doesn't exist,
4737db96d56Sopenharmony_ci   * :attr:`openssl_cafile_env` - OpenSSL's environment key that points to a cafile,
4747db96d56Sopenharmony_ci   * :attr:`openssl_cafile` - hard coded path to a cafile,
4757db96d56Sopenharmony_ci   * :attr:`openssl_capath_env` - OpenSSL's environment key that points to a capath,
4767db96d56Sopenharmony_ci   * :attr:`openssl_capath` - hard coded path to a capath directory
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci   .. versionadded:: 3.4
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci.. function:: enum_certificates(store_name)
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci   Retrieve certificates from Windows' system cert store. *store_name* may be
4837db96d56Sopenharmony_ci   one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert
4847db96d56Sopenharmony_ci   stores, too.
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci   The function returns a list of (cert_bytes, encoding_type, trust) tuples.
4877db96d56Sopenharmony_ci   The encoding_type specifies the encoding of cert_bytes. It is either
4887db96d56Sopenharmony_ci   :const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for
4897db96d56Sopenharmony_ci   PKCS#7 ASN.1 data. Trust specifies the purpose of the certificate as a set
4907db96d56Sopenharmony_ci   of OIDS or exactly ``True`` if the certificate is trustworthy for all
4917db96d56Sopenharmony_ci   purposes.
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci   Example::
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci      >>> ssl.enum_certificates("CA")
4967db96d56Sopenharmony_ci      [(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),
4977db96d56Sopenharmony_ci       (b'data...', 'x509_asn', True)]
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci   .. availability:: Windows.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci   .. versionadded:: 3.4
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci.. function:: enum_crls(store_name)
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci   Retrieve CRLs from Windows' system cert store. *store_name* may be
5067db96d56Sopenharmony_ci   one of ``CA``, ``ROOT`` or ``MY``. Windows may provide additional cert
5077db96d56Sopenharmony_ci   stores, too.
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci   The function returns a list of (cert_bytes, encoding_type, trust) tuples.
5107db96d56Sopenharmony_ci   The encoding_type specifies the encoding of cert_bytes. It is either
5117db96d56Sopenharmony_ci   :const:`x509_asn` for X.509 ASN.1 data or :const:`pkcs_7_asn` for
5127db96d56Sopenharmony_ci   PKCS#7 ASN.1 data.
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci   .. availability:: Windows.
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci   .. versionadded:: 3.4
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci.. function:: wrap_socket(sock, keyfile=None, certfile=None, \
5197db96d56Sopenharmony_ci       server_side=False, cert_reqs=CERT_NONE, ssl_version=PROTOCOL_TLS, \
5207db96d56Sopenharmony_ci       ca_certs=None, do_handshake_on_connect=True, \
5217db96d56Sopenharmony_ci       suppress_ragged_eofs=True, ciphers=None)
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci   Takes an instance ``sock`` of :class:`socket.socket`, and returns an instance
5247db96d56Sopenharmony_ci   of :class:`ssl.SSLSocket`, a subtype of :class:`socket.socket`, which wraps
5257db96d56Sopenharmony_ci   the underlying socket in an SSL context.  ``sock`` must be a
5267db96d56Sopenharmony_ci   :data:`~socket.SOCK_STREAM` socket; other socket types are unsupported.
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci   Internally, function creates a :class:`SSLContext` with protocol
5297db96d56Sopenharmony_ci   *ssl_version* and :attr:`SSLContext.options` set to *cert_reqs*. If
5307db96d56Sopenharmony_ci   parameters *keyfile*, *certfile*, *ca_certs* or *ciphers* are set, then
5317db96d56Sopenharmony_ci   the values are passed to :meth:`SSLContext.load_cert_chain`,
5327db96d56Sopenharmony_ci   :meth:`SSLContext.load_verify_locations`, and
5337db96d56Sopenharmony_ci   :meth:`SSLContext.set_ciphers`.
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_ci   The arguments *server_side*, *do_handshake_on_connect*, and
5367db96d56Sopenharmony_ci   *suppress_ragged_eofs* have the same meaning as
5377db96d56Sopenharmony_ci   :meth:`SSLContext.wrap_socket`.
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci   .. deprecated:: 3.7
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci      Since Python 3.2 and 2.7.9, it is recommended to use the
5427db96d56Sopenharmony_ci      :meth:`SSLContext.wrap_socket` instead of :func:`wrap_socket`. The
5437db96d56Sopenharmony_ci      top-level function is limited and creates an insecure client socket
5447db96d56Sopenharmony_ci      without server name indication or hostname matching.
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ciConstants
5477db96d56Sopenharmony_ci^^^^^^^^^
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci   All constants are now :class:`enum.IntEnum` or :class:`enum.IntFlag` collections.
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci   .. versionadded:: 3.6
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci.. data:: CERT_NONE
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_mode`, or the ``cert_reqs``
5567db96d56Sopenharmony_ci   parameter to :func:`wrap_socket`.  Except for :const:`PROTOCOL_TLS_CLIENT`,
5577db96d56Sopenharmony_ci   it is the default mode.  With client-side sockets, just about any
5587db96d56Sopenharmony_ci   cert is accepted.  Validation errors, such as untrusted or expired cert,
5597db96d56Sopenharmony_ci   are ignored and do not abort the TLS/SSL handshake.
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci   In server mode, no certificate is requested from the client, so the client
5627db96d56Sopenharmony_ci   does not send any for client cert authentication.
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci   See the discussion of :ref:`ssl-security` below.
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci.. data:: CERT_OPTIONAL
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_mode`, or the ``cert_reqs``
5697db96d56Sopenharmony_ci   parameter to :func:`wrap_socket`.  In client mode, :const:`CERT_OPTIONAL`
5707db96d56Sopenharmony_ci   has the same meaning as :const:`CERT_REQUIRED`. It is recommended to
5717db96d56Sopenharmony_ci   use :const:`CERT_REQUIRED` for client-side sockets instead.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci   In server mode, a client certificate request is sent to the client.  The
5747db96d56Sopenharmony_ci   client may either ignore the request or send a certificate in order
5757db96d56Sopenharmony_ci   perform TLS client cert authentication.  If the client chooses to send
5767db96d56Sopenharmony_ci   a certificate, it is verified.  Any verification error immediately aborts
5777db96d56Sopenharmony_ci   the TLS handshake.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci   Use of this setting requires a valid set of CA certificates to
5807db96d56Sopenharmony_ci   be passed, either to :meth:`SSLContext.load_verify_locations` or as a
5817db96d56Sopenharmony_ci   value of the ``ca_certs`` parameter to :func:`wrap_socket`.
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci.. data:: CERT_REQUIRED
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_mode`, or the ``cert_reqs``
5867db96d56Sopenharmony_ci   parameter to :func:`wrap_socket`.  In this mode, certificates are
5877db96d56Sopenharmony_ci   required from the other side of the socket connection; an :class:`SSLError`
5887db96d56Sopenharmony_ci   will be raised if no certificate is provided, or if its validation fails.
5897db96d56Sopenharmony_ci   This mode is **not** sufficient to verify a certificate in client mode as
5907db96d56Sopenharmony_ci   it does not match hostnames.  :attr:`~SSLContext.check_hostname` must be
5917db96d56Sopenharmony_ci   enabled as well to verify the authenticity of a cert.
5927db96d56Sopenharmony_ci   :const:`PROTOCOL_TLS_CLIENT` uses :const:`CERT_REQUIRED` and
5937db96d56Sopenharmony_ci   enables :attr:`~SSLContext.check_hostname` by default.
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci   With server socket, this mode provides mandatory TLS client cert
5967db96d56Sopenharmony_ci   authentication.  A client certificate request is sent to the client and
5977db96d56Sopenharmony_ci   the client must provide a valid and trusted certificate.
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci   Use of this setting requires a valid set of CA certificates to
6007db96d56Sopenharmony_ci   be passed, either to :meth:`SSLContext.load_verify_locations` or as a
6017db96d56Sopenharmony_ci   value of the ``ca_certs`` parameter to :func:`wrap_socket`.
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci.. class:: VerifyMode
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection of CERT_* constants.
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci   .. versionadded:: 3.6
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci.. data:: VERIFY_DEFAULT
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags`. In this mode, certificate
6127db96d56Sopenharmony_ci   revocation lists (CRLs) are not checked. By default OpenSSL does neither
6137db96d56Sopenharmony_ci   require nor verify CRLs.
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci   .. versionadded:: 3.4
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci.. data:: VERIFY_CRL_CHECK_LEAF
6187db96d56Sopenharmony_ci
6197db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags`. In this mode, only the
6207db96d56Sopenharmony_ci   peer cert is checked but none of the intermediate CA certificates. The mode
6217db96d56Sopenharmony_ci   requires a valid CRL that is signed by the peer cert's issuer (its direct
6227db96d56Sopenharmony_ci   ancestor CA). If no proper CRL has been loaded with
6237db96d56Sopenharmony_ci   :attr:`SSLContext.load_verify_locations`, validation will fail.
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci   .. versionadded:: 3.4
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci.. data:: VERIFY_CRL_CHECK_CHAIN
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags`. In this mode, CRLs of
6307db96d56Sopenharmony_ci   all certificates in the peer cert chain are checked.
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci   .. versionadded:: 3.4
6337db96d56Sopenharmony_ci
6347db96d56Sopenharmony_ci.. data:: VERIFY_X509_STRICT
6357db96d56Sopenharmony_ci
6367db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags` to disable workarounds
6377db96d56Sopenharmony_ci   for broken X.509 certificates.
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci   .. versionadded:: 3.4
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci.. data:: VERIFY_ALLOW_PROXY_CERTS
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags` to enables proxy
6447db96d56Sopenharmony_ci   certificate verification.
6457db96d56Sopenharmony_ci
6467db96d56Sopenharmony_ci   .. versionadded:: 3.10
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci.. data:: VERIFY_X509_TRUSTED_FIRST
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to
6517db96d56Sopenharmony_ci   prefer trusted certificates when building the trust chain to validate a
6527db96d56Sopenharmony_ci   certificate. This flag is enabled by default.
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci   .. versionadded:: 3.4.4
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci.. data:: VERIFY_X509_PARTIAL_CHAIN
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci   Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to
6597db96d56Sopenharmony_ci   accept intermediate CAs in the trust store to be treated as trust-anchors,
6607db96d56Sopenharmony_ci   in the same way as the self-signed root CA certificates. This makes it
6617db96d56Sopenharmony_ci   possible to trust certificates issued by an intermediate CA without having
6627db96d56Sopenharmony_ci   to trust its ancestor root CA.
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci   .. versionadded:: 3.10
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci.. class:: VerifyFlags
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci   :class:`enum.IntFlag` collection of VERIFY_* constants.
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci   .. versionadded:: 3.6
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci.. data:: PROTOCOL_TLS
6747db96d56Sopenharmony_ci
6757db96d56Sopenharmony_ci   Selects the highest protocol version that both the client and server support.
6767db96d56Sopenharmony_ci   Despite the name, this option can select both "SSL" and "TLS" protocols.
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci   .. versionadded:: 3.6
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci   .. deprecated:: 3.10
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci      TLS clients and servers require different default settings for secure
6837db96d56Sopenharmony_ci      communication. The generic TLS protocol constant is deprecated in
6847db96d56Sopenharmony_ci      favor of :data:`PROTOCOL_TLS_CLIENT` and :data:`PROTOCOL_TLS_SERVER`.
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci.. data:: PROTOCOL_TLS_CLIENT
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci   Auto-negotiate the highest protocol version that both the client and
6897db96d56Sopenharmony_ci   server support, and configure the context client-side connections. The
6907db96d56Sopenharmony_ci   protocol enables :data:`CERT_REQUIRED` and
6917db96d56Sopenharmony_ci   :attr:`~SSLContext.check_hostname` by default.
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci   .. versionadded:: 3.6
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci.. data:: PROTOCOL_TLS_SERVER
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci   Auto-negotiate the highest protocol version that both the client and
6987db96d56Sopenharmony_ci   server support, and configure the context server-side connections.
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci   .. versionadded:: 3.6
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci.. data:: PROTOCOL_SSLv23
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci   Alias for :data:`PROTOCOL_TLS`.
7057db96d56Sopenharmony_ci
7067db96d56Sopenharmony_ci   .. deprecated:: 3.6
7077db96d56Sopenharmony_ci
7087db96d56Sopenharmony_ci      Use :data:`PROTOCOL_TLS` instead.
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ci.. data:: PROTOCOL_SSLv2
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci   Selects SSL version 2 as the channel encryption protocol.
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci   This protocol is not available if OpenSSL is compiled with the
7157db96d56Sopenharmony_ci   ``no-ssl2`` option.
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci   .. warning::
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci      SSL version 2 is insecure.  Its use is highly discouraged.
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci   .. deprecated:: 3.6
7227db96d56Sopenharmony_ci
7237db96d56Sopenharmony_ci      OpenSSL has removed support for SSLv2.
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci.. data:: PROTOCOL_SSLv3
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci   Selects SSL version 3 as the channel encryption protocol.
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci   This protocol is not available if OpenSSL is compiled with the
7307db96d56Sopenharmony_ci   ``no-ssl3`` option.
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci   .. warning::
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ci      SSL version 3 is insecure.  Its use is highly discouraged.
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ci   .. deprecated:: 3.6
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci      OpenSSL has deprecated all version specific protocols. Use the default
7397db96d56Sopenharmony_ci      protocol :data:`PROTOCOL_TLS_SERVER` or :data:`PROTOCOL_TLS_CLIENT`
7407db96d56Sopenharmony_ci      with :attr:`SSLContext.minimum_version` and
7417db96d56Sopenharmony_ci      :attr:`SSLContext.maximum_version` instead.
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci.. data:: PROTOCOL_TLSv1
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci   Selects TLS version 1.0 as the channel encryption protocol.
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci   .. deprecated:: 3.6
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci      OpenSSL has deprecated all version specific protocols.
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci.. data:: PROTOCOL_TLSv1_1
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci   Selects TLS version 1.1 as the channel encryption protocol.
7557db96d56Sopenharmony_ci   Available only with openssl version 1.0.1+.
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ci   .. versionadded:: 3.4
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ci   .. deprecated:: 3.6
7607db96d56Sopenharmony_ci
7617db96d56Sopenharmony_ci      OpenSSL has deprecated all version specific protocols.
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci.. data:: PROTOCOL_TLSv1_2
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci   Selects TLS version 1.2 as the channel encryption protocol.
7667db96d56Sopenharmony_ci   Available only with openssl version 1.0.1+.
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci   .. versionadded:: 3.4
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci   .. deprecated:: 3.6
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci      OpenSSL has deprecated all version specific protocols.
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci.. data:: OP_ALL
7757db96d56Sopenharmony_ci
7767db96d56Sopenharmony_ci   Enables workarounds for various bugs present in other SSL implementations.
7777db96d56Sopenharmony_ci   This option is set by default.  It does not necessarily set the same
7787db96d56Sopenharmony_ci   flags as OpenSSL's ``SSL_OP_ALL`` constant.
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci   .. versionadded:: 3.2
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ci.. data:: OP_NO_SSLv2
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_ci   Prevents an SSLv2 connection.  This option is only applicable in
7857db96d56Sopenharmony_ci   conjunction with :const:`PROTOCOL_TLS`.  It prevents the peers from
7867db96d56Sopenharmony_ci   choosing SSLv2 as the protocol version.
7877db96d56Sopenharmony_ci
7887db96d56Sopenharmony_ci   .. versionadded:: 3.2
7897db96d56Sopenharmony_ci
7907db96d56Sopenharmony_ci   .. deprecated:: 3.6
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci      SSLv2 is deprecated
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci.. data:: OP_NO_SSLv3
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci   Prevents an SSLv3 connection.  This option is only applicable in
7977db96d56Sopenharmony_ci   conjunction with :const:`PROTOCOL_TLS`.  It prevents the peers from
7987db96d56Sopenharmony_ci   choosing SSLv3 as the protocol version.
7997db96d56Sopenharmony_ci
8007db96d56Sopenharmony_ci   .. versionadded:: 3.2
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci   .. deprecated:: 3.6
8037db96d56Sopenharmony_ci
8047db96d56Sopenharmony_ci      SSLv3 is deprecated
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci.. data:: OP_NO_TLSv1
8077db96d56Sopenharmony_ci
8087db96d56Sopenharmony_ci   Prevents a TLSv1 connection.  This option is only applicable in
8097db96d56Sopenharmony_ci   conjunction with :const:`PROTOCOL_TLS`.  It prevents the peers from
8107db96d56Sopenharmony_ci   choosing TLSv1 as the protocol version.
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci   .. versionadded:: 3.2
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_ci   .. deprecated:: 3.7
8157db96d56Sopenharmony_ci      The option is deprecated since OpenSSL 1.1.0, use the new
8167db96d56Sopenharmony_ci      :attr:`SSLContext.minimum_version` and
8177db96d56Sopenharmony_ci      :attr:`SSLContext.maximum_version` instead.
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci.. data:: OP_NO_TLSv1_1
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci   Prevents a TLSv1.1 connection. This option is only applicable in conjunction
8227db96d56Sopenharmony_ci   with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.1 as
8237db96d56Sopenharmony_ci   the protocol version. Available only with openssl version 1.0.1+.
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci   .. versionadded:: 3.4
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci   .. deprecated:: 3.7
8287db96d56Sopenharmony_ci      The option is deprecated since OpenSSL 1.1.0.
8297db96d56Sopenharmony_ci
8307db96d56Sopenharmony_ci.. data:: OP_NO_TLSv1_2
8317db96d56Sopenharmony_ci
8327db96d56Sopenharmony_ci   Prevents a TLSv1.2 connection. This option is only applicable in conjunction
8337db96d56Sopenharmony_ci   with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.2 as
8347db96d56Sopenharmony_ci   the protocol version. Available only with openssl version 1.0.1+.
8357db96d56Sopenharmony_ci
8367db96d56Sopenharmony_ci   .. versionadded:: 3.4
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci   .. deprecated:: 3.7
8397db96d56Sopenharmony_ci      The option is deprecated since OpenSSL 1.1.0.
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ci.. data:: OP_NO_TLSv1_3
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci   Prevents a TLSv1.3 connection. This option is only applicable in conjunction
8447db96d56Sopenharmony_ci   with :const:`PROTOCOL_TLS`. It prevents the peers from choosing TLSv1.3 as
8457db96d56Sopenharmony_ci   the protocol version. TLS 1.3 is available with OpenSSL 1.1.1 or later.
8467db96d56Sopenharmony_ci   When Python has been compiled against an older version of OpenSSL, the
8477db96d56Sopenharmony_ci   flag defaults to *0*.
8487db96d56Sopenharmony_ci
8497db96d56Sopenharmony_ci   .. versionadded:: 3.7
8507db96d56Sopenharmony_ci
8517db96d56Sopenharmony_ci   .. deprecated:: 3.7
8527db96d56Sopenharmony_ci      The option is deprecated since OpenSSL 1.1.0. It was added to 2.7.15,
8537db96d56Sopenharmony_ci      3.6.3 and 3.7.0 for backwards compatibility with OpenSSL 1.0.2.
8547db96d56Sopenharmony_ci
8557db96d56Sopenharmony_ci.. data:: OP_NO_RENEGOTIATION
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ci   Disable all renegotiation in TLSv1.2 and earlier. Do not send
8587db96d56Sopenharmony_ci   HelloRequest messages, and ignore renegotiation requests via ClientHello.
8597db96d56Sopenharmony_ci
8607db96d56Sopenharmony_ci   This option is only available with OpenSSL 1.1.0h and later.
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci   .. versionadded:: 3.7
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci.. data:: OP_CIPHER_SERVER_PREFERENCE
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci   Use the server's cipher ordering preference, rather than the client's.
8677db96d56Sopenharmony_ci   This option has no effect on client sockets and SSLv2 server sockets.
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci   .. versionadded:: 3.3
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci.. data:: OP_SINGLE_DH_USE
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci   Prevents re-use of the same DH key for distinct SSL sessions.  This
8747db96d56Sopenharmony_ci   improves forward secrecy but requires more computational resources.
8757db96d56Sopenharmony_ci   This option only applies to server sockets.
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci   .. versionadded:: 3.3
8787db96d56Sopenharmony_ci
8797db96d56Sopenharmony_ci.. data:: OP_SINGLE_ECDH_USE
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci   Prevents re-use of the same ECDH key for distinct SSL sessions.  This
8827db96d56Sopenharmony_ci   improves forward secrecy but requires more computational resources.
8837db96d56Sopenharmony_ci   This option only applies to server sockets.
8847db96d56Sopenharmony_ci
8857db96d56Sopenharmony_ci   .. versionadded:: 3.3
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci.. data:: OP_ENABLE_MIDDLEBOX_COMPAT
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci   Send dummy Change Cipher Spec (CCS) messages in TLS 1.3 handshake to make
8907db96d56Sopenharmony_ci   a TLS 1.3 connection look more like a TLS 1.2 connection.
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci   This option is only available with OpenSSL 1.1.1 and later.
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci   .. versionadded:: 3.8
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ci.. data:: OP_NO_COMPRESSION
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci   Disable compression on the SSL channel.  This is useful if the application
8997db96d56Sopenharmony_ci   protocol supports its own compression scheme.
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci   .. versionadded:: 3.3
9027db96d56Sopenharmony_ci
9037db96d56Sopenharmony_ci.. class:: Options
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci   :class:`enum.IntFlag` collection of OP_* constants.
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci.. data:: OP_NO_TICKET
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ci   Prevent client side from requesting a session ticket.
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci   .. versionadded:: 3.6
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci.. data:: OP_IGNORE_UNEXPECTED_EOF
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci   Ignore unexpected shutdown of TLS connections.
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ci   This option is only available with OpenSSL 3.0.0 and later.
9187db96d56Sopenharmony_ci
9197db96d56Sopenharmony_ci   .. versionadded:: 3.10
9207db96d56Sopenharmony_ci
9217db96d56Sopenharmony_ci.. data:: HAS_ALPN
9227db96d56Sopenharmony_ci
9237db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the *Application-Layer
9247db96d56Sopenharmony_ci   Protocol Negotiation* TLS extension as described in :rfc:`7301`.
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci   .. versionadded:: 3.5
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ci.. data:: HAS_NEVER_CHECK_COMMON_NAME
9297db96d56Sopenharmony_ci
9307db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support not checking subject
9317db96d56Sopenharmony_ci   common name and :attr:`SSLContext.hostname_checks_common_name` is
9327db96d56Sopenharmony_ci   writeable.
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci   .. versionadded:: 3.7
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci.. data:: HAS_ECDH
9377db96d56Sopenharmony_ci
9387db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the Elliptic Curve-based
9397db96d56Sopenharmony_ci   Diffie-Hellman key exchange.  This should be true unless the feature was
9407db96d56Sopenharmony_ci   explicitly disabled by the distributor.
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci   .. versionadded:: 3.3
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci.. data:: HAS_SNI
9457db96d56Sopenharmony_ci
9467db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the *Server Name
9477db96d56Sopenharmony_ci   Indication* extension (as defined in :rfc:`6066`).
9487db96d56Sopenharmony_ci
9497db96d56Sopenharmony_ci   .. versionadded:: 3.2
9507db96d56Sopenharmony_ci
9517db96d56Sopenharmony_ci.. data:: HAS_NPN
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the *Next Protocol
9547db96d56Sopenharmony_ci   Negotiation* as described in the `Application Layer Protocol
9557db96d56Sopenharmony_ci   Negotiation <https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation>`_.
9567db96d56Sopenharmony_ci   When true, you can use the :meth:`SSLContext.set_npn_protocols` method to advertise
9577db96d56Sopenharmony_ci   which protocols you want to support.
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci   .. versionadded:: 3.3
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci.. data:: HAS_SSLv2
9627db96d56Sopenharmony_ci
9637db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the SSL 2.0 protocol.
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci   .. versionadded:: 3.7
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci.. data:: HAS_SSLv3
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the SSL 3.0 protocol.
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci   .. versionadded:: 3.7
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ci.. data:: HAS_TLSv1
9747db96d56Sopenharmony_ci
9757db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the TLS 1.0 protocol.
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci   .. versionadded:: 3.7
9787db96d56Sopenharmony_ci
9797db96d56Sopenharmony_ci.. data:: HAS_TLSv1_1
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the TLS 1.1 protocol.
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci   .. versionadded:: 3.7
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci.. data:: HAS_TLSv1_2
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the TLS 1.2 protocol.
9887db96d56Sopenharmony_ci
9897db96d56Sopenharmony_ci   .. versionadded:: 3.7
9907db96d56Sopenharmony_ci
9917db96d56Sopenharmony_ci.. data:: HAS_TLSv1_3
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci   Whether the OpenSSL library has built-in support for the TLS 1.3 protocol.
9947db96d56Sopenharmony_ci
9957db96d56Sopenharmony_ci   .. versionadded:: 3.7
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci.. data:: CHANNEL_BINDING_TYPES
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci   List of supported TLS channel binding types.  Strings in this list
10007db96d56Sopenharmony_ci   can be used as arguments to :meth:`SSLSocket.get_channel_binding`.
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ci   .. versionadded:: 3.3
10037db96d56Sopenharmony_ci
10047db96d56Sopenharmony_ci.. data:: OPENSSL_VERSION
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci   The version string of the OpenSSL library loaded by the interpreter::
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci    >>> ssl.OPENSSL_VERSION
10097db96d56Sopenharmony_ci    'OpenSSL 1.0.2k  26 Jan 2017'
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci   .. versionadded:: 3.2
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci.. data:: OPENSSL_VERSION_INFO
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci   A tuple of five integers representing version information about the
10167db96d56Sopenharmony_ci   OpenSSL library::
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci    >>> ssl.OPENSSL_VERSION_INFO
10197db96d56Sopenharmony_ci    (1, 0, 2, 11, 15)
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci   .. versionadded:: 3.2
10227db96d56Sopenharmony_ci
10237db96d56Sopenharmony_ci.. data:: OPENSSL_VERSION_NUMBER
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci   The raw version number of the OpenSSL library, as a single integer::
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci    >>> ssl.OPENSSL_VERSION_NUMBER
10287db96d56Sopenharmony_ci    268443839
10297db96d56Sopenharmony_ci    >>> hex(ssl.OPENSSL_VERSION_NUMBER)
10307db96d56Sopenharmony_ci    '0x100020bf'
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci   .. versionadded:: 3.2
10337db96d56Sopenharmony_ci
10347db96d56Sopenharmony_ci.. data:: ALERT_DESCRIPTION_HANDSHAKE_FAILURE
10357db96d56Sopenharmony_ci          ALERT_DESCRIPTION_INTERNAL_ERROR
10367db96d56Sopenharmony_ci          ALERT_DESCRIPTION_*
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci   Alert Descriptions from :rfc:`5246` and others. The `IANA TLS Alert Registry
10397db96d56Sopenharmony_ci   <https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6>`_
10407db96d56Sopenharmony_ci   contains this list and references to the RFCs where their meaning is defined.
10417db96d56Sopenharmony_ci
10427db96d56Sopenharmony_ci   Used as the return value of the callback function in
10437db96d56Sopenharmony_ci   :meth:`SSLContext.set_servername_callback`.
10447db96d56Sopenharmony_ci
10457db96d56Sopenharmony_ci   .. versionadded:: 3.4
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci.. class:: AlertDescription
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection of ALERT_DESCRIPTION_* constants.
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci   .. versionadded:: 3.6
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci.. data:: Purpose.SERVER_AUTH
10547db96d56Sopenharmony_ci
10557db96d56Sopenharmony_ci   Option for :func:`create_default_context` and
10567db96d56Sopenharmony_ci   :meth:`SSLContext.load_default_certs`.  This value indicates that the
10577db96d56Sopenharmony_ci   context may be used to authenticate web servers (therefore, it will
10587db96d56Sopenharmony_ci   be used to create client-side sockets).
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ci   .. versionadded:: 3.4
10617db96d56Sopenharmony_ci
10627db96d56Sopenharmony_ci.. data:: Purpose.CLIENT_AUTH
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci   Option for :func:`create_default_context` and
10657db96d56Sopenharmony_ci   :meth:`SSLContext.load_default_certs`.  This value indicates that the
10667db96d56Sopenharmony_ci   context may be used to authenticate web clients (therefore, it will
10677db96d56Sopenharmony_ci   be used to create server-side sockets).
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ci   .. versionadded:: 3.4
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci.. class:: SSLErrorNumber
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection of SSL_ERROR_* constants.
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci   .. versionadded:: 3.6
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_ci.. class:: TLSVersion
10787db96d56Sopenharmony_ci
10797db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection of SSL and TLS versions for
10807db96d56Sopenharmony_ci   :attr:`SSLContext.maximum_version` and :attr:`SSLContext.minimum_version`.
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci   .. versionadded:: 3.7
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci.. attribute:: TLSVersion.MINIMUM_SUPPORTED
10857db96d56Sopenharmony_ci.. attribute:: TLSVersion.MAXIMUM_SUPPORTED
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci   The minimum or maximum supported SSL or TLS version. These are magic
10887db96d56Sopenharmony_ci   constants. Their values don't reflect the lowest and highest available
10897db96d56Sopenharmony_ci   TLS/SSL versions.
10907db96d56Sopenharmony_ci
10917db96d56Sopenharmony_ci.. attribute:: TLSVersion.SSLv3
10927db96d56Sopenharmony_ci.. attribute:: TLSVersion.TLSv1
10937db96d56Sopenharmony_ci.. attribute:: TLSVersion.TLSv1_1
10947db96d56Sopenharmony_ci.. attribute:: TLSVersion.TLSv1_2
10957db96d56Sopenharmony_ci.. attribute:: TLSVersion.TLSv1_3
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci   SSL 3.0 to TLS 1.3.
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci   .. deprecated:: 3.10
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci      All :class:`TLSVersion` members except :attr:`TLSVersion.TLSv1_2` and
11027db96d56Sopenharmony_ci      :attr:`TLSVersion.TLSv1_3` are deprecated.
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci
11057db96d56Sopenharmony_ciSSL Sockets
11067db96d56Sopenharmony_ci-----------
11077db96d56Sopenharmony_ci
11087db96d56Sopenharmony_ci.. class:: SSLSocket(socket.socket)
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ci   SSL sockets provide the following methods of :ref:`socket-objects`:
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci   - :meth:`~socket.socket.accept()`
11137db96d56Sopenharmony_ci   - :meth:`~socket.socket.bind()`
11147db96d56Sopenharmony_ci   - :meth:`~socket.socket.close()`
11157db96d56Sopenharmony_ci   - :meth:`~socket.socket.connect()`
11167db96d56Sopenharmony_ci   - :meth:`~socket.socket.detach()`
11177db96d56Sopenharmony_ci   - :meth:`~socket.socket.fileno()`
11187db96d56Sopenharmony_ci   - :meth:`~socket.socket.getpeername()`, :meth:`~socket.socket.getsockname()`
11197db96d56Sopenharmony_ci   - :meth:`~socket.socket.getsockopt()`, :meth:`~socket.socket.setsockopt()`
11207db96d56Sopenharmony_ci   - :meth:`~socket.socket.gettimeout()`, :meth:`~socket.socket.settimeout()`,
11217db96d56Sopenharmony_ci     :meth:`~socket.socket.setblocking()`
11227db96d56Sopenharmony_ci   - :meth:`~socket.socket.listen()`
11237db96d56Sopenharmony_ci   - :meth:`~socket.socket.makefile()`
11247db96d56Sopenharmony_ci   - :meth:`~socket.socket.recv()`, :meth:`~socket.socket.recv_into()`
11257db96d56Sopenharmony_ci     (but passing a non-zero ``flags`` argument is not allowed)
11267db96d56Sopenharmony_ci   - :meth:`~socket.socket.send()`, :meth:`~socket.socket.sendall()` (with
11277db96d56Sopenharmony_ci     the same limitation)
11287db96d56Sopenharmony_ci   - :meth:`~socket.socket.sendfile()` (but :mod:`os.sendfile` will be used
11297db96d56Sopenharmony_ci     for plain-text sockets only, else :meth:`~socket.socket.send()` will be used)
11307db96d56Sopenharmony_ci   - :meth:`~socket.socket.shutdown()`
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_ci   However, since the SSL (and TLS) protocol has its own framing atop
11337db96d56Sopenharmony_ci   of TCP, the SSL sockets abstraction can, in certain respects, diverge from
11347db96d56Sopenharmony_ci   the specification of normal, OS-level sockets.  See especially the
11357db96d56Sopenharmony_ci   :ref:`notes on non-blocking sockets <ssl-nonblocking>`.
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci   Instances of :class:`SSLSocket` must be created using the
11387db96d56Sopenharmony_ci   :meth:`SSLContext.wrap_socket` method.
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci   .. versionchanged:: 3.5
11417db96d56Sopenharmony_ci      The :meth:`sendfile` method was added.
11427db96d56Sopenharmony_ci
11437db96d56Sopenharmony_ci   .. versionchanged:: 3.5
11447db96d56Sopenharmony_ci      The :meth:`shutdown` does not reset the socket timeout each time bytes
11457db96d56Sopenharmony_ci      are received or sent. The socket timeout is now the maximum total duration
11467db96d56Sopenharmony_ci      of the shutdown.
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci   .. deprecated:: 3.6
11497db96d56Sopenharmony_ci      It is deprecated to create a :class:`SSLSocket` instance directly, use
11507db96d56Sopenharmony_ci      :meth:`SSLContext.wrap_socket` to wrap a socket.
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci   .. versionchanged:: 3.7
11537db96d56Sopenharmony_ci      :class:`SSLSocket` instances must to created with
11547db96d56Sopenharmony_ci      :meth:`~SSLContext.wrap_socket`. In earlier versions, it was possible
11557db96d56Sopenharmony_ci      to create instances directly. This was never documented or officially
11567db96d56Sopenharmony_ci      supported.
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_ci   .. versionchanged:: 3.10
11597db96d56Sopenharmony_ci      Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The
11607db96d56Sopenharmony_ci      functions support reading and writing of data larger than 2 GB. Writing
11617db96d56Sopenharmony_ci      zero-length data no longer fails with a protocol violation error.
11627db96d56Sopenharmony_ci
11637db96d56Sopenharmony_ciSSL sockets also have the following additional methods and attributes:
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci.. method:: SSLSocket.read(len=1024, buffer=None)
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci   Read up to *len* bytes of data from the SSL socket and return the result as
11687db96d56Sopenharmony_ci   a ``bytes`` instance. If *buffer* is specified, then read into the buffer
11697db96d56Sopenharmony_ci   instead, and return the number of bytes read.
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ci   Raise :exc:`SSLWantReadError` or :exc:`SSLWantWriteError` if the socket is
11727db96d56Sopenharmony_ci   :ref:`non-blocking <ssl-nonblocking>` and the read would block.
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci   As at any time a re-negotiation is possible, a call to :meth:`read` can also
11757db96d56Sopenharmony_ci   cause write operations.
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci   .. versionchanged:: 3.5
11787db96d56Sopenharmony_ci      The socket timeout is no longer reset each time bytes are received or sent.
11797db96d56Sopenharmony_ci      The socket timeout is now the maximum total duration to read up to *len*
11807db96d56Sopenharmony_ci      bytes.
11817db96d56Sopenharmony_ci
11827db96d56Sopenharmony_ci   .. deprecated:: 3.6
11837db96d56Sopenharmony_ci      Use :meth:`~SSLSocket.recv` instead of :meth:`~SSLSocket.read`.
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci.. method:: SSLSocket.write(buf)
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ci   Write *buf* to the SSL socket and return the number of bytes written. The
11887db96d56Sopenharmony_ci   *buf* argument must be an object supporting the buffer interface.
11897db96d56Sopenharmony_ci
11907db96d56Sopenharmony_ci   Raise :exc:`SSLWantReadError` or :exc:`SSLWantWriteError` if the socket is
11917db96d56Sopenharmony_ci   :ref:`non-blocking <ssl-nonblocking>` and the write would block.
11927db96d56Sopenharmony_ci
11937db96d56Sopenharmony_ci   As at any time a re-negotiation is possible, a call to :meth:`write` can
11947db96d56Sopenharmony_ci   also cause read operations.
11957db96d56Sopenharmony_ci
11967db96d56Sopenharmony_ci   .. versionchanged:: 3.5
11977db96d56Sopenharmony_ci      The socket timeout is no longer reset each time bytes are received or sent.
11987db96d56Sopenharmony_ci      The socket timeout is now the maximum total duration to write *buf*.
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ci   .. deprecated:: 3.6
12017db96d56Sopenharmony_ci      Use :meth:`~SSLSocket.send` instead of :meth:`~SSLSocket.write`.
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci.. note::
12047db96d56Sopenharmony_ci
12057db96d56Sopenharmony_ci   The :meth:`~SSLSocket.read` and :meth:`~SSLSocket.write` methods are the
12067db96d56Sopenharmony_ci   low-level methods that read and write unencrypted, application-level data
12077db96d56Sopenharmony_ci   and decrypt/encrypt it to encrypted, wire-level data. These methods
12087db96d56Sopenharmony_ci   require an active SSL connection, i.e. the handshake was completed and
12097db96d56Sopenharmony_ci   :meth:`SSLSocket.unwrap` was not called.
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci   Normally you should use the socket API methods like
12127db96d56Sopenharmony_ci   :meth:`~socket.socket.recv` and :meth:`~socket.socket.send` instead of these
12137db96d56Sopenharmony_ci   methods.
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci.. method:: SSLSocket.do_handshake()
12167db96d56Sopenharmony_ci
12177db96d56Sopenharmony_ci   Perform the SSL setup handshake.
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci   .. versionchanged:: 3.4
12207db96d56Sopenharmony_ci      The handshake method also performs :func:`match_hostname` when the
12217db96d56Sopenharmony_ci      :attr:`~SSLContext.check_hostname` attribute of the socket's
12227db96d56Sopenharmony_ci      :attr:`~SSLSocket.context` is true.
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci   .. versionchanged:: 3.5
12257db96d56Sopenharmony_ci      The socket timeout is no longer reset each time bytes are received or sent.
12267db96d56Sopenharmony_ci      The socket timeout is now the maximum total duration of the handshake.
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ci   .. versionchanged:: 3.7
12297db96d56Sopenharmony_ci      Hostname or IP address is matched by OpenSSL during handshake. The
12307db96d56Sopenharmony_ci      function :func:`match_hostname` is no longer used. In case OpenSSL
12317db96d56Sopenharmony_ci      refuses a hostname or IP address, the handshake is aborted early and
12327db96d56Sopenharmony_ci      a TLS alert message is sent to the peer.
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci.. method:: SSLSocket.getpeercert(binary_form=False)
12357db96d56Sopenharmony_ci
12367db96d56Sopenharmony_ci   If there is no certificate for the peer on the other end of the connection,
12377db96d56Sopenharmony_ci   return ``None``.  If the SSL handshake hasn't been done yet, raise
12387db96d56Sopenharmony_ci   :exc:`ValueError`.
12397db96d56Sopenharmony_ci
12407db96d56Sopenharmony_ci   If the ``binary_form`` parameter is :const:`False`, and a certificate was
12417db96d56Sopenharmony_ci   received from the peer, this method returns a :class:`dict` instance.  If the
12427db96d56Sopenharmony_ci   certificate was not validated, the dict is empty.  If the certificate was
12437db96d56Sopenharmony_ci   validated, it returns a dict with several keys, amongst them ``subject``
12447db96d56Sopenharmony_ci   (the principal for which the certificate was issued) and ``issuer``
12457db96d56Sopenharmony_ci   (the principal issuing the certificate).  If a certificate contains an
12467db96d56Sopenharmony_ci   instance of the *Subject Alternative Name* extension (see :rfc:`3280`),
12477db96d56Sopenharmony_ci   there will also be a ``subjectAltName`` key in the dictionary.
12487db96d56Sopenharmony_ci
12497db96d56Sopenharmony_ci   The ``subject`` and ``issuer`` fields are tuples containing the sequence
12507db96d56Sopenharmony_ci   of relative distinguished names (RDNs) given in the certificate's data
12517db96d56Sopenharmony_ci   structure for the respective fields, and each RDN is a sequence of
12527db96d56Sopenharmony_ci   name-value pairs.  Here is a real-world example::
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci      {'issuer': ((('countryName', 'IL'),),
12557db96d56Sopenharmony_ci                  (('organizationName', 'StartCom Ltd.'),),
12567db96d56Sopenharmony_ci                  (('organizationalUnitName',
12577db96d56Sopenharmony_ci                    'Secure Digital Certificate Signing'),),
12587db96d56Sopenharmony_ci                  (('commonName',
12597db96d56Sopenharmony_ci                    'StartCom Class 2 Primary Intermediate Server CA'),)),
12607db96d56Sopenharmony_ci       'notAfter': 'Nov 22 08:15:19 2013 GMT',
12617db96d56Sopenharmony_ci       'notBefore': 'Nov 21 03:09:52 2011 GMT',
12627db96d56Sopenharmony_ci       'serialNumber': '95F0',
12637db96d56Sopenharmony_ci       'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),
12647db96d56Sopenharmony_ci                   (('countryName', 'US'),),
12657db96d56Sopenharmony_ci                   (('stateOrProvinceName', 'California'),),
12667db96d56Sopenharmony_ci                   (('localityName', 'San Francisco'),),
12677db96d56Sopenharmony_ci                   (('organizationName', 'Electronic Frontier Foundation, Inc.'),),
12687db96d56Sopenharmony_ci                   (('commonName', '*.eff.org'),),
12697db96d56Sopenharmony_ci                   (('emailAddress', 'hostmaster@eff.org'),)),
12707db96d56Sopenharmony_ci       'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
12717db96d56Sopenharmony_ci       'version': 3}
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci   .. note::
12747db96d56Sopenharmony_ci
12757db96d56Sopenharmony_ci      To validate a certificate for a particular service, you can use the
12767db96d56Sopenharmony_ci      :func:`match_hostname` function.
12777db96d56Sopenharmony_ci
12787db96d56Sopenharmony_ci   If the ``binary_form`` parameter is :const:`True`, and a certificate was
12797db96d56Sopenharmony_ci   provided, this method returns the DER-encoded form of the entire certificate
12807db96d56Sopenharmony_ci   as a sequence of bytes, or :const:`None` if the peer did not provide a
12817db96d56Sopenharmony_ci   certificate.  Whether the peer provides a certificate depends on the SSL
12827db96d56Sopenharmony_ci   socket's role:
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci   * for a client SSL socket, the server will always provide a certificate,
12857db96d56Sopenharmony_ci     regardless of whether validation was required;
12867db96d56Sopenharmony_ci
12877db96d56Sopenharmony_ci   * for a server SSL socket, the client will only provide a certificate
12887db96d56Sopenharmony_ci     when requested by the server; therefore :meth:`getpeercert` will return
12897db96d56Sopenharmony_ci     :const:`None` if you used :const:`CERT_NONE` (rather than
12907db96d56Sopenharmony_ci     :const:`CERT_OPTIONAL` or :const:`CERT_REQUIRED`).
12917db96d56Sopenharmony_ci
12927db96d56Sopenharmony_ci   .. versionchanged:: 3.2
12937db96d56Sopenharmony_ci      The returned dictionary includes additional items such as ``issuer``
12947db96d56Sopenharmony_ci      and ``notBefore``.
12957db96d56Sopenharmony_ci
12967db96d56Sopenharmony_ci   .. versionchanged:: 3.4
12977db96d56Sopenharmony_ci      :exc:`ValueError` is raised when the handshake isn't done.
12987db96d56Sopenharmony_ci      The returned dictionary includes additional X509v3 extension items
12997db96d56Sopenharmony_ci        such as ``crlDistributionPoints``, ``caIssuers`` and ``OCSP`` URIs.
13007db96d56Sopenharmony_ci
13017db96d56Sopenharmony_ci   .. versionchanged:: 3.9
13027db96d56Sopenharmony_ci      IPv6 address strings no longer have a trailing new line.
13037db96d56Sopenharmony_ci
13047db96d56Sopenharmony_ci.. method:: SSLSocket.cipher()
13057db96d56Sopenharmony_ci
13067db96d56Sopenharmony_ci   Returns a three-value tuple containing the name of the cipher being used, the
13077db96d56Sopenharmony_ci   version of the SSL protocol that defines its use, and the number of secret
13087db96d56Sopenharmony_ci   bits being used.  If no connection has been established, returns ``None``.
13097db96d56Sopenharmony_ci
13107db96d56Sopenharmony_ci.. method:: SSLSocket.shared_ciphers()
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci   Return the list of ciphers available in both the client and server.  Each
13137db96d56Sopenharmony_ci   entry of the returned list is a three-value tuple containing the name of the
13147db96d56Sopenharmony_ci   cipher, the version of the SSL protocol that defines its use, and the number
13157db96d56Sopenharmony_ci   of secret bits the cipher uses.  :meth:`~SSLSocket.shared_ciphers` returns
13167db96d56Sopenharmony_ci   ``None`` if no connection has been established or the socket is a client
13177db96d56Sopenharmony_ci   socket.
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci   .. versionadded:: 3.5
13207db96d56Sopenharmony_ci
13217db96d56Sopenharmony_ci.. method:: SSLSocket.compression()
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci   Return the compression algorithm being used as a string, or ``None``
13247db96d56Sopenharmony_ci   if the connection isn't compressed.
13257db96d56Sopenharmony_ci
13267db96d56Sopenharmony_ci   If the higher-level protocol supports its own compression mechanism,
13277db96d56Sopenharmony_ci   you can use :data:`OP_NO_COMPRESSION` to disable SSL-level compression.
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci   .. versionadded:: 3.3
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci.. method:: SSLSocket.get_channel_binding(cb_type="tls-unique")
13327db96d56Sopenharmony_ci
13337db96d56Sopenharmony_ci   Get channel binding data for current connection, as a bytes object.  Returns
13347db96d56Sopenharmony_ci   ``None`` if not connected or the handshake has not been completed.
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci   The *cb_type* parameter allow selection of the desired channel binding
13377db96d56Sopenharmony_ci   type. Valid channel binding types are listed in the
13387db96d56Sopenharmony_ci   :data:`CHANNEL_BINDING_TYPES` list.  Currently only the 'tls-unique' channel
13397db96d56Sopenharmony_ci   binding, defined by :rfc:`5929`, is supported.  :exc:`ValueError` will be
13407db96d56Sopenharmony_ci   raised if an unsupported channel binding type is requested.
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci   .. versionadded:: 3.3
13437db96d56Sopenharmony_ci
13447db96d56Sopenharmony_ci.. method:: SSLSocket.selected_alpn_protocol()
13457db96d56Sopenharmony_ci
13467db96d56Sopenharmony_ci   Return the protocol that was selected during the TLS handshake.  If
13477db96d56Sopenharmony_ci   :meth:`SSLContext.set_alpn_protocols` was not called, if the other party does
13487db96d56Sopenharmony_ci   not support ALPN, if this socket does not support any of the client's
13497db96d56Sopenharmony_ci   proposed protocols, or if the handshake has not happened yet, ``None`` is
13507db96d56Sopenharmony_ci   returned.
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ci   .. versionadded:: 3.5
13537db96d56Sopenharmony_ci
13547db96d56Sopenharmony_ci.. method:: SSLSocket.selected_npn_protocol()
13557db96d56Sopenharmony_ci
13567db96d56Sopenharmony_ci   Return the higher-level protocol that was selected during the TLS/SSL
13577db96d56Sopenharmony_ci   handshake. If :meth:`SSLContext.set_npn_protocols` was not called, or
13587db96d56Sopenharmony_ci   if the other party does not support NPN, or if the handshake has not yet
13597db96d56Sopenharmony_ci   happened, this will return ``None``.
13607db96d56Sopenharmony_ci
13617db96d56Sopenharmony_ci   .. versionadded:: 3.3
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_ci   .. deprecated:: 3.10
13647db96d56Sopenharmony_ci
13657db96d56Sopenharmony_ci      NPN has been superseded by ALPN
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci.. method:: SSLSocket.unwrap()
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci   Performs the SSL shutdown handshake, which removes the TLS layer from the
13707db96d56Sopenharmony_ci   underlying socket, and returns the underlying socket object.  This can be
13717db96d56Sopenharmony_ci   used to go from encrypted operation over a connection to unencrypted.  The
13727db96d56Sopenharmony_ci   returned socket should always be used for further communication with the
13737db96d56Sopenharmony_ci   other side of the connection, rather than the original socket.
13747db96d56Sopenharmony_ci
13757db96d56Sopenharmony_ci.. method:: SSLSocket.verify_client_post_handshake()
13767db96d56Sopenharmony_ci
13777db96d56Sopenharmony_ci   Requests post-handshake authentication (PHA) from a TLS 1.3 client. PHA
13787db96d56Sopenharmony_ci   can only be initiated for a TLS 1.3 connection from a server-side socket,
13797db96d56Sopenharmony_ci   after the initial TLS handshake and with PHA enabled on both sides, see
13807db96d56Sopenharmony_ci   :attr:`SSLContext.post_handshake_auth`.
13817db96d56Sopenharmony_ci
13827db96d56Sopenharmony_ci   The method does not perform a cert exchange immediately. The server-side
13837db96d56Sopenharmony_ci   sends a CertificateRequest during the next write event and expects the
13847db96d56Sopenharmony_ci   client to respond with a certificate on the next read event.
13857db96d56Sopenharmony_ci
13867db96d56Sopenharmony_ci   If any precondition isn't met (e.g. not TLS 1.3, PHA not enabled), an
13877db96d56Sopenharmony_ci   :exc:`SSLError` is raised.
13887db96d56Sopenharmony_ci
13897db96d56Sopenharmony_ci   .. note::
13907db96d56Sopenharmony_ci      Only available with OpenSSL 1.1.1 and TLS 1.3 enabled. Without TLS 1.3
13917db96d56Sopenharmony_ci      support, the method raises :exc:`NotImplementedError`.
13927db96d56Sopenharmony_ci
13937db96d56Sopenharmony_ci   .. versionadded:: 3.8
13947db96d56Sopenharmony_ci
13957db96d56Sopenharmony_ci.. method:: SSLSocket.version()
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci   Return the actual SSL protocol version negotiated by the connection
13987db96d56Sopenharmony_ci   as a string, or ``None`` if no secure connection is established.
13997db96d56Sopenharmony_ci   As of this writing, possible return values include ``"SSLv2"``,
14007db96d56Sopenharmony_ci   ``"SSLv3"``, ``"TLSv1"``, ``"TLSv1.1"`` and ``"TLSv1.2"``.
14017db96d56Sopenharmony_ci   Recent OpenSSL versions may define more return values.
14027db96d56Sopenharmony_ci
14037db96d56Sopenharmony_ci   .. versionadded:: 3.5
14047db96d56Sopenharmony_ci
14057db96d56Sopenharmony_ci.. method:: SSLSocket.pending()
14067db96d56Sopenharmony_ci
14077db96d56Sopenharmony_ci   Returns the number of already decrypted bytes available for read, pending on
14087db96d56Sopenharmony_ci   the connection.
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci.. attribute:: SSLSocket.context
14117db96d56Sopenharmony_ci
14127db96d56Sopenharmony_ci   The :class:`SSLContext` object this SSL socket is tied to.  If the SSL
14137db96d56Sopenharmony_ci   socket was created using the deprecated :func:`wrap_socket` function
14147db96d56Sopenharmony_ci   (rather than :meth:`SSLContext.wrap_socket`), this is a custom context
14157db96d56Sopenharmony_ci   object created for this SSL socket.
14167db96d56Sopenharmony_ci
14177db96d56Sopenharmony_ci   .. versionadded:: 3.2
14187db96d56Sopenharmony_ci
14197db96d56Sopenharmony_ci.. attribute:: SSLSocket.server_side
14207db96d56Sopenharmony_ci
14217db96d56Sopenharmony_ci   A boolean which is ``True`` for server-side sockets and ``False`` for
14227db96d56Sopenharmony_ci   client-side sockets.
14237db96d56Sopenharmony_ci
14247db96d56Sopenharmony_ci   .. versionadded:: 3.2
14257db96d56Sopenharmony_ci
14267db96d56Sopenharmony_ci.. attribute:: SSLSocket.server_hostname
14277db96d56Sopenharmony_ci
14287db96d56Sopenharmony_ci   Hostname of the server: :class:`str` type, or ``None`` for server-side
14297db96d56Sopenharmony_ci   socket or if the hostname was not specified in the constructor.
14307db96d56Sopenharmony_ci
14317db96d56Sopenharmony_ci   .. versionadded:: 3.2
14327db96d56Sopenharmony_ci
14337db96d56Sopenharmony_ci   .. versionchanged:: 3.7
14347db96d56Sopenharmony_ci      The attribute is now always ASCII text. When ``server_hostname`` is
14357db96d56Sopenharmony_ci      an internationalized domain name (IDN), this attribute now stores the
14367db96d56Sopenharmony_ci      A-label form (``"xn--pythn-mua.org"``), rather than the U-label form
14377db96d56Sopenharmony_ci      (``"pythön.org"``).
14387db96d56Sopenharmony_ci
14397db96d56Sopenharmony_ci.. attribute:: SSLSocket.session
14407db96d56Sopenharmony_ci
14417db96d56Sopenharmony_ci   The :class:`SSLSession` for this SSL connection. The session is available
14427db96d56Sopenharmony_ci   for client and server side sockets after the TLS handshake has been
14437db96d56Sopenharmony_ci   performed. For client sockets the session can be set before
14447db96d56Sopenharmony_ci   :meth:`~SSLSocket.do_handshake` has been called to reuse a session.
14457db96d56Sopenharmony_ci
14467db96d56Sopenharmony_ci   .. versionadded:: 3.6
14477db96d56Sopenharmony_ci
14487db96d56Sopenharmony_ci.. attribute:: SSLSocket.session_reused
14497db96d56Sopenharmony_ci
14507db96d56Sopenharmony_ci   .. versionadded:: 3.6
14517db96d56Sopenharmony_ci
14527db96d56Sopenharmony_ci
14537db96d56Sopenharmony_ciSSL Contexts
14547db96d56Sopenharmony_ci------------
14557db96d56Sopenharmony_ci
14567db96d56Sopenharmony_ci.. versionadded:: 3.2
14577db96d56Sopenharmony_ci
14587db96d56Sopenharmony_ciAn SSL context holds various data longer-lived than single SSL connections,
14597db96d56Sopenharmony_cisuch as SSL configuration options, certificate(s) and private key(s).
14607db96d56Sopenharmony_ciIt also manages a cache of SSL sessions for server-side sockets, in order
14617db96d56Sopenharmony_cito speed up repeated connections from the same clients.
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ci.. class:: SSLContext(protocol=None)
14647db96d56Sopenharmony_ci
14657db96d56Sopenharmony_ci   Create a new SSL context.  You may pass *protocol* which must be one
14667db96d56Sopenharmony_ci   of the ``PROTOCOL_*`` constants defined in this module.  The parameter
14677db96d56Sopenharmony_ci   specifies which version of the SSL protocol to use.  Typically, the
14687db96d56Sopenharmony_ci   server chooses a particular protocol version, and the client must adapt
14697db96d56Sopenharmony_ci   to the server's choice.  Most of the versions are not interoperable
14707db96d56Sopenharmony_ci   with the other versions.  If not specified, the default is
14717db96d56Sopenharmony_ci   :data:`PROTOCOL_TLS`; it provides the most compatibility with other
14727db96d56Sopenharmony_ci   versions.
14737db96d56Sopenharmony_ci
14747db96d56Sopenharmony_ci   Here's a table showing which versions in a client (down the side) can connect
14757db96d56Sopenharmony_ci   to which versions in a server (along the top):
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ci     .. table::
14787db96d56Sopenharmony_ci
14797db96d56Sopenharmony_ci       ========================  ============  ============  =============  =========  ===========  ===========
14807db96d56Sopenharmony_ci        *client* / **server**    **SSLv2**     **SSLv3**     **TLS** [3]_   **TLSv1**  **TLSv1.1**  **TLSv1.2**
14817db96d56Sopenharmony_ci       ------------------------  ------------  ------------  -------------  ---------  -----------  -----------
14827db96d56Sopenharmony_ci        *SSLv2*                    yes           no            no [1]_        no         no         no
14837db96d56Sopenharmony_ci        *SSLv3*                    no            yes           no [2]_        no         no         no
14847db96d56Sopenharmony_ci        *TLS* (*SSLv23*) [3]_      no [1]_       no [2]_       yes            yes        yes        yes
14857db96d56Sopenharmony_ci        *TLSv1*                    no            no            yes            yes        no         no
14867db96d56Sopenharmony_ci        *TLSv1.1*                  no            no            yes            no         yes        no
14877db96d56Sopenharmony_ci        *TLSv1.2*                  no            no            yes            no         no         yes
14887db96d56Sopenharmony_ci       ========================  ============  ============  =============  =========  ===========  ===========
14897db96d56Sopenharmony_ci
14907db96d56Sopenharmony_ci   .. rubric:: Footnotes
14917db96d56Sopenharmony_ci   .. [1] :class:`SSLContext` disables SSLv2 with :data:`OP_NO_SSLv2` by default.
14927db96d56Sopenharmony_ci   .. [2] :class:`SSLContext` disables SSLv3 with :data:`OP_NO_SSLv3` by default.
14937db96d56Sopenharmony_ci   .. [3] TLS 1.3 protocol will be available with :data:`PROTOCOL_TLS` in
14947db96d56Sopenharmony_ci      OpenSSL >= 1.1.1. There is no dedicated PROTOCOL constant for just
14957db96d56Sopenharmony_ci      TLS 1.3.
14967db96d56Sopenharmony_ci
14977db96d56Sopenharmony_ci   .. seealso::
14987db96d56Sopenharmony_ci      :func:`create_default_context` lets the :mod:`ssl` module choose
14997db96d56Sopenharmony_ci      security settings for a given purpose.
15007db96d56Sopenharmony_ci
15017db96d56Sopenharmony_ci   .. versionchanged:: 3.6
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci      The context is created with secure default values. The options
15047db96d56Sopenharmony_ci      :data:`OP_NO_COMPRESSION`, :data:`OP_CIPHER_SERVER_PREFERENCE`,
15057db96d56Sopenharmony_ci      :data:`OP_SINGLE_DH_USE`, :data:`OP_SINGLE_ECDH_USE`,
15067db96d56Sopenharmony_ci      :data:`OP_NO_SSLv2` (except for :data:`PROTOCOL_SSLv2`),
15077db96d56Sopenharmony_ci      and :data:`OP_NO_SSLv3` (except for :data:`PROTOCOL_SSLv3`) are
15087db96d56Sopenharmony_ci      set by default. The initial cipher suite list contains only ``HIGH``
15097db96d56Sopenharmony_ci      ciphers, no ``NULL`` ciphers and no ``MD5`` ciphers (except for
15107db96d56Sopenharmony_ci      :data:`PROTOCOL_SSLv2`).
15117db96d56Sopenharmony_ci
15127db96d56Sopenharmony_ci   .. deprecated:: 3.10
15137db96d56Sopenharmony_ci
15147db96d56Sopenharmony_ci      :class:`SSLContext` without protocol argument is deprecated. The
15157db96d56Sopenharmony_ci      context class will either require :data:`PROTOCOL_TLS_CLIENT` or
15167db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS_SERVER` protocol in the future.
15177db96d56Sopenharmony_ci
15187db96d56Sopenharmony_ci   .. versionchanged:: 3.10
15197db96d56Sopenharmony_ci
15207db96d56Sopenharmony_ci      The default cipher suites now include only secure AES and ChaCha20
15217db96d56Sopenharmony_ci      ciphers with forward secrecy and security level 2. RSA and DH keys with
15227db96d56Sopenharmony_ci      less than 2048 bits and ECC keys with less than 224 bits are prohibited.
15237db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS`, :data:`PROTOCOL_TLS_CLIENT`, and
15247db96d56Sopenharmony_ci      :data:`PROTOCOL_TLS_SERVER` use TLS 1.2 as minimum TLS version.
15257db96d56Sopenharmony_ci
15267db96d56Sopenharmony_ci
15277db96d56Sopenharmony_ci:class:`SSLContext` objects have the following methods and attributes:
15287db96d56Sopenharmony_ci
15297db96d56Sopenharmony_ci.. method:: SSLContext.cert_store_stats()
15307db96d56Sopenharmony_ci
15317db96d56Sopenharmony_ci   Get statistics about quantities of loaded X.509 certificates, count of
15327db96d56Sopenharmony_ci   X.509 certificates flagged as CA certificates and certificate revocation
15337db96d56Sopenharmony_ci   lists as dictionary.
15347db96d56Sopenharmony_ci
15357db96d56Sopenharmony_ci   Example for a context with one CA cert and one other cert::
15367db96d56Sopenharmony_ci
15377db96d56Sopenharmony_ci      >>> context.cert_store_stats()
15387db96d56Sopenharmony_ci      {'crl': 0, 'x509_ca': 1, 'x509': 2}
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci   .. versionadded:: 3.4
15417db96d56Sopenharmony_ci
15427db96d56Sopenharmony_ci
15437db96d56Sopenharmony_ci.. method:: SSLContext.load_cert_chain(certfile, keyfile=None, password=None)
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci   Load a private key and the corresponding certificate.  The *certfile*
15467db96d56Sopenharmony_ci   string must be the path to a single file in PEM format containing the
15477db96d56Sopenharmony_ci   certificate as well as any number of CA certificates needed to establish
15487db96d56Sopenharmony_ci   the certificate's authenticity.  The *keyfile* string, if present, must
15497db96d56Sopenharmony_ci   point to a file containing the private key.  Otherwise the private
15507db96d56Sopenharmony_ci   key will be taken from *certfile* as well.  See the discussion of
15517db96d56Sopenharmony_ci   :ref:`ssl-certificates` for more information on how the certificate
15527db96d56Sopenharmony_ci   is stored in the *certfile*.
15537db96d56Sopenharmony_ci
15547db96d56Sopenharmony_ci   The *password* argument may be a function to call to get the password for
15557db96d56Sopenharmony_ci   decrypting the private key.  It will only be called if the private key is
15567db96d56Sopenharmony_ci   encrypted and a password is necessary.  It will be called with no arguments,
15577db96d56Sopenharmony_ci   and it should return a string, bytes, or bytearray.  If the return value is
15587db96d56Sopenharmony_ci   a string it will be encoded as UTF-8 before using it to decrypt the key.
15597db96d56Sopenharmony_ci   Alternatively a string, bytes, or bytearray value may be supplied directly
15607db96d56Sopenharmony_ci   as the *password* argument.  It will be ignored if the private key is not
15617db96d56Sopenharmony_ci   encrypted and no password is needed.
15627db96d56Sopenharmony_ci
15637db96d56Sopenharmony_ci   If the *password* argument is not specified and a password is required,
15647db96d56Sopenharmony_ci   OpenSSL's built-in password prompting mechanism will be used to
15657db96d56Sopenharmony_ci   interactively prompt the user for a password.
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci   An :class:`SSLError` is raised if the private key doesn't
15687db96d56Sopenharmony_ci   match with the certificate.
15697db96d56Sopenharmony_ci
15707db96d56Sopenharmony_ci   .. versionchanged:: 3.3
15717db96d56Sopenharmony_ci      New optional argument *password*.
15727db96d56Sopenharmony_ci
15737db96d56Sopenharmony_ci.. method:: SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)
15747db96d56Sopenharmony_ci
15757db96d56Sopenharmony_ci   Load a set of default "certification authority" (CA) certificates from
15767db96d56Sopenharmony_ci   default locations. On Windows it loads CA certs from the ``CA`` and
15777db96d56Sopenharmony_ci   ``ROOT`` system stores. On all systems it calls
15787db96d56Sopenharmony_ci   :meth:`SSLContext.set_default_verify_paths`. In the future the method may
15797db96d56Sopenharmony_ci   load CA certificates from other locations, too.
15807db96d56Sopenharmony_ci
15817db96d56Sopenharmony_ci   The *purpose* flag specifies what kind of CA certificates are loaded. The
15827db96d56Sopenharmony_ci   default settings :data:`Purpose.SERVER_AUTH` loads certificates, that are
15837db96d56Sopenharmony_ci   flagged and trusted for TLS web server authentication (client side
15847db96d56Sopenharmony_ci   sockets). :data:`Purpose.CLIENT_AUTH` loads CA certificates for client
15857db96d56Sopenharmony_ci   certificate verification on the server side.
15867db96d56Sopenharmony_ci
15877db96d56Sopenharmony_ci   .. versionadded:: 3.4
15887db96d56Sopenharmony_ci
15897db96d56Sopenharmony_ci.. method:: SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None)
15907db96d56Sopenharmony_ci
15917db96d56Sopenharmony_ci   Load a set of "certification authority" (CA) certificates used to validate
15927db96d56Sopenharmony_ci   other peers' certificates when :data:`verify_mode` is other than
15937db96d56Sopenharmony_ci   :data:`CERT_NONE`.  At least one of *cafile* or *capath* must be specified.
15947db96d56Sopenharmony_ci
15957db96d56Sopenharmony_ci   This method can also load certification revocation lists (CRLs) in PEM or
15967db96d56Sopenharmony_ci   DER format. In order to make use of CRLs, :attr:`SSLContext.verify_flags`
15977db96d56Sopenharmony_ci   must be configured properly.
15987db96d56Sopenharmony_ci
15997db96d56Sopenharmony_ci   The *cafile* string, if present, is the path to a file of concatenated
16007db96d56Sopenharmony_ci   CA certificates in PEM format. See the discussion of
16017db96d56Sopenharmony_ci   :ref:`ssl-certificates` for more information about how to arrange the
16027db96d56Sopenharmony_ci   certificates in this file.
16037db96d56Sopenharmony_ci
16047db96d56Sopenharmony_ci   The *capath* string, if present, is
16057db96d56Sopenharmony_ci   the path to a directory containing several CA certificates in PEM format,
16067db96d56Sopenharmony_ci   following an `OpenSSL specific layout
16077db96d56Sopenharmony_ci   <https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html>`_.
16087db96d56Sopenharmony_ci
16097db96d56Sopenharmony_ci   The *cadata* object, if present, is either an ASCII string of one or more
16107db96d56Sopenharmony_ci   PEM-encoded certificates or a :term:`bytes-like object` of DER-encoded
16117db96d56Sopenharmony_ci   certificates. Like with *capath* extra lines around PEM-encoded
16127db96d56Sopenharmony_ci   certificates are ignored but at least one certificate must be present.
16137db96d56Sopenharmony_ci
16147db96d56Sopenharmony_ci   .. versionchanged:: 3.4
16157db96d56Sopenharmony_ci      New optional argument *cadata*
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci.. method:: SSLContext.get_ca_certs(binary_form=False)
16187db96d56Sopenharmony_ci
16197db96d56Sopenharmony_ci   Get a list of loaded "certification authority" (CA) certificates. If the
16207db96d56Sopenharmony_ci   ``binary_form`` parameter is :const:`False` each list
16217db96d56Sopenharmony_ci   entry is a dict like the output of :meth:`SSLSocket.getpeercert`. Otherwise
16227db96d56Sopenharmony_ci   the method returns a list of DER-encoded certificates. The returned list
16237db96d56Sopenharmony_ci   does not contain certificates from *capath* unless a certificate was
16247db96d56Sopenharmony_ci   requested and loaded by a SSL connection.
16257db96d56Sopenharmony_ci
16267db96d56Sopenharmony_ci   .. note::
16277db96d56Sopenharmony_ci      Certificates in a capath directory aren't loaded unless they have
16287db96d56Sopenharmony_ci      been used at least once.
16297db96d56Sopenharmony_ci
16307db96d56Sopenharmony_ci   .. versionadded:: 3.4
16317db96d56Sopenharmony_ci
16327db96d56Sopenharmony_ci.. method:: SSLContext.get_ciphers()
16337db96d56Sopenharmony_ci
16347db96d56Sopenharmony_ci   Get a list of enabled ciphers. The list is in order of cipher priority.
16357db96d56Sopenharmony_ci   See :meth:`SSLContext.set_ciphers`.
16367db96d56Sopenharmony_ci
16377db96d56Sopenharmony_ci   Example::
16387db96d56Sopenharmony_ci
16397db96d56Sopenharmony_ci       >>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
16407db96d56Sopenharmony_ci       >>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')
16417db96d56Sopenharmony_ci       >>> ctx.get_ciphers()
16427db96d56Sopenharmony_ci       [{'aead': True,
16437db96d56Sopenharmony_ci         'alg_bits': 256,
16447db96d56Sopenharmony_ci         'auth': 'auth-rsa',
16457db96d56Sopenharmony_ci         'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  '
16467db96d56Sopenharmony_ci                        'Enc=AESGCM(256) Mac=AEAD',
16477db96d56Sopenharmony_ci         'digest': None,
16487db96d56Sopenharmony_ci         'id': 50380848,
16497db96d56Sopenharmony_ci         'kea': 'kx-ecdhe',
16507db96d56Sopenharmony_ci         'name': 'ECDHE-RSA-AES256-GCM-SHA384',
16517db96d56Sopenharmony_ci         'protocol': 'TLSv1.2',
16527db96d56Sopenharmony_ci         'strength_bits': 256,
16537db96d56Sopenharmony_ci         'symmetric': 'aes-256-gcm'},
16547db96d56Sopenharmony_ci        {'aead': True,
16557db96d56Sopenharmony_ci         'alg_bits': 128,
16567db96d56Sopenharmony_ci         'auth': 'auth-rsa',
16577db96d56Sopenharmony_ci         'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  '
16587db96d56Sopenharmony_ci                        'Enc=AESGCM(128) Mac=AEAD',
16597db96d56Sopenharmony_ci         'digest': None,
16607db96d56Sopenharmony_ci         'id': 50380847,
16617db96d56Sopenharmony_ci         'kea': 'kx-ecdhe',
16627db96d56Sopenharmony_ci         'name': 'ECDHE-RSA-AES128-GCM-SHA256',
16637db96d56Sopenharmony_ci         'protocol': 'TLSv1.2',
16647db96d56Sopenharmony_ci         'strength_bits': 128,
16657db96d56Sopenharmony_ci         'symmetric': 'aes-128-gcm'}]
16667db96d56Sopenharmony_ci
16677db96d56Sopenharmony_ci   .. versionadded:: 3.6
16687db96d56Sopenharmony_ci
16697db96d56Sopenharmony_ci.. method:: SSLContext.set_default_verify_paths()
16707db96d56Sopenharmony_ci
16717db96d56Sopenharmony_ci   Load a set of default "certification authority" (CA) certificates from
16727db96d56Sopenharmony_ci   a filesystem path defined when building the OpenSSL library.  Unfortunately,
16737db96d56Sopenharmony_ci   there's no easy way to know whether this method succeeds: no error is
16747db96d56Sopenharmony_ci   returned if no certificates are to be found.  When the OpenSSL library is
16757db96d56Sopenharmony_ci   provided as part of the operating system, though, it is likely to be
16767db96d56Sopenharmony_ci   configured properly.
16777db96d56Sopenharmony_ci
16787db96d56Sopenharmony_ci.. method:: SSLContext.set_ciphers(ciphers)
16797db96d56Sopenharmony_ci
16807db96d56Sopenharmony_ci   Set the available ciphers for sockets created with this context.
16817db96d56Sopenharmony_ci   It should be a string in the `OpenSSL cipher list format
16827db96d56Sopenharmony_ci   <https://www.openssl.org/docs/manmaster/man1/ciphers.html>`_.
16837db96d56Sopenharmony_ci   If no cipher can be selected (because compile-time options or other
16847db96d56Sopenharmony_ci   configuration forbids use of all the specified ciphers), an
16857db96d56Sopenharmony_ci   :class:`SSLError` will be raised.
16867db96d56Sopenharmony_ci
16877db96d56Sopenharmony_ci   .. note::
16887db96d56Sopenharmony_ci      when connected, the :meth:`SSLSocket.cipher` method of SSL sockets will
16897db96d56Sopenharmony_ci      give the currently selected cipher.
16907db96d56Sopenharmony_ci
16917db96d56Sopenharmony_ci      TLS 1.3 cipher suites cannot be disabled with
16927db96d56Sopenharmony_ci      :meth:`~SSLContext.set_ciphers`.
16937db96d56Sopenharmony_ci
16947db96d56Sopenharmony_ci.. method:: SSLContext.set_alpn_protocols(protocols)
16957db96d56Sopenharmony_ci
16967db96d56Sopenharmony_ci   Specify which protocols the socket should advertise during the SSL/TLS
16977db96d56Sopenharmony_ci   handshake. It should be a list of ASCII strings, like ``['http/1.1',
16987db96d56Sopenharmony_ci   'spdy/2']``, ordered by preference. The selection of a protocol will happen
16997db96d56Sopenharmony_ci   during the handshake, and will play out according to :rfc:`7301`. After a
17007db96d56Sopenharmony_ci   successful handshake, the :meth:`SSLSocket.selected_alpn_protocol` method will
17017db96d56Sopenharmony_ci   return the agreed-upon protocol.
17027db96d56Sopenharmony_ci
17037db96d56Sopenharmony_ci   This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
17047db96d56Sopenharmony_ci   ``False``.
17057db96d56Sopenharmony_ci
17067db96d56Sopenharmony_ci   .. versionadded:: 3.5
17077db96d56Sopenharmony_ci
17087db96d56Sopenharmony_ci.. method:: SSLContext.set_npn_protocols(protocols)
17097db96d56Sopenharmony_ci
17107db96d56Sopenharmony_ci   Specify which protocols the socket should advertise during the SSL/TLS
17117db96d56Sopenharmony_ci   handshake. It should be a list of strings, like ``['http/1.1', 'spdy/2']``,
17127db96d56Sopenharmony_ci   ordered by preference. The selection of a protocol will happen during the
17137db96d56Sopenharmony_ci   handshake, and will play out according to the `Application Layer Protocol Negotiation
17147db96d56Sopenharmony_ci   <https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation>`_. After a
17157db96d56Sopenharmony_ci   successful handshake, the :meth:`SSLSocket.selected_npn_protocol` method will
17167db96d56Sopenharmony_ci   return the agreed-upon protocol.
17177db96d56Sopenharmony_ci
17187db96d56Sopenharmony_ci   This method will raise :exc:`NotImplementedError` if :data:`HAS_NPN` is
17197db96d56Sopenharmony_ci   ``False``.
17207db96d56Sopenharmony_ci
17217db96d56Sopenharmony_ci   .. versionadded:: 3.3
17227db96d56Sopenharmony_ci
17237db96d56Sopenharmony_ci   .. deprecated:: 3.10
17247db96d56Sopenharmony_ci
17257db96d56Sopenharmony_ci      NPN has been superseded by ALPN
17267db96d56Sopenharmony_ci
17277db96d56Sopenharmony_ci.. attribute:: SSLContext.sni_callback
17287db96d56Sopenharmony_ci
17297db96d56Sopenharmony_ci   Register a callback function that will be called after the TLS Client Hello
17307db96d56Sopenharmony_ci   handshake message has been received by the SSL/TLS server when the TLS client
17317db96d56Sopenharmony_ci   specifies a server name indication. The server name indication mechanism
17327db96d56Sopenharmony_ci   is specified in :rfc:`6066` section 3 - Server Name Indication.
17337db96d56Sopenharmony_ci
17347db96d56Sopenharmony_ci   Only one callback can be set per ``SSLContext``.  If *sni_callback*
17357db96d56Sopenharmony_ci   is set to ``None`` then the callback is disabled. Calling this function a
17367db96d56Sopenharmony_ci   subsequent time will disable the previously registered callback.
17377db96d56Sopenharmony_ci
17387db96d56Sopenharmony_ci   The callback function will be called with three
17397db96d56Sopenharmony_ci   arguments; the first being the :class:`ssl.SSLSocket`, the second is a string
17407db96d56Sopenharmony_ci   that represents the server name that the client is intending to communicate
17417db96d56Sopenharmony_ci   (or :const:`None` if the TLS Client Hello does not contain a server name)
17427db96d56Sopenharmony_ci   and the third argument is the original :class:`SSLContext`. The server name
17437db96d56Sopenharmony_ci   argument is text. For internationalized domain name, the server
17447db96d56Sopenharmony_ci   name is an IDN A-label (``"xn--pythn-mua.org"``).
17457db96d56Sopenharmony_ci
17467db96d56Sopenharmony_ci   A typical use of this callback is to change the :class:`ssl.SSLSocket`'s
17477db96d56Sopenharmony_ci   :attr:`SSLSocket.context` attribute to a new object of type
17487db96d56Sopenharmony_ci   :class:`SSLContext` representing a certificate chain that matches the server
17497db96d56Sopenharmony_ci   name.
17507db96d56Sopenharmony_ci
17517db96d56Sopenharmony_ci   Due to the early negotiation phase of the TLS connection, only limited
17527db96d56Sopenharmony_ci   methods and attributes are usable like
17537db96d56Sopenharmony_ci   :meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`.
17547db96d56Sopenharmony_ci   The :meth:`SSLSocket.getpeercert`,
17557db96d56Sopenharmony_ci   :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compression` methods require that
17567db96d56Sopenharmony_ci   the TLS connection has progressed beyond the TLS Client Hello and therefore
17577db96d56Sopenharmony_ci   will not return meaningful values nor can they be called safely.
17587db96d56Sopenharmony_ci
17597db96d56Sopenharmony_ci   The *sni_callback* function must return ``None`` to allow the
17607db96d56Sopenharmony_ci   TLS negotiation to continue.  If a TLS failure is required, a constant
17617db96d56Sopenharmony_ci   :const:`ALERT_DESCRIPTION_* <ALERT_DESCRIPTION_INTERNAL_ERROR>` can be
17627db96d56Sopenharmony_ci   returned.  Other return values will result in a TLS fatal error with
17637db96d56Sopenharmony_ci   :const:`ALERT_DESCRIPTION_INTERNAL_ERROR`.
17647db96d56Sopenharmony_ci
17657db96d56Sopenharmony_ci   If an exception is raised from the *sni_callback* function the TLS
17667db96d56Sopenharmony_ci   connection will terminate with a fatal TLS alert message
17677db96d56Sopenharmony_ci   :const:`ALERT_DESCRIPTION_HANDSHAKE_FAILURE`.
17687db96d56Sopenharmony_ci
17697db96d56Sopenharmony_ci   This method will raise :exc:`NotImplementedError` if the OpenSSL library
17707db96d56Sopenharmony_ci   had OPENSSL_NO_TLSEXT defined when it was built.
17717db96d56Sopenharmony_ci
17727db96d56Sopenharmony_ci   .. versionadded:: 3.7
17737db96d56Sopenharmony_ci
17747db96d56Sopenharmony_ci.. attribute:: SSLContext.set_servername_callback(server_name_callback)
17757db96d56Sopenharmony_ci
17767db96d56Sopenharmony_ci   This is a legacy API retained for backwards compatibility. When possible,
17777db96d56Sopenharmony_ci   you should use :attr:`sni_callback` instead. The given *server_name_callback*
17787db96d56Sopenharmony_ci   is similar to *sni_callback*, except that when the server hostname is an
17797db96d56Sopenharmony_ci   IDN-encoded internationalized domain name, the *server_name_callback*
17807db96d56Sopenharmony_ci   receives a decoded U-label (``"pythön.org"``).
17817db96d56Sopenharmony_ci
17827db96d56Sopenharmony_ci   If there is an decoding error on the server name, the TLS connection will
17837db96d56Sopenharmony_ci   terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS
17847db96d56Sopenharmony_ci   alert message to the client.
17857db96d56Sopenharmony_ci
17867db96d56Sopenharmony_ci   .. versionadded:: 3.4
17877db96d56Sopenharmony_ci
17887db96d56Sopenharmony_ci.. method:: SSLContext.load_dh_params(dhfile)
17897db96d56Sopenharmony_ci
17907db96d56Sopenharmony_ci   Load the key generation parameters for Diffie-Hellman (DH) key exchange.
17917db96d56Sopenharmony_ci   Using DH key exchange improves forward secrecy at the expense of
17927db96d56Sopenharmony_ci   computational resources (both on the server and on the client).
17937db96d56Sopenharmony_ci   The *dhfile* parameter should be the path to a file containing DH
17947db96d56Sopenharmony_ci   parameters in PEM format.
17957db96d56Sopenharmony_ci
17967db96d56Sopenharmony_ci   This setting doesn't apply to client sockets.  You can also use the
17977db96d56Sopenharmony_ci   :data:`OP_SINGLE_DH_USE` option to further improve security.
17987db96d56Sopenharmony_ci
17997db96d56Sopenharmony_ci   .. versionadded:: 3.3
18007db96d56Sopenharmony_ci
18017db96d56Sopenharmony_ci.. method:: SSLContext.set_ecdh_curve(curve_name)
18027db96d56Sopenharmony_ci
18037db96d56Sopenharmony_ci   Set the curve name for Elliptic Curve-based Diffie-Hellman (ECDH) key
18047db96d56Sopenharmony_ci   exchange.  ECDH is significantly faster than regular DH while arguably
18057db96d56Sopenharmony_ci   as secure.  The *curve_name* parameter should be a string describing
18067db96d56Sopenharmony_ci   a well-known elliptic curve, for example ``prime256v1`` for a widely
18077db96d56Sopenharmony_ci   supported curve.
18087db96d56Sopenharmony_ci
18097db96d56Sopenharmony_ci   This setting doesn't apply to client sockets.  You can also use the
18107db96d56Sopenharmony_ci   :data:`OP_SINGLE_ECDH_USE` option to further improve security.
18117db96d56Sopenharmony_ci
18127db96d56Sopenharmony_ci   This method is not available if :data:`HAS_ECDH` is ``False``.
18137db96d56Sopenharmony_ci
18147db96d56Sopenharmony_ci   .. versionadded:: 3.3
18157db96d56Sopenharmony_ci
18167db96d56Sopenharmony_ci   .. seealso::
18177db96d56Sopenharmony_ci      `SSL/TLS & Perfect Forward Secrecy <https://vincent.bernat.ch/en/blog/2011-ssl-perfect-forward-secrecy>`_
18187db96d56Sopenharmony_ci         Vincent Bernat.
18197db96d56Sopenharmony_ci
18207db96d56Sopenharmony_ci.. method:: SSLContext.wrap_socket(sock, server_side=False, \
18217db96d56Sopenharmony_ci      do_handshake_on_connect=True, suppress_ragged_eofs=True, \
18227db96d56Sopenharmony_ci      server_hostname=None, session=None)
18237db96d56Sopenharmony_ci
18247db96d56Sopenharmony_ci   Wrap an existing Python socket *sock* and return an instance of
18257db96d56Sopenharmony_ci   :attr:`SSLContext.sslsocket_class` (default :class:`SSLSocket`). The
18267db96d56Sopenharmony_ci   returned SSL socket is tied to the context, its settings and certificates.
18277db96d56Sopenharmony_ci   *sock* must be a :data:`~socket.SOCK_STREAM` socket; other
18287db96d56Sopenharmony_ci   socket types are unsupported.
18297db96d56Sopenharmony_ci
18307db96d56Sopenharmony_ci   The parameter ``server_side`` is a boolean which identifies whether
18317db96d56Sopenharmony_ci   server-side or client-side behavior is desired from this socket.
18327db96d56Sopenharmony_ci
18337db96d56Sopenharmony_ci   For client-side sockets, the context construction is lazy; if the
18347db96d56Sopenharmony_ci   underlying socket isn't connected yet, the context construction will be
18357db96d56Sopenharmony_ci   performed after :meth:`connect` is called on the socket.  For
18367db96d56Sopenharmony_ci   server-side sockets, if the socket has no remote peer, it is assumed
18377db96d56Sopenharmony_ci   to be a listening socket, and the server-side SSL wrapping is
18387db96d56Sopenharmony_ci   automatically performed on client connections accepted via the
18397db96d56Sopenharmony_ci   :meth:`accept` method. The method may raise :exc:`SSLError`.
18407db96d56Sopenharmony_ci
18417db96d56Sopenharmony_ci   On client connections, the optional parameter *server_hostname* specifies
18427db96d56Sopenharmony_ci   the hostname of the service which we are connecting to.  This allows a
18437db96d56Sopenharmony_ci   single server to host multiple SSL-based services with distinct certificates,
18447db96d56Sopenharmony_ci   quite similarly to HTTP virtual hosts. Specifying *server_hostname* will
18457db96d56Sopenharmony_ci   raise a :exc:`ValueError` if *server_side* is true.
18467db96d56Sopenharmony_ci
18477db96d56Sopenharmony_ci   The parameter ``do_handshake_on_connect`` specifies whether to do the SSL
18487db96d56Sopenharmony_ci   handshake automatically after doing a :meth:`socket.connect`, or whether the
18497db96d56Sopenharmony_ci   application program will call it explicitly, by invoking the
18507db96d56Sopenharmony_ci   :meth:`SSLSocket.do_handshake` method.  Calling
18517db96d56Sopenharmony_ci   :meth:`SSLSocket.do_handshake` explicitly gives the program control over the
18527db96d56Sopenharmony_ci   blocking behavior of the socket I/O involved in the handshake.
18537db96d56Sopenharmony_ci
18547db96d56Sopenharmony_ci   The parameter ``suppress_ragged_eofs`` specifies how the
18557db96d56Sopenharmony_ci   :meth:`SSLSocket.recv` method should signal unexpected EOF from the other end
18567db96d56Sopenharmony_ci   of the connection.  If specified as :const:`True` (the default), it returns a
18577db96d56Sopenharmony_ci   normal EOF (an empty bytes object) in response to unexpected EOF errors
18587db96d56Sopenharmony_ci   raised from the underlying socket; if :const:`False`, it will raise the
18597db96d56Sopenharmony_ci   exceptions back to the caller.
18607db96d56Sopenharmony_ci
18617db96d56Sopenharmony_ci   *session*, see :attr:`~SSLSocket.session`.
18627db96d56Sopenharmony_ci
18637db96d56Sopenharmony_ci   .. versionchanged:: 3.5
18647db96d56Sopenharmony_ci      Always allow a server_hostname to be passed, even if OpenSSL does not
18657db96d56Sopenharmony_ci      have SNI.
18667db96d56Sopenharmony_ci
18677db96d56Sopenharmony_ci   .. versionchanged:: 3.6
18687db96d56Sopenharmony_ci      *session* argument was added.
18697db96d56Sopenharmony_ci
18707db96d56Sopenharmony_ci    .. versionchanged:: 3.7
18717db96d56Sopenharmony_ci      The method returns an instance of :attr:`SSLContext.sslsocket_class`
18727db96d56Sopenharmony_ci      instead of hard-coded :class:`SSLSocket`.
18737db96d56Sopenharmony_ci
18747db96d56Sopenharmony_ci.. attribute:: SSLContext.sslsocket_class
18757db96d56Sopenharmony_ci
18767db96d56Sopenharmony_ci   The return type of :meth:`SSLContext.wrap_socket`, defaults to
18777db96d56Sopenharmony_ci   :class:`SSLSocket`. The attribute can be overridden on instance of class
18787db96d56Sopenharmony_ci   in order to return a custom subclass of :class:`SSLSocket`.
18797db96d56Sopenharmony_ci
18807db96d56Sopenharmony_ci   .. versionadded:: 3.7
18817db96d56Sopenharmony_ci
18827db96d56Sopenharmony_ci.. method:: SSLContext.wrap_bio(incoming, outgoing, server_side=False, \
18837db96d56Sopenharmony_ci                                server_hostname=None, session=None)
18847db96d56Sopenharmony_ci
18857db96d56Sopenharmony_ci   Wrap the BIO objects *incoming* and *outgoing* and return an instance of
18867db96d56Sopenharmony_ci   :attr:`SSLContext.sslobject_class` (default :class:`SSLObject`). The SSL
18877db96d56Sopenharmony_ci   routines will read input data from the incoming BIO and write data to the
18887db96d56Sopenharmony_ci   outgoing BIO.
18897db96d56Sopenharmony_ci
18907db96d56Sopenharmony_ci   The *server_side*, *server_hostname* and *session* parameters have the
18917db96d56Sopenharmony_ci   same meaning as in :meth:`SSLContext.wrap_socket`.
18927db96d56Sopenharmony_ci
18937db96d56Sopenharmony_ci   .. versionchanged:: 3.6
18947db96d56Sopenharmony_ci      *session* argument was added.
18957db96d56Sopenharmony_ci
18967db96d56Sopenharmony_ci   .. versionchanged:: 3.7
18977db96d56Sopenharmony_ci      The method returns an instance of :attr:`SSLContext.sslobject_class`
18987db96d56Sopenharmony_ci      instead of hard-coded :class:`SSLObject`.
18997db96d56Sopenharmony_ci
19007db96d56Sopenharmony_ci.. attribute:: SSLContext.sslobject_class
19017db96d56Sopenharmony_ci
19027db96d56Sopenharmony_ci   The return type of :meth:`SSLContext.wrap_bio`, defaults to
19037db96d56Sopenharmony_ci   :class:`SSLObject`. The attribute can be overridden on instance of class
19047db96d56Sopenharmony_ci   in order to return a custom subclass of :class:`SSLObject`.
19057db96d56Sopenharmony_ci
19067db96d56Sopenharmony_ci   .. versionadded:: 3.7
19077db96d56Sopenharmony_ci
19087db96d56Sopenharmony_ci.. method:: SSLContext.session_stats()
19097db96d56Sopenharmony_ci
19107db96d56Sopenharmony_ci   Get statistics about the SSL sessions created or managed by this context.
19117db96d56Sopenharmony_ci   A dictionary is returned which maps the names of each `piece of information <https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_sess_number.html>`_ to their
19127db96d56Sopenharmony_ci   numeric values.  For example, here is the total number of hits and misses
19137db96d56Sopenharmony_ci   in the session cache since the context was created::
19147db96d56Sopenharmony_ci
19157db96d56Sopenharmony_ci      >>> stats = context.session_stats()
19167db96d56Sopenharmony_ci      >>> stats['hits'], stats['misses']
19177db96d56Sopenharmony_ci      (0, 0)
19187db96d56Sopenharmony_ci
19197db96d56Sopenharmony_ci.. attribute:: SSLContext.check_hostname
19207db96d56Sopenharmony_ci
19217db96d56Sopenharmony_ci   Whether to match the peer cert's hostname in
19227db96d56Sopenharmony_ci   :meth:`SSLSocket.do_handshake`. The context's
19237db96d56Sopenharmony_ci   :attr:`~SSLContext.verify_mode` must be set to :data:`CERT_OPTIONAL` or
19247db96d56Sopenharmony_ci   :data:`CERT_REQUIRED`, and you must pass *server_hostname* to
19257db96d56Sopenharmony_ci   :meth:`~SSLContext.wrap_socket` in order to match the hostname.  Enabling
19267db96d56Sopenharmony_ci   hostname checking automatically sets :attr:`~SSLContext.verify_mode` from
19277db96d56Sopenharmony_ci   :data:`CERT_NONE` to :data:`CERT_REQUIRED`.  It cannot be set back to
19287db96d56Sopenharmony_ci   :data:`CERT_NONE` as long as hostname checking is enabled. The
19297db96d56Sopenharmony_ci   :data:`PROTOCOL_TLS_CLIENT` protocol enables hostname checking by default.
19307db96d56Sopenharmony_ci   With other protocols, hostname checking must be enabled explicitly.
19317db96d56Sopenharmony_ci
19327db96d56Sopenharmony_ci   Example::
19337db96d56Sopenharmony_ci
19347db96d56Sopenharmony_ci      import socket, ssl
19357db96d56Sopenharmony_ci
19367db96d56Sopenharmony_ci      context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
19377db96d56Sopenharmony_ci      context.verify_mode = ssl.CERT_REQUIRED
19387db96d56Sopenharmony_ci      context.check_hostname = True
19397db96d56Sopenharmony_ci      context.load_default_certs()
19407db96d56Sopenharmony_ci
19417db96d56Sopenharmony_ci      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
19427db96d56Sopenharmony_ci      ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
19437db96d56Sopenharmony_ci      ssl_sock.connect(('www.verisign.com', 443))
19447db96d56Sopenharmony_ci
19457db96d56Sopenharmony_ci   .. versionadded:: 3.4
19467db96d56Sopenharmony_ci
19477db96d56Sopenharmony_ci   .. versionchanged:: 3.7
19487db96d56Sopenharmony_ci
19497db96d56Sopenharmony_ci      :attr:`~SSLContext.verify_mode` is now automatically changed
19507db96d56Sopenharmony_ci      to :data:`CERT_REQUIRED`  when hostname checking is enabled and
19517db96d56Sopenharmony_ci      :attr:`~SSLContext.verify_mode` is :data:`CERT_NONE`. Previously
19527db96d56Sopenharmony_ci      the same operation would have failed with a :exc:`ValueError`.
19537db96d56Sopenharmony_ci
19547db96d56Sopenharmony_ci.. attribute:: SSLContext.keylog_filename
19557db96d56Sopenharmony_ci
19567db96d56Sopenharmony_ci   Write TLS keys to a keylog file, whenever key material is generated or
19577db96d56Sopenharmony_ci   received. The keylog file is designed for debugging purposes only. The
19587db96d56Sopenharmony_ci   file format is specified by NSS and used by many traffic analyzers such
19597db96d56Sopenharmony_ci   as Wireshark. The log file is opened in append-only mode. Writes are
19607db96d56Sopenharmony_ci   synchronized between threads, but not between processes.
19617db96d56Sopenharmony_ci
19627db96d56Sopenharmony_ci   .. versionadded:: 3.8
19637db96d56Sopenharmony_ci
19647db96d56Sopenharmony_ci.. attribute:: SSLContext.maximum_version
19657db96d56Sopenharmony_ci
19667db96d56Sopenharmony_ci   A :class:`TLSVersion` enum member representing the highest supported
19677db96d56Sopenharmony_ci   TLS version. The value defaults to :attr:`TLSVersion.MAXIMUM_SUPPORTED`.
19687db96d56Sopenharmony_ci   The attribute is read-only for protocols other than :attr:`PROTOCOL_TLS`,
19697db96d56Sopenharmony_ci   :attr:`PROTOCOL_TLS_CLIENT`, and :attr:`PROTOCOL_TLS_SERVER`.
19707db96d56Sopenharmony_ci
19717db96d56Sopenharmony_ci   The attributes :attr:`~SSLContext.maximum_version`,
19727db96d56Sopenharmony_ci   :attr:`~SSLContext.minimum_version` and
19737db96d56Sopenharmony_ci   :attr:`SSLContext.options` all affect the supported SSL
19747db96d56Sopenharmony_ci   and TLS versions of the context. The implementation does not prevent
19757db96d56Sopenharmony_ci   invalid combination. For example a context with
19767db96d56Sopenharmony_ci   :attr:`OP_NO_TLSv1_2` in :attr:`~SSLContext.options` and
19777db96d56Sopenharmony_ci   :attr:`~SSLContext.maximum_version` set to :attr:`TLSVersion.TLSv1_2`
19787db96d56Sopenharmony_ci   will not be able to establish a TLS 1.2 connection.
19797db96d56Sopenharmony_ci
19807db96d56Sopenharmony_ci   .. versionadded:: 3.7
19817db96d56Sopenharmony_ci
19827db96d56Sopenharmony_ci.. attribute:: SSLContext.minimum_version
19837db96d56Sopenharmony_ci
19847db96d56Sopenharmony_ci   Like :attr:`SSLContext.maximum_version` except it is the lowest
19857db96d56Sopenharmony_ci   supported version or :attr:`TLSVersion.MINIMUM_SUPPORTED`.
19867db96d56Sopenharmony_ci
19877db96d56Sopenharmony_ci   .. versionadded:: 3.7
19887db96d56Sopenharmony_ci
19897db96d56Sopenharmony_ci.. attribute:: SSLContext.num_tickets
19907db96d56Sopenharmony_ci
19917db96d56Sopenharmony_ci   Control the number of TLS 1.3 session tickets of a
19927db96d56Sopenharmony_ci   :attr:`PROTOCOL_TLS_SERVER` context. The setting has no impact on TLS
19937db96d56Sopenharmony_ci   1.0 to 1.2 connections.
19947db96d56Sopenharmony_ci
19957db96d56Sopenharmony_ci   .. versionadded:: 3.8
19967db96d56Sopenharmony_ci
19977db96d56Sopenharmony_ci.. attribute:: SSLContext.options
19987db96d56Sopenharmony_ci
19997db96d56Sopenharmony_ci   An integer representing the set of SSL options enabled on this context.
20007db96d56Sopenharmony_ci   The default value is :data:`OP_ALL`, but you can specify other options
20017db96d56Sopenharmony_ci   such as :data:`OP_NO_SSLv2` by ORing them together.
20027db96d56Sopenharmony_ci
20037db96d56Sopenharmony_ci   .. versionchanged:: 3.6
20047db96d56Sopenharmony_ci      :attr:`SSLContext.options` returns :class:`Options` flags:
20057db96d56Sopenharmony_ci
20067db96d56Sopenharmony_ci         >>> ssl.create_default_context().options  # doctest: +SKIP
20077db96d56Sopenharmony_ci         <Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
20087db96d56Sopenharmony_ci
20097db96d56Sopenharmony_ci   .. deprecated:: 3.7
20107db96d56Sopenharmony_ci
20117db96d56Sopenharmony_ci      All ``OP_NO_SSL*`` and ``OP_NO_TLS*`` options have been deprecated since
20127db96d56Sopenharmony_ci      Python 3.7. Use :attr:`SSLContext.minimum_version` and
20137db96d56Sopenharmony_ci      :attr:`SSLContext.maximum_version` instead.
20147db96d56Sopenharmony_ci
20157db96d56Sopenharmony_ci.. attribute:: SSLContext.post_handshake_auth
20167db96d56Sopenharmony_ci
20177db96d56Sopenharmony_ci   Enable TLS 1.3 post-handshake client authentication. Post-handshake auth
20187db96d56Sopenharmony_ci   is disabled by default and a server can only request a TLS client
20197db96d56Sopenharmony_ci   certificate during the initial handshake. When enabled, a server may
20207db96d56Sopenharmony_ci   request a TLS client certificate at any time after the handshake.
20217db96d56Sopenharmony_ci
20227db96d56Sopenharmony_ci   When enabled on client-side sockets, the client signals the server that
20237db96d56Sopenharmony_ci   it supports post-handshake authentication.
20247db96d56Sopenharmony_ci
20257db96d56Sopenharmony_ci   When enabled on server-side sockets, :attr:`SSLContext.verify_mode` must
20267db96d56Sopenharmony_ci   be set to :data:`CERT_OPTIONAL` or :data:`CERT_REQUIRED`, too. The
20277db96d56Sopenharmony_ci   actual client cert exchange is delayed until
20287db96d56Sopenharmony_ci   :meth:`SSLSocket.verify_client_post_handshake` is called and some I/O is
20297db96d56Sopenharmony_ci   performed.
20307db96d56Sopenharmony_ci
20317db96d56Sopenharmony_ci   .. versionadded:: 3.8
20327db96d56Sopenharmony_ci
20337db96d56Sopenharmony_ci.. attribute:: SSLContext.protocol
20347db96d56Sopenharmony_ci
20357db96d56Sopenharmony_ci   The protocol version chosen when constructing the context.  This attribute
20367db96d56Sopenharmony_ci   is read-only.
20377db96d56Sopenharmony_ci
20387db96d56Sopenharmony_ci.. attribute:: SSLContext.hostname_checks_common_name
20397db96d56Sopenharmony_ci
20407db96d56Sopenharmony_ci   Whether :attr:`~SSLContext.check_hostname` falls back to verify the cert's
20417db96d56Sopenharmony_ci   subject common name in the absence of a subject alternative name
20427db96d56Sopenharmony_ci   extension (default: true).
20437db96d56Sopenharmony_ci
20447db96d56Sopenharmony_ci   .. versionadded:: 3.7
20457db96d56Sopenharmony_ci
20467db96d56Sopenharmony_ci   .. versionchanged:: 3.10
20477db96d56Sopenharmony_ci
20487db96d56Sopenharmony_ci      The flag had no effect with OpenSSL before version 1.1.1k. Python 3.8.9,
20497db96d56Sopenharmony_ci      3.9.3, and 3.10 include workarounds for previous versions.
20507db96d56Sopenharmony_ci
20517db96d56Sopenharmony_ci.. attribute:: SSLContext.security_level
20527db96d56Sopenharmony_ci
20537db96d56Sopenharmony_ci   An integer representing the `security level
20547db96d56Sopenharmony_ci   <https://www.openssl.org/docs/manmaster/man3/SSL_CTX_get_security_level.html>`_
20557db96d56Sopenharmony_ci   for the context. This attribute is read-only.
20567db96d56Sopenharmony_ci
20577db96d56Sopenharmony_ci   .. versionadded:: 3.10
20587db96d56Sopenharmony_ci
20597db96d56Sopenharmony_ci.. attribute:: SSLContext.verify_flags
20607db96d56Sopenharmony_ci
20617db96d56Sopenharmony_ci   The flags for certificate verification operations. You can set flags like
20627db96d56Sopenharmony_ci   :data:`VERIFY_CRL_CHECK_LEAF` by ORing them together. By default OpenSSL
20637db96d56Sopenharmony_ci   does neither require nor verify certificate revocation lists (CRLs).
20647db96d56Sopenharmony_ci
20657db96d56Sopenharmony_ci   .. versionadded:: 3.4
20667db96d56Sopenharmony_ci
20677db96d56Sopenharmony_ci   .. versionchanged:: 3.6
20687db96d56Sopenharmony_ci      :attr:`SSLContext.verify_flags` returns :class:`VerifyFlags` flags:
20697db96d56Sopenharmony_ci
20707db96d56Sopenharmony_ci         >>> ssl.create_default_context().verify_flags  # doctest: +SKIP
20717db96d56Sopenharmony_ci         <VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
20727db96d56Sopenharmony_ci
20737db96d56Sopenharmony_ci.. attribute:: SSLContext.verify_mode
20747db96d56Sopenharmony_ci
20757db96d56Sopenharmony_ci   Whether to try to verify other peers' certificates and how to behave
20767db96d56Sopenharmony_ci   if verification fails.  This attribute must be one of
20777db96d56Sopenharmony_ci   :data:`CERT_NONE`, :data:`CERT_OPTIONAL` or :data:`CERT_REQUIRED`.
20787db96d56Sopenharmony_ci
20797db96d56Sopenharmony_ci   .. versionchanged:: 3.6
20807db96d56Sopenharmony_ci      :attr:`SSLContext.verify_mode` returns :class:`VerifyMode` enum:
20817db96d56Sopenharmony_ci
20827db96d56Sopenharmony_ci         >>> ssl.create_default_context().verify_mode  # doctest: +SKIP
20837db96d56Sopenharmony_ci         <VerifyMode.CERT_REQUIRED: 2>
20847db96d56Sopenharmony_ci
20857db96d56Sopenharmony_ci.. index:: single: certificates
20867db96d56Sopenharmony_ci
20877db96d56Sopenharmony_ci.. index:: single: X509 certificate
20887db96d56Sopenharmony_ci
20897db96d56Sopenharmony_ci.. _ssl-certificates:
20907db96d56Sopenharmony_ci
20917db96d56Sopenharmony_ciCertificates
20927db96d56Sopenharmony_ci------------
20937db96d56Sopenharmony_ci
20947db96d56Sopenharmony_ciCertificates in general are part of a public-key / private-key system.  In this
20957db96d56Sopenharmony_cisystem, each *principal*, (which may be a machine, or a person, or an
20967db96d56Sopenharmony_ciorganization) is assigned a unique two-part encryption key.  One part of the key
20977db96d56Sopenharmony_ciis public, and is called the *public key*; the other part is kept secret, and is
20987db96d56Sopenharmony_cicalled the *private key*.  The two parts are related, in that if you encrypt a
20997db96d56Sopenharmony_cimessage with one of the parts, you can decrypt it with the other part, and
21007db96d56Sopenharmony_ci**only** with the other part.
21017db96d56Sopenharmony_ci
21027db96d56Sopenharmony_ciA certificate contains information about two principals.  It contains the name
21037db96d56Sopenharmony_ciof a *subject*, and the subject's public key.  It also contains a statement by a
21047db96d56Sopenharmony_cisecond principal, the *issuer*, that the subject is who they claim to be, and
21057db96d56Sopenharmony_cithat this is indeed the subject's public key.  The issuer's statement is signed
21067db96d56Sopenharmony_ciwith the issuer's private key, which only the issuer knows.  However, anyone can
21077db96d56Sopenharmony_civerify the issuer's statement by finding the issuer's public key, decrypting the
21087db96d56Sopenharmony_cistatement with it, and comparing it to the other information in the certificate.
21097db96d56Sopenharmony_ciThe certificate also contains information about the time period over which it is
21107db96d56Sopenharmony_civalid.  This is expressed as two fields, called "notBefore" and "notAfter".
21117db96d56Sopenharmony_ci
21127db96d56Sopenharmony_ciIn the Python use of certificates, a client or server can use a certificate to
21137db96d56Sopenharmony_ciprove who they are.  The other side of a network connection can also be required
21147db96d56Sopenharmony_cito produce a certificate, and that certificate can be validated to the
21157db96d56Sopenharmony_cisatisfaction of the client or server that requires such validation.  The
21167db96d56Sopenharmony_ciconnection attempt can be set to raise an exception if the validation fails.
21177db96d56Sopenharmony_ciValidation is done automatically, by the underlying OpenSSL framework; the
21187db96d56Sopenharmony_ciapplication need not concern itself with its mechanics.  But the application
21197db96d56Sopenharmony_cidoes usually need to provide sets of certificates to allow this process to take
21207db96d56Sopenharmony_ciplace.
21217db96d56Sopenharmony_ci
21227db96d56Sopenharmony_ciPython uses files to contain certificates.  They should be formatted as "PEM"
21237db96d56Sopenharmony_ci(see :rfc:`1422`), which is a base-64 encoded form wrapped with a header line
21247db96d56Sopenharmony_ciand a footer line::
21257db96d56Sopenharmony_ci
21267db96d56Sopenharmony_ci      -----BEGIN CERTIFICATE-----
21277db96d56Sopenharmony_ci      ... (certificate in base64 PEM encoding) ...
21287db96d56Sopenharmony_ci      -----END CERTIFICATE-----
21297db96d56Sopenharmony_ci
21307db96d56Sopenharmony_ciCertificate chains
21317db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
21327db96d56Sopenharmony_ci
21337db96d56Sopenharmony_ciThe Python files which contain certificates can contain a sequence of
21347db96d56Sopenharmony_cicertificates, sometimes called a *certificate chain*.  This chain should start
21357db96d56Sopenharmony_ciwith the specific certificate for the principal who "is" the client or server,
21367db96d56Sopenharmony_ciand then the certificate for the issuer of that certificate, and then the
21377db96d56Sopenharmony_cicertificate for the issuer of *that* certificate, and so on up the chain till
21387db96d56Sopenharmony_ciyou get to a certificate which is *self-signed*, that is, a certificate which
21397db96d56Sopenharmony_cihas the same subject and issuer, sometimes called a *root certificate*.  The
21407db96d56Sopenharmony_cicertificates should just be concatenated together in the certificate file.  For
21417db96d56Sopenharmony_ciexample, suppose we had a three certificate chain, from our server certificate
21427db96d56Sopenharmony_cito the certificate of the certification authority that signed our server
21437db96d56Sopenharmony_cicertificate, to the root certificate of the agency which issued the
21447db96d56Sopenharmony_cicertification authority's certificate::
21457db96d56Sopenharmony_ci
21467db96d56Sopenharmony_ci      -----BEGIN CERTIFICATE-----
21477db96d56Sopenharmony_ci      ... (certificate for your server)...
21487db96d56Sopenharmony_ci      -----END CERTIFICATE-----
21497db96d56Sopenharmony_ci      -----BEGIN CERTIFICATE-----
21507db96d56Sopenharmony_ci      ... (the certificate for the CA)...
21517db96d56Sopenharmony_ci      -----END CERTIFICATE-----
21527db96d56Sopenharmony_ci      -----BEGIN CERTIFICATE-----
21537db96d56Sopenharmony_ci      ... (the root certificate for the CA's issuer)...
21547db96d56Sopenharmony_ci      -----END CERTIFICATE-----
21557db96d56Sopenharmony_ci
21567db96d56Sopenharmony_ciCA certificates
21577db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
21587db96d56Sopenharmony_ci
21597db96d56Sopenharmony_ciIf you are going to require validation of the other side of the connection's
21607db96d56Sopenharmony_cicertificate, you need to provide a "CA certs" file, filled with the certificate
21617db96d56Sopenharmony_cichains for each issuer you are willing to trust.  Again, this file just contains
21627db96d56Sopenharmony_cithese chains concatenated together.  For validation, Python will use the first
21637db96d56Sopenharmony_cichain it finds in the file which matches.  The platform's certificates file can
21647db96d56Sopenharmony_cibe used by calling :meth:`SSLContext.load_default_certs`, this is done
21657db96d56Sopenharmony_ciautomatically with :func:`.create_default_context`.
21667db96d56Sopenharmony_ci
21677db96d56Sopenharmony_ciCombined key and certificate
21687db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^
21697db96d56Sopenharmony_ci
21707db96d56Sopenharmony_ciOften the private key is stored in the same file as the certificate; in this
21717db96d56Sopenharmony_cicase, only the ``certfile`` parameter to :meth:`SSLContext.load_cert_chain`
21727db96d56Sopenharmony_ciand :func:`wrap_socket` needs to be passed.  If the private key is stored
21737db96d56Sopenharmony_ciwith the certificate, it should come before the first certificate in
21747db96d56Sopenharmony_cithe certificate chain::
21757db96d56Sopenharmony_ci
21767db96d56Sopenharmony_ci   -----BEGIN RSA PRIVATE KEY-----
21777db96d56Sopenharmony_ci   ... (private key in base64 encoding) ...
21787db96d56Sopenharmony_ci   -----END RSA PRIVATE KEY-----
21797db96d56Sopenharmony_ci   -----BEGIN CERTIFICATE-----
21807db96d56Sopenharmony_ci   ... (certificate in base64 PEM encoding) ...
21817db96d56Sopenharmony_ci   -----END CERTIFICATE-----
21827db96d56Sopenharmony_ci
21837db96d56Sopenharmony_ciSelf-signed certificates
21847db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^
21857db96d56Sopenharmony_ci
21867db96d56Sopenharmony_ciIf you are going to create a server that provides SSL-encrypted connection
21877db96d56Sopenharmony_ciservices, you will need to acquire a certificate for that service.  There are
21887db96d56Sopenharmony_cimany ways of acquiring appropriate certificates, such as buying one from a
21897db96d56Sopenharmony_cicertification authority.  Another common practice is to generate a self-signed
21907db96d56Sopenharmony_cicertificate.  The simplest way to do this is with the OpenSSL package, using
21917db96d56Sopenharmony_cisomething like the following::
21927db96d56Sopenharmony_ci
21937db96d56Sopenharmony_ci  % openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
21947db96d56Sopenharmony_ci  Generating a 1024 bit RSA private key
21957db96d56Sopenharmony_ci  .......++++++
21967db96d56Sopenharmony_ci  .............................++++++
21977db96d56Sopenharmony_ci  writing new private key to 'cert.pem'
21987db96d56Sopenharmony_ci  -----
21997db96d56Sopenharmony_ci  You are about to be asked to enter information that will be incorporated
22007db96d56Sopenharmony_ci  into your certificate request.
22017db96d56Sopenharmony_ci  What you are about to enter is what is called a Distinguished Name or a DN.
22027db96d56Sopenharmony_ci  There are quite a few fields but you can leave some blank
22037db96d56Sopenharmony_ci  For some fields there will be a default value,
22047db96d56Sopenharmony_ci  If you enter '.', the field will be left blank.
22057db96d56Sopenharmony_ci  -----
22067db96d56Sopenharmony_ci  Country Name (2 letter code) [AU]:US
22077db96d56Sopenharmony_ci  State or Province Name (full name) [Some-State]:MyState
22087db96d56Sopenharmony_ci  Locality Name (eg, city) []:Some City
22097db96d56Sopenharmony_ci  Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
22107db96d56Sopenharmony_ci  Organizational Unit Name (eg, section) []:My Group
22117db96d56Sopenharmony_ci  Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
22127db96d56Sopenharmony_ci  Email Address []:ops@myserver.mygroup.myorganization.com
22137db96d56Sopenharmony_ci  %
22147db96d56Sopenharmony_ci
22157db96d56Sopenharmony_ciThe disadvantage of a self-signed certificate is that it is its own root
22167db96d56Sopenharmony_cicertificate, and no one else will have it in their cache of known (and trusted)
22177db96d56Sopenharmony_ciroot certificates.
22187db96d56Sopenharmony_ci
22197db96d56Sopenharmony_ci
22207db96d56Sopenharmony_ciExamples
22217db96d56Sopenharmony_ci--------
22227db96d56Sopenharmony_ci
22237db96d56Sopenharmony_ciTesting for SSL support
22247db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^
22257db96d56Sopenharmony_ci
22267db96d56Sopenharmony_ciTo test for the presence of SSL support in a Python installation, user code
22277db96d56Sopenharmony_cishould use the following idiom::
22287db96d56Sopenharmony_ci
22297db96d56Sopenharmony_ci   try:
22307db96d56Sopenharmony_ci       import ssl
22317db96d56Sopenharmony_ci   except ImportError:
22327db96d56Sopenharmony_ci       pass
22337db96d56Sopenharmony_ci   else:
22347db96d56Sopenharmony_ci       ...  # do something that requires SSL support
22357db96d56Sopenharmony_ci
22367db96d56Sopenharmony_ciClient-side operation
22377db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^
22387db96d56Sopenharmony_ci
22397db96d56Sopenharmony_ciThis example creates a SSL context with the recommended security settings
22407db96d56Sopenharmony_cifor client sockets, including automatic certificate verification::
22417db96d56Sopenharmony_ci
22427db96d56Sopenharmony_ci   >>> context = ssl.create_default_context()
22437db96d56Sopenharmony_ci
22447db96d56Sopenharmony_ciIf you prefer to tune security settings yourself, you might create
22457db96d56Sopenharmony_cia context from scratch (but beware that you might not get the settings
22467db96d56Sopenharmony_ciright)::
22477db96d56Sopenharmony_ci
22487db96d56Sopenharmony_ci   >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
22497db96d56Sopenharmony_ci   >>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
22507db96d56Sopenharmony_ci
22517db96d56Sopenharmony_ci(this snippet assumes your operating system places a bundle of all CA
22527db96d56Sopenharmony_cicertificates in ``/etc/ssl/certs/ca-bundle.crt``; if not, you'll get an
22537db96d56Sopenharmony_cierror and have to adjust the location)
22547db96d56Sopenharmony_ci
22557db96d56Sopenharmony_ciThe :data:`PROTOCOL_TLS_CLIENT` protocol configures the context for cert
22567db96d56Sopenharmony_civalidation and hostname verification. :attr:`~SSLContext.verify_mode` is
22577db96d56Sopenharmony_ciset to :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` is set
22587db96d56Sopenharmony_cito ``True``. All other protocols create SSL contexts with insecure defaults.
22597db96d56Sopenharmony_ci
22607db96d56Sopenharmony_ciWhen you use the context to connect to a server, :const:`CERT_REQUIRED`
22617db96d56Sopenharmony_ciand :attr:`~SSLContext.check_hostname` validate the server certificate: it
22627db96d56Sopenharmony_ciensures that the server certificate was signed with one of the CA
22637db96d56Sopenharmony_cicertificates, checks the signature for correctness, and verifies other
22647db96d56Sopenharmony_ciproperties like validity and identity of the hostname::
22657db96d56Sopenharmony_ci
22667db96d56Sopenharmony_ci   >>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
22677db96d56Sopenharmony_ci   ...                            server_hostname="www.python.org")
22687db96d56Sopenharmony_ci   >>> conn.connect(("www.python.org", 443))
22697db96d56Sopenharmony_ci
22707db96d56Sopenharmony_ciYou may then fetch the certificate::
22717db96d56Sopenharmony_ci
22727db96d56Sopenharmony_ci   >>> cert = conn.getpeercert()
22737db96d56Sopenharmony_ci
22747db96d56Sopenharmony_ciVisual inspection shows that the certificate does identify the desired service
22757db96d56Sopenharmony_ci(that is, the HTTPS host ``www.python.org``)::
22767db96d56Sopenharmony_ci
22777db96d56Sopenharmony_ci   >>> pprint.pprint(cert)
22787db96d56Sopenharmony_ci   {'OCSP': ('http://ocsp.digicert.com',),
22797db96d56Sopenharmony_ci    'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
22807db96d56Sopenharmony_ci    'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
22817db96d56Sopenharmony_ci                              'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
22827db96d56Sopenharmony_ci    'issuer': ((('countryName', 'US'),),
22837db96d56Sopenharmony_ci               (('organizationName', 'DigiCert Inc'),),
22847db96d56Sopenharmony_ci               (('organizationalUnitName', 'www.digicert.com'),),
22857db96d56Sopenharmony_ci               (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
22867db96d56Sopenharmony_ci    'notAfter': 'Sep  9 12:00:00 2016 GMT',
22877db96d56Sopenharmony_ci    'notBefore': 'Sep  5 00:00:00 2014 GMT',
22887db96d56Sopenharmony_ci    'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
22897db96d56Sopenharmony_ci    'subject': ((('businessCategory', 'Private Organization'),),
22907db96d56Sopenharmony_ci                (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
22917db96d56Sopenharmony_ci                (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
22927db96d56Sopenharmony_ci                (('serialNumber', '3359300'),),
22937db96d56Sopenharmony_ci                (('streetAddress', '16 Allen Rd'),),
22947db96d56Sopenharmony_ci                (('postalCode', '03894-4801'),),
22957db96d56Sopenharmony_ci                (('countryName', 'US'),),
22967db96d56Sopenharmony_ci                (('stateOrProvinceName', 'NH'),),
22977db96d56Sopenharmony_ci                (('localityName', 'Wolfeboro'),),
22987db96d56Sopenharmony_ci                (('organizationName', 'Python Software Foundation'),),
22997db96d56Sopenharmony_ci                (('commonName', 'www.python.org'),)),
23007db96d56Sopenharmony_ci    'subjectAltName': (('DNS', 'www.python.org'),
23017db96d56Sopenharmony_ci                       ('DNS', 'python.org'),
23027db96d56Sopenharmony_ci                       ('DNS', 'pypi.org'),
23037db96d56Sopenharmony_ci                       ('DNS', 'docs.python.org'),
23047db96d56Sopenharmony_ci                       ('DNS', 'testpypi.org'),
23057db96d56Sopenharmony_ci                       ('DNS', 'bugs.python.org'),
23067db96d56Sopenharmony_ci                       ('DNS', 'wiki.python.org'),
23077db96d56Sopenharmony_ci                       ('DNS', 'hg.python.org'),
23087db96d56Sopenharmony_ci                       ('DNS', 'mail.python.org'),
23097db96d56Sopenharmony_ci                       ('DNS', 'packaging.python.org'),
23107db96d56Sopenharmony_ci                       ('DNS', 'pythonhosted.org'),
23117db96d56Sopenharmony_ci                       ('DNS', 'www.pythonhosted.org'),
23127db96d56Sopenharmony_ci                       ('DNS', 'test.pythonhosted.org'),
23137db96d56Sopenharmony_ci                       ('DNS', 'us.pycon.org'),
23147db96d56Sopenharmony_ci                       ('DNS', 'id.python.org')),
23157db96d56Sopenharmony_ci    'version': 3}
23167db96d56Sopenharmony_ci
23177db96d56Sopenharmony_ciNow the SSL channel is established and the certificate verified, you can
23187db96d56Sopenharmony_ciproceed to talk with the server::
23197db96d56Sopenharmony_ci
23207db96d56Sopenharmony_ci   >>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
23217db96d56Sopenharmony_ci   >>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
23227db96d56Sopenharmony_ci   [b'HTTP/1.1 200 OK',
23237db96d56Sopenharmony_ci    b'Date: Sat, 18 Oct 2014 18:27:20 GMT',
23247db96d56Sopenharmony_ci    b'Server: nginx',
23257db96d56Sopenharmony_ci    b'Content-Type: text/html; charset=utf-8',
23267db96d56Sopenharmony_ci    b'X-Frame-Options: SAMEORIGIN',
23277db96d56Sopenharmony_ci    b'Content-Length: 45679',
23287db96d56Sopenharmony_ci    b'Accept-Ranges: bytes',
23297db96d56Sopenharmony_ci    b'Via: 1.1 varnish',
23307db96d56Sopenharmony_ci    b'Age: 2188',
23317db96d56Sopenharmony_ci    b'X-Served-By: cache-lcy1134-LCY',
23327db96d56Sopenharmony_ci    b'X-Cache: HIT',
23337db96d56Sopenharmony_ci    b'X-Cache-Hits: 11',
23347db96d56Sopenharmony_ci    b'Vary: Cookie',
23357db96d56Sopenharmony_ci    b'Strict-Transport-Security: max-age=63072000; includeSubDomains',
23367db96d56Sopenharmony_ci    b'Connection: close',
23377db96d56Sopenharmony_ci    b'',
23387db96d56Sopenharmony_ci    b'']
23397db96d56Sopenharmony_ci
23407db96d56Sopenharmony_ciSee the discussion of :ref:`ssl-security` below.
23417db96d56Sopenharmony_ci
23427db96d56Sopenharmony_ci
23437db96d56Sopenharmony_ciServer-side operation
23447db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^
23457db96d56Sopenharmony_ci
23467db96d56Sopenharmony_ciFor server operation, typically you'll need to have a server certificate, and
23477db96d56Sopenharmony_ciprivate key, each in a file.  You'll first create a context holding the key
23487db96d56Sopenharmony_ciand the certificate, so that clients can check your authenticity.  Then
23497db96d56Sopenharmony_ciyou'll open a socket, bind it to a port, call :meth:`listen` on it, and start
23507db96d56Sopenharmony_ciwaiting for clients to connect::
23517db96d56Sopenharmony_ci
23527db96d56Sopenharmony_ci   import socket, ssl
23537db96d56Sopenharmony_ci
23547db96d56Sopenharmony_ci   context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
23557db96d56Sopenharmony_ci   context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")
23567db96d56Sopenharmony_ci
23577db96d56Sopenharmony_ci   bindsocket = socket.socket()
23587db96d56Sopenharmony_ci   bindsocket.bind(('myaddr.example.com', 10023))
23597db96d56Sopenharmony_ci   bindsocket.listen(5)
23607db96d56Sopenharmony_ci
23617db96d56Sopenharmony_ciWhen a client connects, you'll call :meth:`accept` on the socket to get the
23627db96d56Sopenharmony_cinew socket from the other end, and use the context's :meth:`SSLContext.wrap_socket`
23637db96d56Sopenharmony_cimethod to create a server-side SSL socket for the connection::
23647db96d56Sopenharmony_ci
23657db96d56Sopenharmony_ci   while True:
23667db96d56Sopenharmony_ci       newsocket, fromaddr = bindsocket.accept()
23677db96d56Sopenharmony_ci       connstream = context.wrap_socket(newsocket, server_side=True)
23687db96d56Sopenharmony_ci       try:
23697db96d56Sopenharmony_ci           deal_with_client(connstream)
23707db96d56Sopenharmony_ci       finally:
23717db96d56Sopenharmony_ci           connstream.shutdown(socket.SHUT_RDWR)
23727db96d56Sopenharmony_ci           connstream.close()
23737db96d56Sopenharmony_ci
23747db96d56Sopenharmony_ciThen you'll read data from the ``connstream`` and do something with it till you
23757db96d56Sopenharmony_ciare finished with the client (or the client is finished with you)::
23767db96d56Sopenharmony_ci
23777db96d56Sopenharmony_ci   def deal_with_client(connstream):
23787db96d56Sopenharmony_ci       data = connstream.recv(1024)
23797db96d56Sopenharmony_ci       # empty data means the client is finished with us
23807db96d56Sopenharmony_ci       while data:
23817db96d56Sopenharmony_ci           if not do_something(connstream, data):
23827db96d56Sopenharmony_ci               # we'll assume do_something returns False
23837db96d56Sopenharmony_ci               # when we're finished with client
23847db96d56Sopenharmony_ci               break
23857db96d56Sopenharmony_ci           data = connstream.recv(1024)
23867db96d56Sopenharmony_ci       # finished with client
23877db96d56Sopenharmony_ci
23887db96d56Sopenharmony_ciAnd go back to listening for new client connections (of course, a real server
23897db96d56Sopenharmony_ciwould probably handle each client connection in a separate thread, or put
23907db96d56Sopenharmony_cithe sockets in :ref:`non-blocking mode <ssl-nonblocking>` and use an event loop).
23917db96d56Sopenharmony_ci
23927db96d56Sopenharmony_ci
23937db96d56Sopenharmony_ci.. _ssl-nonblocking:
23947db96d56Sopenharmony_ci
23957db96d56Sopenharmony_ciNotes on non-blocking sockets
23967db96d56Sopenharmony_ci-----------------------------
23977db96d56Sopenharmony_ci
23987db96d56Sopenharmony_ciSSL sockets behave slightly different than regular sockets in
23997db96d56Sopenharmony_cinon-blocking mode. When working with non-blocking sockets, there are
24007db96d56Sopenharmony_cithus several things you need to be aware of:
24017db96d56Sopenharmony_ci
24027db96d56Sopenharmony_ci- Most :class:`SSLSocket` methods will raise either
24037db96d56Sopenharmony_ci  :exc:`SSLWantWriteError` or :exc:`SSLWantReadError` instead of
24047db96d56Sopenharmony_ci  :exc:`BlockingIOError` if an I/O operation would
24057db96d56Sopenharmony_ci  block. :exc:`SSLWantReadError` will be raised if a read operation on
24067db96d56Sopenharmony_ci  the underlying socket is necessary, and :exc:`SSLWantWriteError` for
24077db96d56Sopenharmony_ci  a write operation on the underlying socket. Note that attempts to
24087db96d56Sopenharmony_ci  *write* to an SSL socket may require *reading* from the underlying
24097db96d56Sopenharmony_ci  socket first, and attempts to *read* from the SSL socket may require
24107db96d56Sopenharmony_ci  a prior *write* to the underlying socket.
24117db96d56Sopenharmony_ci
24127db96d56Sopenharmony_ci  .. versionchanged:: 3.5
24137db96d56Sopenharmony_ci
24147db96d56Sopenharmony_ci     In earlier Python versions, the :meth:`!SSLSocket.send` method
24157db96d56Sopenharmony_ci     returned zero instead of raising :exc:`SSLWantWriteError` or
24167db96d56Sopenharmony_ci     :exc:`SSLWantReadError`.
24177db96d56Sopenharmony_ci
24187db96d56Sopenharmony_ci- Calling :func:`~select.select` tells you that the OS-level socket can be
24197db96d56Sopenharmony_ci  read from (or written to), but it does not imply that there is sufficient
24207db96d56Sopenharmony_ci  data at the upper SSL layer.  For example, only part of an SSL frame might
24217db96d56Sopenharmony_ci  have arrived.  Therefore, you must be ready to handle :meth:`SSLSocket.recv`
24227db96d56Sopenharmony_ci  and :meth:`SSLSocket.send` failures, and retry after another call to
24237db96d56Sopenharmony_ci  :func:`~select.select`.
24247db96d56Sopenharmony_ci
24257db96d56Sopenharmony_ci- Conversely, since the SSL layer has its own framing, a SSL socket may
24267db96d56Sopenharmony_ci  still have data available for reading without :func:`~select.select`
24277db96d56Sopenharmony_ci  being aware of it.  Therefore, you should first call
24287db96d56Sopenharmony_ci  :meth:`SSLSocket.recv` to drain any potentially available data, and then
24297db96d56Sopenharmony_ci  only block on a :func:`~select.select` call if still necessary.
24307db96d56Sopenharmony_ci
24317db96d56Sopenharmony_ci  (of course, similar provisions apply when using other primitives such as
24327db96d56Sopenharmony_ci  :func:`~select.poll`, or those in the :mod:`selectors` module)
24337db96d56Sopenharmony_ci
24347db96d56Sopenharmony_ci- The SSL handshake itself will be non-blocking: the
24357db96d56Sopenharmony_ci  :meth:`SSLSocket.do_handshake` method has to be retried until it returns
24367db96d56Sopenharmony_ci  successfully.  Here is a synopsis using :func:`~select.select` to wait for
24377db96d56Sopenharmony_ci  the socket's readiness::
24387db96d56Sopenharmony_ci
24397db96d56Sopenharmony_ci    while True:
24407db96d56Sopenharmony_ci        try:
24417db96d56Sopenharmony_ci            sock.do_handshake()
24427db96d56Sopenharmony_ci            break
24437db96d56Sopenharmony_ci        except ssl.SSLWantReadError:
24447db96d56Sopenharmony_ci            select.select([sock], [], [])
24457db96d56Sopenharmony_ci        except ssl.SSLWantWriteError:
24467db96d56Sopenharmony_ci            select.select([], [sock], [])
24477db96d56Sopenharmony_ci
24487db96d56Sopenharmony_ci.. seealso::
24497db96d56Sopenharmony_ci
24507db96d56Sopenharmony_ci   The :mod:`asyncio` module supports :ref:`non-blocking SSL sockets
24517db96d56Sopenharmony_ci   <ssl-nonblocking>` and provides a
24527db96d56Sopenharmony_ci   higher level API. It polls for events using the :mod:`selectors` module and
24537db96d56Sopenharmony_ci   handles :exc:`SSLWantWriteError`, :exc:`SSLWantReadError` and
24547db96d56Sopenharmony_ci   :exc:`BlockingIOError` exceptions. It runs the SSL handshake asynchronously
24557db96d56Sopenharmony_ci   as well.
24567db96d56Sopenharmony_ci
24577db96d56Sopenharmony_ci
24587db96d56Sopenharmony_ciMemory BIO Support
24597db96d56Sopenharmony_ci------------------
24607db96d56Sopenharmony_ci
24617db96d56Sopenharmony_ci.. versionadded:: 3.5
24627db96d56Sopenharmony_ci
24637db96d56Sopenharmony_ciEver since the SSL module was introduced in Python 2.6, the :class:`SSLSocket`
24647db96d56Sopenharmony_ciclass has provided two related but distinct areas of functionality:
24657db96d56Sopenharmony_ci
24667db96d56Sopenharmony_ci- SSL protocol handling
24677db96d56Sopenharmony_ci- Network IO
24687db96d56Sopenharmony_ci
24697db96d56Sopenharmony_ciThe network IO API is identical to that provided by :class:`socket.socket`,
24707db96d56Sopenharmony_cifrom which :class:`SSLSocket` also inherits. This allows an SSL socket to be
24717db96d56Sopenharmony_ciused as a drop-in replacement for a regular socket, making it very easy to add
24727db96d56Sopenharmony_ciSSL support to an existing application.
24737db96d56Sopenharmony_ci
24747db96d56Sopenharmony_ciCombining SSL protocol handling and network IO usually works well, but there
24757db96d56Sopenharmony_ciare some cases where it doesn't. An example is async IO frameworks that want to
24767db96d56Sopenharmony_ciuse a different IO multiplexing model than the "select/poll on a file
24777db96d56Sopenharmony_cidescriptor" (readiness based) model that is assumed by :class:`socket.socket`
24787db96d56Sopenharmony_ciand by the internal OpenSSL socket IO routines. This is mostly relevant for
24797db96d56Sopenharmony_ciplatforms like Windows where this model is not efficient. For this purpose, a
24807db96d56Sopenharmony_cireduced scope variant of :class:`SSLSocket` called :class:`SSLObject` is
24817db96d56Sopenharmony_ciprovided.
24827db96d56Sopenharmony_ci
24837db96d56Sopenharmony_ci.. class:: SSLObject
24847db96d56Sopenharmony_ci
24857db96d56Sopenharmony_ci   A reduced-scope variant of :class:`SSLSocket` representing an SSL protocol
24867db96d56Sopenharmony_ci   instance that does not contain any network IO methods. This class is
24877db96d56Sopenharmony_ci   typically used by framework authors that want to implement asynchronous IO
24887db96d56Sopenharmony_ci   for SSL through memory buffers.
24897db96d56Sopenharmony_ci
24907db96d56Sopenharmony_ci   This class implements an interface on top of a low-level SSL object as
24917db96d56Sopenharmony_ci   implemented by OpenSSL. This object captures the state of an SSL connection
24927db96d56Sopenharmony_ci   but does not provide any network IO itself. IO needs to be performed through
24937db96d56Sopenharmony_ci   separate "BIO" objects which are OpenSSL's IO abstraction layer.
24947db96d56Sopenharmony_ci
24957db96d56Sopenharmony_ci   This class has no public constructor.  An :class:`SSLObject` instance
24967db96d56Sopenharmony_ci   must be created using the :meth:`~SSLContext.wrap_bio` method. This
24977db96d56Sopenharmony_ci   method will create the :class:`SSLObject` instance and bind it to a
24987db96d56Sopenharmony_ci   pair of BIOs. The *incoming* BIO is used to pass data from Python to the
24997db96d56Sopenharmony_ci   SSL protocol instance, while the *outgoing* BIO is used to pass data the
25007db96d56Sopenharmony_ci   other way around.
25017db96d56Sopenharmony_ci
25027db96d56Sopenharmony_ci   The following methods are available:
25037db96d56Sopenharmony_ci
25047db96d56Sopenharmony_ci   - :attr:`~SSLSocket.context`
25057db96d56Sopenharmony_ci   - :attr:`~SSLSocket.server_side`
25067db96d56Sopenharmony_ci   - :attr:`~SSLSocket.server_hostname`
25077db96d56Sopenharmony_ci   - :attr:`~SSLSocket.session`
25087db96d56Sopenharmony_ci   - :attr:`~SSLSocket.session_reused`
25097db96d56Sopenharmony_ci   - :meth:`~SSLSocket.read`
25107db96d56Sopenharmony_ci   - :meth:`~SSLSocket.write`
25117db96d56Sopenharmony_ci   - :meth:`~SSLSocket.getpeercert`
25127db96d56Sopenharmony_ci   - :meth:`~SSLSocket.selected_alpn_protocol`
25137db96d56Sopenharmony_ci   - :meth:`~SSLSocket.selected_npn_protocol`
25147db96d56Sopenharmony_ci   - :meth:`~SSLSocket.cipher`
25157db96d56Sopenharmony_ci   - :meth:`~SSLSocket.shared_ciphers`
25167db96d56Sopenharmony_ci   - :meth:`~SSLSocket.compression`
25177db96d56Sopenharmony_ci   - :meth:`~SSLSocket.pending`
25187db96d56Sopenharmony_ci   - :meth:`~SSLSocket.do_handshake`
25197db96d56Sopenharmony_ci   - :meth:`~SSLSocket.verify_client_post_handshake`
25207db96d56Sopenharmony_ci   - :meth:`~SSLSocket.unwrap`
25217db96d56Sopenharmony_ci   - :meth:`~SSLSocket.get_channel_binding`
25227db96d56Sopenharmony_ci   - :meth:`~SSLSocket.version`
25237db96d56Sopenharmony_ci
25247db96d56Sopenharmony_ci   When compared to :class:`SSLSocket`, this object lacks the following
25257db96d56Sopenharmony_ci   features:
25267db96d56Sopenharmony_ci
25277db96d56Sopenharmony_ci   - Any form of network IO; ``recv()`` and ``send()`` read and write only to
25287db96d56Sopenharmony_ci     the underlying :class:`MemoryBIO` buffers.
25297db96d56Sopenharmony_ci
25307db96d56Sopenharmony_ci   - There is no *do_handshake_on_connect* machinery. You must always manually
25317db96d56Sopenharmony_ci     call :meth:`~SSLSocket.do_handshake` to start the handshake.
25327db96d56Sopenharmony_ci
25337db96d56Sopenharmony_ci   - There is no handling of *suppress_ragged_eofs*. All end-of-file conditions
25347db96d56Sopenharmony_ci     that are in violation of the protocol are reported via the
25357db96d56Sopenharmony_ci     :exc:`SSLEOFError` exception.
25367db96d56Sopenharmony_ci
25377db96d56Sopenharmony_ci   - The method :meth:`~SSLSocket.unwrap` call does not return anything,
25387db96d56Sopenharmony_ci     unlike for an SSL socket where it returns the underlying socket.
25397db96d56Sopenharmony_ci
25407db96d56Sopenharmony_ci   - The *server_name_callback* callback passed to
25417db96d56Sopenharmony_ci     :meth:`SSLContext.set_servername_callback` will get an :class:`SSLObject`
25427db96d56Sopenharmony_ci     instance instead of a :class:`SSLSocket` instance as its first parameter.
25437db96d56Sopenharmony_ci
25447db96d56Sopenharmony_ci   Some notes related to the use of :class:`SSLObject`:
25457db96d56Sopenharmony_ci
25467db96d56Sopenharmony_ci   - All IO on an :class:`SSLObject` is :ref:`non-blocking <ssl-nonblocking>`.
25477db96d56Sopenharmony_ci     This means that for example :meth:`~SSLSocket.read` will raise an
25487db96d56Sopenharmony_ci     :exc:`SSLWantReadError` if it needs more data than the incoming BIO has
25497db96d56Sopenharmony_ci     available.
25507db96d56Sopenharmony_ci
25517db96d56Sopenharmony_ci   - There is no module-level ``wrap_bio()`` call like there is for
25527db96d56Sopenharmony_ci     :meth:`~SSLContext.wrap_socket`. An :class:`SSLObject` is always created
25537db96d56Sopenharmony_ci     via an :class:`SSLContext`.
25547db96d56Sopenharmony_ci
25557db96d56Sopenharmony_ci   .. versionchanged:: 3.7
25567db96d56Sopenharmony_ci      :class:`SSLObject` instances must to created with
25577db96d56Sopenharmony_ci      :meth:`~SSLContext.wrap_bio`. In earlier versions, it was possible to
25587db96d56Sopenharmony_ci      create instances directly. This was never documented or officially
25597db96d56Sopenharmony_ci      supported.
25607db96d56Sopenharmony_ci
25617db96d56Sopenharmony_ciAn SSLObject communicates with the outside world using memory buffers. The
25627db96d56Sopenharmony_ciclass :class:`MemoryBIO` provides a memory buffer that can be used for this
25637db96d56Sopenharmony_cipurpose.  It wraps an OpenSSL memory BIO (Basic IO) object:
25647db96d56Sopenharmony_ci
25657db96d56Sopenharmony_ci.. class:: MemoryBIO
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_ci   A memory buffer that can be used to pass data between Python and an SSL
25687db96d56Sopenharmony_ci   protocol instance.
25697db96d56Sopenharmony_ci
25707db96d56Sopenharmony_ci   .. attribute:: MemoryBIO.pending
25717db96d56Sopenharmony_ci
25727db96d56Sopenharmony_ci      Return the number of bytes currently in the memory buffer.
25737db96d56Sopenharmony_ci
25747db96d56Sopenharmony_ci   .. attribute:: MemoryBIO.eof
25757db96d56Sopenharmony_ci
25767db96d56Sopenharmony_ci      A boolean indicating whether the memory BIO is current at the end-of-file
25777db96d56Sopenharmony_ci      position.
25787db96d56Sopenharmony_ci
25797db96d56Sopenharmony_ci   .. method:: MemoryBIO.read(n=-1)
25807db96d56Sopenharmony_ci
25817db96d56Sopenharmony_ci      Read up to *n* bytes from the memory buffer. If *n* is not specified or
25827db96d56Sopenharmony_ci      negative, all bytes are returned.
25837db96d56Sopenharmony_ci
25847db96d56Sopenharmony_ci   .. method:: MemoryBIO.write(buf)
25857db96d56Sopenharmony_ci
25867db96d56Sopenharmony_ci      Write the bytes from *buf* to the memory BIO. The *buf* argument must be an
25877db96d56Sopenharmony_ci      object supporting the buffer protocol.
25887db96d56Sopenharmony_ci
25897db96d56Sopenharmony_ci      The return value is the number of bytes written, which is always equal to
25907db96d56Sopenharmony_ci      the length of *buf*.
25917db96d56Sopenharmony_ci
25927db96d56Sopenharmony_ci   .. method:: MemoryBIO.write_eof()
25937db96d56Sopenharmony_ci
25947db96d56Sopenharmony_ci      Write an EOF marker to the memory BIO. After this method has been called, it
25957db96d56Sopenharmony_ci      is illegal to call :meth:`~MemoryBIO.write`. The attribute :attr:`eof` will
25967db96d56Sopenharmony_ci      become true after all data currently in the buffer has been read.
25977db96d56Sopenharmony_ci
25987db96d56Sopenharmony_ci
25997db96d56Sopenharmony_ciSSL session
26007db96d56Sopenharmony_ci-----------
26017db96d56Sopenharmony_ci
26027db96d56Sopenharmony_ci.. versionadded:: 3.6
26037db96d56Sopenharmony_ci
26047db96d56Sopenharmony_ci.. class:: SSLSession
26057db96d56Sopenharmony_ci
26067db96d56Sopenharmony_ci   Session object used by :attr:`~SSLSocket.session`.
26077db96d56Sopenharmony_ci
26087db96d56Sopenharmony_ci   .. attribute:: id
26097db96d56Sopenharmony_ci   .. attribute:: time
26107db96d56Sopenharmony_ci   .. attribute:: timeout
26117db96d56Sopenharmony_ci   .. attribute:: ticket_lifetime_hint
26127db96d56Sopenharmony_ci   .. attribute:: has_ticket
26137db96d56Sopenharmony_ci
26147db96d56Sopenharmony_ci
26157db96d56Sopenharmony_ci.. _ssl-security:
26167db96d56Sopenharmony_ci
26177db96d56Sopenharmony_ciSecurity considerations
26187db96d56Sopenharmony_ci-----------------------
26197db96d56Sopenharmony_ci
26207db96d56Sopenharmony_ciBest defaults
26217db96d56Sopenharmony_ci^^^^^^^^^^^^^
26227db96d56Sopenharmony_ci
26237db96d56Sopenharmony_ciFor **client use**, if you don't have any special requirements for your
26247db96d56Sopenharmony_cisecurity policy, it is highly recommended that you use the
26257db96d56Sopenharmony_ci:func:`create_default_context` function to create your SSL context.
26267db96d56Sopenharmony_ciIt will load the system's trusted CA certificates, enable certificate
26277db96d56Sopenharmony_civalidation and hostname checking, and try to choose reasonably secure
26287db96d56Sopenharmony_ciprotocol and cipher settings.
26297db96d56Sopenharmony_ci
26307db96d56Sopenharmony_ciFor example, here is how you would use the :class:`smtplib.SMTP` class to
26317db96d56Sopenharmony_cicreate a trusted, secure connection to a SMTP server::
26327db96d56Sopenharmony_ci
26337db96d56Sopenharmony_ci   >>> import ssl, smtplib
26347db96d56Sopenharmony_ci   >>> smtp = smtplib.SMTP("mail.python.org", port=587)
26357db96d56Sopenharmony_ci   >>> context = ssl.create_default_context()
26367db96d56Sopenharmony_ci   >>> smtp.starttls(context=context)
26377db96d56Sopenharmony_ci   (220, b'2.0.0 Ready to start TLS')
26387db96d56Sopenharmony_ci
26397db96d56Sopenharmony_ciIf a client certificate is needed for the connection, it can be added with
26407db96d56Sopenharmony_ci:meth:`SSLContext.load_cert_chain`.
26417db96d56Sopenharmony_ci
26427db96d56Sopenharmony_ciBy contrast, if you create the SSL context by calling the :class:`SSLContext`
26437db96d56Sopenharmony_ciconstructor yourself, it will not have certificate validation nor hostname
26447db96d56Sopenharmony_cichecking enabled by default.  If you do so, please read the paragraphs below
26457db96d56Sopenharmony_cito achieve a good security level.
26467db96d56Sopenharmony_ci
26477db96d56Sopenharmony_ciManual settings
26487db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
26497db96d56Sopenharmony_ci
26507db96d56Sopenharmony_ciVerifying certificates
26517db96d56Sopenharmony_ci''''''''''''''''''''''
26527db96d56Sopenharmony_ci
26537db96d56Sopenharmony_ciWhen calling the :class:`SSLContext` constructor directly,
26547db96d56Sopenharmony_ci:const:`CERT_NONE` is the default.  Since it does not authenticate the other
26557db96d56Sopenharmony_cipeer, it can be insecure, especially in client mode where most of time you
26567db96d56Sopenharmony_ciwould like to ensure the authenticity of the server you're talking to.
26577db96d56Sopenharmony_ciTherefore, when in client mode, it is highly recommended to use
26587db96d56Sopenharmony_ci:const:`CERT_REQUIRED`.  However, it is in itself not sufficient; you also
26597db96d56Sopenharmony_cihave to check that the server certificate, which can be obtained by calling
26607db96d56Sopenharmony_ci:meth:`SSLSocket.getpeercert`, matches the desired service.  For many
26617db96d56Sopenharmony_ciprotocols and applications, the service can be identified by the hostname;
26627db96d56Sopenharmony_ciin this case, the :func:`match_hostname` function can be used.  This common
26637db96d56Sopenharmony_cicheck is automatically performed when :attr:`SSLContext.check_hostname` is
26647db96d56Sopenharmony_cienabled.
26657db96d56Sopenharmony_ci
26667db96d56Sopenharmony_ci.. versionchanged:: 3.7
26677db96d56Sopenharmony_ci   Hostname matchings is now performed by OpenSSL. Python no longer uses
26687db96d56Sopenharmony_ci   :func:`match_hostname`.
26697db96d56Sopenharmony_ci
26707db96d56Sopenharmony_ciIn server mode, if you want to authenticate your clients using the SSL layer
26717db96d56Sopenharmony_ci(rather than using a higher-level authentication mechanism), you'll also have
26727db96d56Sopenharmony_cito specify :const:`CERT_REQUIRED` and similarly check the client certificate.
26737db96d56Sopenharmony_ci
26747db96d56Sopenharmony_ci
26757db96d56Sopenharmony_ciProtocol versions
26767db96d56Sopenharmony_ci'''''''''''''''''
26777db96d56Sopenharmony_ci
26787db96d56Sopenharmony_ciSSL versions 2 and 3 are considered insecure and are therefore dangerous to
26797db96d56Sopenharmony_ciuse.  If you want maximum compatibility between clients and servers, it is
26807db96d56Sopenharmony_cirecommended to use :const:`PROTOCOL_TLS_CLIENT` or
26817db96d56Sopenharmony_ci:const:`PROTOCOL_TLS_SERVER` as the protocol version. SSLv2 and SSLv3 are
26827db96d56Sopenharmony_cidisabled by default.
26837db96d56Sopenharmony_ci
26847db96d56Sopenharmony_ci::
26857db96d56Sopenharmony_ci
26867db96d56Sopenharmony_ci   >>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
26877db96d56Sopenharmony_ci   >>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3
26887db96d56Sopenharmony_ci   >>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
26897db96d56Sopenharmony_ci
26907db96d56Sopenharmony_ci
26917db96d56Sopenharmony_ciThe SSL context created above will only allow TLSv1.2 and later (if
26927db96d56Sopenharmony_cisupported by your system) connections to a server. :const:`PROTOCOL_TLS_CLIENT`
26937db96d56Sopenharmony_ciimplies certificate validation and hostname checks by default. You have to
26947db96d56Sopenharmony_ciload certificates into the context.
26957db96d56Sopenharmony_ci
26967db96d56Sopenharmony_ci
26977db96d56Sopenharmony_ciCipher selection
26987db96d56Sopenharmony_ci''''''''''''''''
26997db96d56Sopenharmony_ci
27007db96d56Sopenharmony_ciIf you have advanced security requirements, fine-tuning of the ciphers
27017db96d56Sopenharmony_cienabled when negotiating a SSL session is possible through the
27027db96d56Sopenharmony_ci:meth:`SSLContext.set_ciphers` method.  Starting from Python 3.2.3, the
27037db96d56Sopenharmony_cissl module disables certain weak ciphers by default, but you may want
27047db96d56Sopenharmony_cito further restrict the cipher choice. Be sure to read OpenSSL's documentation
27057db96d56Sopenharmony_ciabout the `cipher list format <https://www.openssl.org/docs/man1.1.1/man1/ciphers.html#CIPHER-LIST-FORMAT>`_.
27067db96d56Sopenharmony_ciIf you want to check which ciphers are enabled by a given cipher list, use
27077db96d56Sopenharmony_ci:meth:`SSLContext.get_ciphers` or the ``openssl ciphers`` command on your
27087db96d56Sopenharmony_cisystem.
27097db96d56Sopenharmony_ci
27107db96d56Sopenharmony_ciMulti-processing
27117db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
27127db96d56Sopenharmony_ci
27137db96d56Sopenharmony_ciIf using this module as part of a multi-processed application (using,
27147db96d56Sopenharmony_cifor example the :mod:`multiprocessing` or :mod:`concurrent.futures` modules),
27157db96d56Sopenharmony_cibe aware that OpenSSL's internal random number generator does not properly
27167db96d56Sopenharmony_cihandle forked processes.  Applications must change the PRNG state of the
27177db96d56Sopenharmony_ciparent process if they use any SSL feature with :func:`os.fork`.  Any
27187db96d56Sopenharmony_cisuccessful call of :func:`~ssl.RAND_add`, :func:`~ssl.RAND_bytes` or
27197db96d56Sopenharmony_ci:func:`~ssl.RAND_pseudo_bytes` is sufficient.
27207db96d56Sopenharmony_ci
27217db96d56Sopenharmony_ci
27227db96d56Sopenharmony_ci.. _ssl-tlsv1_3:
27237db96d56Sopenharmony_ci
27247db96d56Sopenharmony_ciTLS 1.3
27257db96d56Sopenharmony_ci-------
27267db96d56Sopenharmony_ci
27277db96d56Sopenharmony_ci.. versionadded:: 3.7
27287db96d56Sopenharmony_ci
27297db96d56Sopenharmony_ciThe TLS 1.3 protocol behaves slightly differently than previous version
27307db96d56Sopenharmony_ciof TLS/SSL. Some new TLS 1.3 features are not yet available.
27317db96d56Sopenharmony_ci
27327db96d56Sopenharmony_ci- TLS 1.3 uses a disjunct set of cipher suites. All AES-GCM and
27337db96d56Sopenharmony_ci  ChaCha20 cipher suites are enabled by default.  The method
27347db96d56Sopenharmony_ci  :meth:`SSLContext.set_ciphers` cannot enable or disable any TLS 1.3
27357db96d56Sopenharmony_ci  ciphers yet, but :meth:`SSLContext.get_ciphers` returns them.
27367db96d56Sopenharmony_ci- Session tickets are no longer sent as part of the initial handshake and
27377db96d56Sopenharmony_ci  are handled differently.  :attr:`SSLSocket.session` and :class:`SSLSession`
27387db96d56Sopenharmony_ci  are not compatible with TLS 1.3.
27397db96d56Sopenharmony_ci- Client-side certificates are also no longer verified during the initial
27407db96d56Sopenharmony_ci  handshake.  A server can request a certificate at any time.  Clients
27417db96d56Sopenharmony_ci  process certificate requests while they send or receive application data
27427db96d56Sopenharmony_ci  from the server.
27437db96d56Sopenharmony_ci- TLS 1.3 features like early data, deferred TLS client cert request,
27447db96d56Sopenharmony_ci  signature algorithm configuration, and rekeying are not supported yet.
27457db96d56Sopenharmony_ci
27467db96d56Sopenharmony_ci
27477db96d56Sopenharmony_ci.. seealso::
27487db96d56Sopenharmony_ci
27497db96d56Sopenharmony_ci   Class :class:`socket.socket`
27507db96d56Sopenharmony_ci       Documentation of underlying :mod:`socket` class
27517db96d56Sopenharmony_ci
27527db96d56Sopenharmony_ci   `SSL/TLS Strong Encryption: An Introduction <https://httpd.apache.org/docs/trunk/en/ssl/ssl_intro.html>`_
27537db96d56Sopenharmony_ci       Intro from the Apache HTTP Server documentation
27547db96d56Sopenharmony_ci
27557db96d56Sopenharmony_ci   :rfc:`RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management <1422>`
27567db96d56Sopenharmony_ci       Steve Kent
27577db96d56Sopenharmony_ci
27587db96d56Sopenharmony_ci   :rfc:`RFC 4086: Randomness Requirements for Security <4086>`
27597db96d56Sopenharmony_ci       Donald E., Jeffrey I. Schiller
27607db96d56Sopenharmony_ci
27617db96d56Sopenharmony_ci   :rfc:`RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile <5280>`
27627db96d56Sopenharmony_ci       D. Cooper
27637db96d56Sopenharmony_ci
27647db96d56Sopenharmony_ci   :rfc:`RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2 <5246>`
27657db96d56Sopenharmony_ci       T. Dierks et. al.
27667db96d56Sopenharmony_ci
27677db96d56Sopenharmony_ci   :rfc:`RFC 6066: Transport Layer Security (TLS) Extensions <6066>`
27687db96d56Sopenharmony_ci       D. Eastlake
27697db96d56Sopenharmony_ci
27707db96d56Sopenharmony_ci   `IANA TLS: Transport Layer Security (TLS) Parameters <https://www.iana.org/assignments/tls-parameters/tls-parameters.xml>`_
27717db96d56Sopenharmony_ci       IANA
27727db96d56Sopenharmony_ci
27737db96d56Sopenharmony_ci   :rfc:`RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) <7525>`
27747db96d56Sopenharmony_ci       IETF
27757db96d56Sopenharmony_ci
27767db96d56Sopenharmony_ci   `Mozilla's Server Side TLS recommendations <https://wiki.mozilla.org/Security/Server_Side_TLS>`_
27777db96d56Sopenharmony_ci       Mozilla
2778