Spec-Zone.ru › Python 3.14

ssl — обёртка TLS/SSL для объектов сокетов

Исходный код: Lib/ssl.py

Этот модуль предоставляет сетевым сокетам на стороне клиента и сервера средства шифрования Transport Layer Security (часто известного как «Secure Sockets Layer») и аутентификации узлов. Модуль использует библиотеку OpenSSL.

Это необязательный модуль. Если его нет в вашей копии CPython, обратитесь к документации вашего дистрибутива (то есть того, кто предоставил вам Python). Если вы являетесь поставщиком дистрибутива, см. раздел Требования для необязательных модулей.

Примечание

Некоторые аспекты поведения могут зависеть от платформы, поскольку выполняются вызовы API сокетов операционной системы. Установленная версия OpenSSL также может приводить к различиям в поведении. Например, TLSv1.3 появился в OpenSSL версии 1.1.1.

Предупреждение

Не используйте этот модуль, не ознакомившись с разделом Рекомендации по безопасности. Иначе у вас может возникнуть ложное чувство безопасности, поскольку настройки ssl по умолчанию не обязательно подходят для вашего приложения.

Доступность: недоступен в WASI.

Этот модуль не работает или недоступен в WebAssembly. Дополнительные сведения см. в разделе Платформы WebAssembly.

В этом разделе описаны объекты и функции модуля ssl; общие сведения о TLS, SSL и сертификатах читатель найдёт в документах из раздела «См. также» в конце страницы.

Этот модуль предоставляет класс ssl.SSLSocket, производный от типа socket.socket, который представляет собой обёртку, подобную сокету, и также шифрует и расшифровывает данные, передаваемые через сокет, с помощью SSL. Он поддерживает дополнительные методы, такие как getpeercert(), который получает сертификат другой стороны соединения, cipher(), который получает шифр, используемый для защищённого соединения, а также get_verified_chain(), get_unverified_chain(), который получает цепочку сертификатов.

Для более сложных приложений класс ssl.SSLContext помогает управлять настройками и сертификатами, которые затем наследуются SSL-сокетами, созданными с помощью метода SSLContext.wrap_socket().

Изменено в версии 3.5.3: Обновлено для поддержки связывания с OpenSSL 1.1.0

Изменено в версии 3.6: OpenSSL 0.9.8, 1.0.0 и 1.0.1 объявлены устаревшими и больше не поддерживаются. В будущем модулю ssl потребуется как минимум OpenSSL 1.0.2 или 1.1.0.

Изменено в версии 3.10: PEP 644 реализован. Для работы модуля ssl требуется OpenSSL 1.1.1 или новее.

Использование устаревших констант и функций приводит к предупреждениям об устаревании.

Функции, константы и исключения

Создание сокетов

Экземпляры SSLSocket должны создаваться с помощью метода SSLContext.wrap_socket(). Вспомогательная функция create_default_context() возвращает новый контекст с безопасными настройками по умолчанию.

Пример клиентского сокета с контекстом по умолчанию и двойным стеком IPv4/IPv6:

import socket
import ssl

hostname = 'www.python.org'
context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())

Пример клиентского сокета с пользовательским контекстом и IPv4:

hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())

Пример серверного сокета, прослушивающего localhost по IPv4:

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    sock.bind(('127.0.0.1', 8443))
    sock.listen(5)
    with context.wrap_socket(sock, server_side=True) as ssock:
        conn, addr = ssock.accept()
        ...

Создание контекста

Вспомогательная функция упрощает создание объектов SSLContext для распространённых задач.

ssl.create_default_context(purpose=Purpose.SERVER_AUTH, *, cafile=None, capath=None, cadata=None)

Возвращает новый объект SSLContext с настройками по умолчанию для указанной цели purpose. Настройки выбираются модулем ssl и обычно обеспечивают более высокий уровень безопасности, чем при непосредственном вызове конструктора SSLContext.

cafile, capath, cadata обозначают необязательные сертификаты CA, которым следует доверять при проверке сертификатов, как и в SSLContext.load_verify_locations(). Если все три значения равны None, эта функция может использовать системные сертификаты CA по умолчанию.

Настройки: PROTOCOL_TLS_CLIENT или PROTOCOL_TLS_SERVER, OP_NO_SSLv2 и OP_NO_SSLv3 с наборами шифров высокого уровня шифрования, без RC4 и без наборов шифров без аутентификации. Передача SERVER_AUTH в качестве purpose устанавливает для verify_mode значение CERT_REQUIRED и либо загружает сертификаты CA (если задан хотя бы один из параметров cafile, capath или cadata), либо использует SSLContext.load_default_certs() для загрузки сертификатов CA по умолчанию.

Если поддерживается keylog_filename и задана переменная среды SSLKEYLOGFILE, create_default_context() включает журналирование ключей.

Настройки этого контекста по умолчанию включают VERIFY_X509_PARTIAL_CHAIN и VERIFY_X509_STRICT. Благодаря этому базовая реализация OpenSSL ведёт себя ближе к соответствующей стандарту реализации RFC 5280, что сопряжено с небольшой несовместимостью со старыми сертификатами X.509.

Примечание

Протокол, параметры, шифр и другие настройки могут в любой момент измениться на более строгие без предварительного объявления об устаревании. Эти значения обеспечивают разумный баланс между совместимостью и безопасностью.

Если вашему приложению нужны определённые настройки, создайте SSLContext и задайте их самостоятельно.

Примечание

Если при попытке некоторых старых клиентов или серверов подключиться к SSLContext, созданному этой функцией, возникает ошибка «Несоответствие протокола или набора шифров», возможно, они поддерживают только SSL3.0, который эта функция отключает с помощью OP_NO_SSLv3. SSL3.0 считается полностью небезопасным. Если вы всё же хотите использовать эту функцию и разрешить подключения по SSL 3.0, их можно снова включить следующим образом:

ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)
ctx.options &= ~ssl.OP_NO_SSLv3

Примечание

По умолчанию этот контекст включает VERIFY_X509_STRICT, что может привести к отклонению сертификатов, созданных до RFC 5280, или некорректных сертификатов, которые базовая реализация OpenSSL приняла бы в противном случае. Отключать этот параметр не рекомендуется, но при необходимости это можно сделать следующим образом:

ctx = ssl.create_default_context()
ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT

Добавлено в версии 3.4.

Изменено в версии 3.4.4: RC4 исключён из строки шифров по умолчанию.

Изменено в версии 3.6: ChaCha20/Poly1305 добавлен в строку шифров по умолчанию.

3DES исключён из строки шифров по умолчанию.

Изменено в версии 3.8: Добавлена поддержка журналирования ключей в SSLKEYLOGFILE.

Изменено в версии 3.10: Теперь контекст использует протокол PROTOCOL_TLS_CLIENT или PROTOCOL_TLS_SERVER вместо универсального PROTOCOL_TLS.

Изменено в версии 3.13: Теперь контекст использует VERIFY_X509_PARTIAL_CHAIN и VERIFY_X509_STRICT в своих флагах проверки по умолчанию.

Исключения

exception ssl.SSLError

Вызывается для сообщения об ошибке базовой реализации SSL (в настоящее время предоставляемой библиотекой OpenSSL). Это означает, что возникла проблема на уровне шифрования и аутентификации более высокого уровня, наложенном поверх базового сетевого соединения. Это исключение является подклассом OSError. Код и сообщение об ошибке экземпляров SSLError предоставляются библиотекой OpenSSL.

Изменено в версии 3.3: Ранее SSLError был подклассом socket.error.

library

Строковое мнемоническое обозначение подмодуля OpenSSL, в котором произошла ошибка, например SSL, PEM или X509. Диапазон возможных значений зависит от версии OpenSSL.

Добавлено в версии 3.3.

reason

Строковое мнемоническое обозначение причины возникновения ошибки, например CERTIFICATE_VERIFY_FAILED. Диапазон возможных значений зависит от версии OpenSSL.

Добавлено в версии 3.3.

exception ssl.SSLZeroReturnError

Подкласс SSLError, вызываемый при попытке чтения или записи, если SSL-соединение было корректно закрыто. Обратите внимание: это не означает, что базовый транспорт (то есть TCP) был закрыт.

Добавлено в версии 3.3.

exception ssl.SSLWantReadError

Подкласс SSLError, вызываемый неблокирующим SSL-сокетом при попытке чтения или записи данных, если для выполнения запроса необходимо получить дополнительные данные через базовый транспорт TCP.

Добавлено в версии 3.3.

exception ssl.SSLWantWriteError

Подкласс SSLError, вызываемый неблокирующим SSL-сокетом при попытке чтения или записи данных, если для выполнения запроса необходимо отправить дополнительные данные через базовый транспорт TCP.

Добавлено в версии 3.3.

exception ssl.SSLSyscallError

Подкласс SSLError, вызываемый при возникновении системной ошибки во время выполнения операции с SSL-сокетом. К сожалению, простого способа получить исходный номер errno нет.

Добавлено в версии 3.3.

exception ssl.SSLEOFError

Подкласс SSLError, вызываемый при внезапном разрыве SSL-соединения. Как правило, при возникновении этой ошибки не следует пытаться повторно использовать базовый транспорт.

Добавлено в версии 3.3.

exception ssl.SSLCertVerificationError

Подкласс SSLError, вызываемый при ошибке проверки сертификата.

Добавлено в версии 3.7.

verify_code

Числовой код ошибки, обозначающий ошибку проверки.

verify_message

Понятное человеку текстовое описание ошибки проверки.

exception ssl.CertificateError

Псевдоним для SSLCertVerificationError.

Изменено в версии 3.7: Теперь это исключение является псевдонимом для SSLCertVerificationError.

Генерация случайных чисел

ssl.RAND_bytes(num, /)

Возвращает num криптографически стойких псевдослучайных байтов. Вызывает SSLError, если генератор псевдослучайных чисел (PRNG) не получил достаточно начальных данных или если текущий метод RAND не поддерживает эту операцию. С помощью RAND_status() можно проверить состояние PRNG, а с помощью RAND_add() — добавить начальные данные для PRNG.

Почти во всех приложениях предпочтительнее использовать os.urandom().

Чтобы узнать требования к криптографически стойкому генератору, прочитайте статью в Википедии «Криптографически стойкий генератор псевдослучайных чисел (CSPRNG)».

Добавлено в версии 3.3.

ssl.RAND_status()

Возвращает True, если генератор псевдослучайных чисел SSL получил «достаточно» случайных данных, и False в противном случае. Чтобы увеличить степень случайности генератора псевдослучайных чисел, можно использовать ssl.RAND_egd() и ssl.RAND_add().

ssl.RAND_add(bytes, entropy, /)

Добавляет указанные bytes в генератор псевдослучайных чисел SSL. Параметр entropy (число с плавающей точкой) задаёт нижнюю границу энтропии, содержащейся в строке (поэтому всегда можно указать 0.0). Дополнительные сведения об источниках энтропии см. в RFC 1750.

Изменено в версии 3.5: Теперь принимается изменяемый объект, подобный bytes.

Работа с сертификатами

ssl.cert_time_to_seconds(cert_time)

Возвращает время в секундах с начала эпохи для строки cert_time, представляющей дату «notBefore» или «notAfter» сертификата в формате strptime "%b %d %H:%M:%S %Y %Z" (локаль C).

Пример:

>>> import ssl
>>> import datetime as dt
>>> timestamp = ssl.cert_time_to_seconds("Jan  5 09:34:43 2018 GMT")
>>> timestamp
1515144883
>>> print(dt.datetime.fromtimestamp(timestamp, dt.UTC))
2018-01-05 09:34:43+00:00

Даты «notBefore» и «notAfter» должны задаваться в GMT (RFC 5280).

Изменено в версии 3.5: Входное время интерпретируется как время в UTC, заданное часовым поясом «GMT» во входной строке. Ранее использовался местный часовой пояс. Возвращается целое число (входной формат не предусматривает долей секунды).

ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])

Получает сертификат SSL-сервера по адресу addr, заданному парой (hostname, port-number), и возвращает его в виде строки в кодировке PEM. Если указан ssl_version, для подключения к серверу используется соответствующая версия протокола SSL. Если указан ca_certs, это должен быть файл со списком корневых сертификатов в том же формате, что и параметр cafile для SSLContext.load_verify_locations(). Будет предпринята попытка проверить сертификат сервера с использованием этого набора корневых сертификатов; при неудаче проверки функция завершится ошибкой. Тайм-аут можно задать параметром timeout.

Изменено в версии 3.3: Теперь эта функция совместима с IPv6.

Изменено в версии 3.5: Значение ssl_version по умолчанию изменено с PROTOCOL_SSLv3 на PROTOCOL_TLS для максимальной совместимости с современными серверами.

Изменено в версии 3.10: Добавлен параметр timeout.

ssl.DER_cert_to_PEM_cert(der_cert_bytes)

Принимает сертификат в виде массива байтов в кодировке DER и возвращает строковое представление того же сертификата в кодировке PEM.

ssl.PEM_cert_to_DER_cert(pem_cert_string)

Принимает сертификат в виде строки ASCII в кодировке PEM и возвращает последовательность байтов того же сертификата в кодировке DER.

ssl.get_default_verify_paths()

Возвращает именованный кортеж с путями к файлу cafile и каталогу capath, используемым OpenSSL по умолчанию. Эти пути совпадают с используемыми в SSLContext.set_default_verify_paths(). Возвращаемое значение — это именованный кортеж DefaultVerifyPaths:

  • cafile — разрешённый путь к cafile или None, если файл не существует,
  • capath — разрешённый путь к capath или None, если каталог не существует,
  • openssl_cafile_env — ключ среды OpenSSL, указывающий на cafile,
  • openssl_cafile — жёстко заданный путь к cafile,
  • openssl_capath_env — ключ среды OpenSSL, указывающий на capath,
  • openssl_capath — жёстко заданный путь к каталогу capath

Добавлено в версии 3.4.

ssl.enum_certificates(store_name)

Извлекает сертификаты из системного хранилища сертификатов Windows. Параметр store_name может принимать одно из значений CA, ROOT или MY. В Windows могут быть и другие хранилища сертификатов.

Функция возвращает список кортежей (cert_bytes, encoding_type, trust). Параметр encoding_type указывает кодировку cert_bytes. Это может быть x509_asn для данных X.509 ASN.1 или pkcs_7_asn для данных PKCS#7 ASN.1. Параметр trust указывает назначение сертификата в виде набора OID либо точно равен True, если сертификат является доверенным для всех назначений.

Пример:

>>> ssl.enum_certificates("CA")
[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),
 (b'data...', 'x509_asn', True)]

Доступность: Windows.

Добавлено в версии 3.4.

ssl.enum_crls(store_name)

Извлекает списки отозванных сертификатов (CRL) из системного хранилища сертификатов Windows. Параметр store_name может принимать одно из значений CA, ROOT или MY. В Windows могут быть и другие хранилища сертификатов.

Функция возвращает список кортежей (cert_bytes, encoding_type, trust). Параметр encoding_type указывает кодировку cert_bytes. Это может быть x509_asn для данных X.509 ASN.1 или pkcs_7_asn для данных PKCS#7 ASN.1.

Доступность: Windows.

Добавлено в версии 3.4.

Константы

Все константы теперь представляют собой коллекции enum.IntEnum или enum.IntFlag.

Добавлено в версии 3.6.

ssl.CERT_NONE

Возможное значение для SSLContext.verify_mode. За исключением PROTOCOL_TLS_CLIENT, это режим по умолчанию. При использовании клиентских сокетов принимается практически любой сертификат. Ошибки проверки, например недоверенный или просроченный сертификат, игнорируются и не прерывают рукопожатие TLS/SSL.

В режиме сервера сертификат у клиента не запрашивается, поэтому клиент не отправляет сертификат для аутентификации клиентского сертификата.

См. обсуждение вопросов безопасности ниже.

ssl.CERT_OPTIONAL

Возможное значение для SSLContext.verify_mode. В клиентском режиме CERT_OPTIONAL имеет то же значение, что и CERT_REQUIRED. Вместо этого для клиентских сокетов рекомендуется использовать CERT_REQUIRED.

В режиме сервера клиенту отправляется запрос сертификата. Клиент может проигнорировать запрос или отправить сертификат для аутентификации клиента TLS. Если клиент решит отправить сертификат, он будет проверен. Любая ошибка проверки немедленно прерывает рукопожатие TLS.

Для использования этой настройки необходимо передать действительный набор сертификатов CA в SSLContext.load_verify_locations().

ssl.CERT_REQUIRED

Возможное значение для SSLContext.verify_mode. В этом режиме для другой стороны сокетного соединения требуется сертификат; если сертификат не предоставлен или его проверка завершается ошибкой, возникает исключение SSLError. Этого режима недостаточно для проверки сертификата в клиентском режиме, поскольку он не сопоставляет имена хостов. Для проверки подлинности сертификата также необходимо включить check_hostname. PROTOCOL_TLS_CLIENT использует CERT_REQUIRED и включает check_hostname по умолчанию.

Для серверного сокета этот режим обеспечивает обязательную аутентификацию клиентского сертификата TLS. Клиенту отправляется запрос сертификата, и он должен предоставить действительный сертификат, которому можно доверять.

Для использования этой настройки необходимо передать действительный набор сертификатов CA в SSLContext.load_verify_locations().

class ssl.VerifyMode

Коллекция констант CERT_* типа enum.IntEnum.

Добавлено в версии 3.6.

ssl.VERIFY_DEFAULT

Возможное значение для SSLContext.verify_flags. В этом режиме списки отзыва сертификатов (CRL) не проверяются. По умолчанию OpenSSL не требует и не проверяет CRL.

Добавлено в версии 3.4.

ssl.VERIFY_CRL_CHECK_LEAF

Возможное значение для SSLContext.verify_flags. В этом режиме проверяется только сертификат узла, но не промежуточные сертификаты CA. Для этого режима требуется действительный CRL, подписанный издателем сертификата узла (его непосредственным предком CA). Если с помощью SSLContext.load_verify_locations не был загружен подходящий CRL, проверка завершится ошибкой.

Добавлено в версии 3.4.

ssl.VERIFY_CRL_CHECK_CHAIN

Возможное значение для SSLContext.verify_flags. В этом режиме проверяются CRL всех сертификатов в цепочке сертификатов узла.

Добавлено в версии 3.4.

ssl.VERIFY_X509_STRICT

Возможное значение для SSLContext.verify_flags, отключающее обходные решения для некорректных сертификатов X.509.

Добавлено в версии 3.4.

ssl.VERIFY_ALLOW_PROXY_CERTS

Возможное значение для SSLContext.verify_flags, включающее проверку сертификатов прокси.

Добавлено в версии 3.10.

ssl.VERIFY_X509_TRUSTED_FIRST

Возможное значение для SSLContext.verify_flags. Указывает OpenSSL отдавать предпочтение доверенным сертификатам при построении цепочки доверия для проверки сертификата. Этот флаг включён по умолчанию.

Добавлено в версии 3.4.4.

ssl.VERIFY_X509_PARTIAL_CHAIN

Возможное значение для SSLContext.verify_flags. Указывает OpenSSL считать промежуточные CA в хранилище доверенных сертификатов точками доверия, как и самоподписанные корневые сертификаты CA. Это позволяет доверять сертификатам, выданным промежуточным CA, не доверяя его корневому CA-предку.

Добавлено в версии 3.10.

class ssl.VerifyFlags

Коллекция констант VERIFY_* типа enum.IntFlag.

Добавлено в версии 3.6.

ssl.PROTOCOL_TLS

Выбирает наивысшую версию протокола, поддерживаемую и клиентом, и сервером. Несмотря на название, этот параметр может выбрать протоколы как «SSL», так и «TLS».

Добавлено в версии 3.6.

Устарело начиная с версии 3.10: Клиентам и серверам TLS требуются разные настройки по умолчанию для безопасной связи. Универсальная константа протокола TLS объявлена устаревшей; вместо неё следует использовать PROTOCOL_TLS_CLIENT и PROTOCOL_TLS_SERVER.

ssl.PROTOCOL_TLS_CLIENT

Автоматически согласует наивысшую версию протокола, поддерживаемую и клиентом, и сервером, и настраивает контекст для клиентских соединений. Этот протокол по умолчанию включает CERT_REQUIRED и check_hostname.

Добавлено в версии 3.6.

ssl.PROTOCOL_TLS_SERVER

Автоматически согласует наивысшую версию протокола, поддерживаемую и клиентом, и сервером, и настраивает контекст для серверных соединений.

Добавлено в версии 3.6.

ssl.PROTOCOL_SSLv23

Псевдоним для PROTOCOL_TLS.

Устарело начиная с версии 3.6: Вместо этого используйте PROTOCOL_TLS.

ssl.PROTOCOL_SSLv3

Выбирает SSL версии 3 в качестве протокола шифрования канала.

Этот протокол недоступен, если OpenSSL скомпилирован с параметром no-ssl3.

Предупреждение

SSL версии 3 небезопасен. Настоятельно не рекомендуется его использовать.

Устарело начиная с версии 3.6: OpenSSL объявил устаревшими все протоколы для отдельных версий. Вместо этого используйте протокол по умолчанию PROTOCOL_TLS_SERVER или PROTOCOL_TLS_CLIENT вместе с SSLContext.minimum_version и SSLContext.maximum_version.

ssl.PROTOCOL_TLSv1

Выбирает TLS версии 1.0 в качестве протокола шифрования канала.

Устарело начиная с версии 3.6: OpenSSL объявил устаревшими все протоколы для отдельных версий.

ssl.PROTOCOL_TLSv1_1

Выбирает TLS версии 1.1 в качестве протокола шифрования канала. Доступен только в OpenSSL версии 1.0.1 и новее.

Добавлено в версии 3.4.

Устарело начиная с версии 3.6: OpenSSL объявил устаревшими все протоколы для отдельных версий.

ssl.PROTOCOL_TLSv1_2

Выбирает TLS версии 1.2 в качестве протокола шифрования канала. Доступен только в OpenSSL версии 1.0.1 и новее.

Добавлено в версии 3.4.

Устарело начиная с версии 3.6: OpenSSL объявил устаревшими все протоколы для отдельных версий.

ssl.OP_ALL

Включает обходные решения для различных ошибок в других реализациях SSL. Этот параметр включён по умолчанию. Он не обязательно устанавливает те же флаги, что и константа SSL_OP_ALL в OpenSSL.

Добавлено в версии 3.2.

ssl.OP_NO_SSLv2

Запрещает соединение SSLv2. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать SSLv2 в качестве версии протокола.

Добавлено в версии 3.2.

Устарело начиная с версии 3.6: SSLv2 устарел

ssl.OP_NO_SSLv3

Запрещает соединение SSLv3. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать SSLv3 в качестве версии протокола.

Добавлено в версии 3.2.

Устарело начиная с версии 3.6: SSLv3 устарел

ssl.OP_NO_TLSv1

Запрещает соединение TLSv1. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать TLSv1 в качестве версии протокола.

Добавлено в версии 3.2.

Устарело начиная с версии 3.7: Параметр объявлен устаревшим начиная с OpenSSL 1.1.0; вместо него используйте новые SSLContext.minimum_version и SSLContext.maximum_version.

ssl.OP_NO_TLSv1_1

Запрещает соединение TLSv1.1. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать TLSv1.1 в качестве версии протокола. Доступен только в OpenSSL версии 1.0.1 и новее.

Добавлено в версии 3.4.

Устарело начиная с версии 3.7: Параметр объявлен устаревшим начиная с OpenSSL 1.1.0.

ssl.OP_NO_TLSv1_2

Запрещает соединение TLSv1.2. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать TLSv1.2 в качестве версии протокола. Доступен только в OpenSSL версии 1.0.1 и новее.

Добавлено в версии 3.4.

Устарело начиная с версии 3.7: Параметр объявлен устаревшим начиная с OpenSSL 1.1.0.

ssl.OP_NO_TLSv1_3

Запрещает соединение TLSv1.3. Этот параметр применим только вместе с PROTOCOL_TLS. Он запрещает сторонам выбирать TLSv1.3 в качестве версии протокола. TLS 1.3 доступен в OpenSSL 1.1.1 и новее. Если Python скомпилирован с более старой версией OpenSSL, по умолчанию флаг имеет значение 0.

Добавлено в версии 3.6.3.

Устарело начиная с версии 3.7: Параметр объявлен устаревшим начиная с OpenSSL 1.1.0. Он был добавлен в версии 2.7.15 и 3.6.3 для обратной совместимости с OpenSSL 1.0.2.

ssl.OP_NO_RENEGOTIATION

Отключает повторное согласование для TLSv1.2 и более ранних версий. Не отправляет сообщения HelloRequest и игнорирует запросы на повторное согласование через ClientHello.

Этот параметр доступен только в OpenSSL 1.1.0h и новее.

Добавлено в версии 3.7.

ssl.OP_CIPHER_SERVER_PREFERENCE

Использует предпочтительный порядок шифров сервера, а не клиента. Этот параметр не влияет на клиентские сокеты и серверные сокеты SSLv2.

Добавлено в версии 3.3.

ssl.OP_SINGLE_DH_USE

Запрещает повторно использовать один и тот же ключ DH в разных сеансах SSL. Это повышает прямую секретность, но требует больше вычислительных ресурсов. Этот параметр применяется только к серверным сокетам.

Добавлено в версии 3.3.

ssl.OP_SINGLE_ECDH_USE

Запрещает повторно использовать один и тот же ключ ECDH в разных сеансах SSL. Это повышает прямую секретность, но требует больше вычислительных ресурсов. Этот параметр применяется только к серверным сокетам.

Добавлено в версии 3.3.

ssl.OP_ENABLE_MIDDLEBOX_COMPAT

Отправляет фиктивные сообщения Change Cipher Spec (CCS) во время рукопожатия TLS 1.3, чтобы соединение TLS 1.3 выглядело больше похожим на соединение TLS 1.2.

Этот параметр доступен только в OpenSSL 1.1.1 и новее.

Добавлено в версии 3.8.

ssl.OP_NO_COMPRESSION

Отключает сжатие в канале SSL. Это полезно, если протокол приложения поддерживает собственную схему сжатия.

Добавлено в версии 3.3.

class ssl.Options

Коллекция констант OP_* типа enum.IntFlag.

ssl.OP_NO_TICKET

Запрещает клиентской стороне запрашивать билет сеанса.

Добавлено в версии 3.6.

ssl.OP_IGNORE_UNEXPECTED_EOF

Игнорирует неожиданное завершение соединений TLS.

Этот параметр доступен только в OpenSSL 3.0.0 и новее.

Добавлено в версии 3.10.

ssl.OP_ENABLE_KTLS

Включает использование TLS ядра. Для использования этой возможности OpenSSL должен быть скомпилирован с её поддержкой, а согласованные наборы шифров и расширения должны поддерживаться ядром (список поддерживаемых элементов может различаться в зависимости от платформы и версии ядра).

Обратите внимание, что при включённом TLS ядра некоторые криптографические операции выполняются непосредственно ядром, а не через доступные провайдеры OpenSSL. Это может быть нежелательно, если, например, приложению необходимо, чтобы все криптографические операции выполнял провайдер FIPS.

Этот параметр доступен только в OpenSSL 3.0.0 и новее.

Добавлено в версии 3.12.

ssl.OP_LEGACY_SERVER_CONNECT

Разрешает небезопасное повторное согласование только между OpenSSL и серверами без установленных исправлений.

Добавлено в версии 3.12.

ssl.HAS_ALPN

Показывает, встроена ли в библиотеку OpenSSL поддержка расширения TLS согласования протокола прикладного уровня, описанного в RFC 7301.

Добавлено в версии 3.5.

ssl.HAS_NEVER_CHECK_COMMON_NAME

Показывает, встроена ли в библиотеку OpenSSL поддержка отключения проверки общего имени субъекта и доступен ли для записи атрибут SSLContext.hostname_checks_common_name.

Добавлено в версии 3.7.

ssl.HAS_ECDH

Показывает, встроена ли в библиотеку OpenSSL поддержка обмена ключами Диффи — Хеллмана на эллиптических кривых. Это значение должно быть истинным, если только дистрибьютор явно не отключил эту возможность.

Добавлено в версии 3.3.

ssl.HAS_SNI

Показывает, встроена ли в библиотеку OpenSSL поддержка расширения индикации имени сервера (определённого в RFC 6066).

Добавлено в версии 3.2.

ssl.HAS_NPN

Показывает, встроена ли в библиотеку OpenSSL поддержка согласования следующего протокола, описанного в спецификации согласования протокола прикладного уровня. Если значение истинно, можно использовать метод SSLContext.set_npn_protocols(), чтобы сообщить, какие протоколы вы хотите поддерживать.

Добавлено в версии 3.3.

ssl.HAS_SSLv2

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола SSL 2.0.

Добавлено в версии 3.7.

ssl.HAS_SSLv3

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола SSL 3.0.

Добавлено в версии 3.7.

ssl.HAS_TLSv1

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола TLS 1.0.

Добавлено в версии 3.7.

ssl.HAS_TLSv1_1

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола TLS 1.1.

Добавлено в версии 3.7.

ssl.HAS_TLSv1_2

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола TLS 1.2.

Добавлено в версии 3.7.

ssl.HAS_TLSv1_3

Показывает, встроена ли в библиотеку OpenSSL поддержка протокола TLS 1.3.

Добавлено в версии 3.7.

ssl.HAS_PSK

Показывает, встроена ли в библиотеку OpenSSL поддержка TLS-PSK.

Добавлено в версии 3.13.

ssl.HAS_PHA

Показывает, встроена ли в библиотеку OpenSSL поддержка TLS-PHA.

Добавлено в версии 3.14.

ssl.CHANNEL_BINDING_TYPES

Список поддерживаемых типов привязки TLS-канала. Строки из этого списка можно использовать в качестве аргументов для SSLSocket.get_channel_binding().

Добавлено в версии 3.3.

ssl.OPENSSL_VERSION

Строка с версией библиотеки OpenSSL, загруженной интерпретатором:

>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.2k  26 Jan 2017'

Добавлено в версии 3.2.

ssl.OPENSSL_VERSION_INFO

Кортеж из пяти целых чисел, содержащий сведения о версии библиотеки OpenSSL:

>>> ssl.OPENSSL_VERSION_INFO
(1, 0, 2, 11, 15)

Добавлено в версии 3.2.

ssl.OPENSSL_VERSION_NUMBER

Исходный номер версии библиотеки OpenSSL в виде одного целого числа:

>>> ssl.OPENSSL_VERSION_NUMBER
268443839
>>> hex(ssl.OPENSSL_VERSION_NUMBER)
'0x100020bf'

Добавлено в версии 3.2.

ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE
ssl.ALERT_DESCRIPTION_INTERNAL_ERROR
ALERT_DESCRIPTION_*

Описания предупреждений из RFC 5246 и других источников. Реестр предупреждений TLS IANA содержит этот список и ссылки на RFC, в которых определено их значение.

Используется как возвращаемое значение функции обратного вызова в SSLContext.set_servername_callback().

Добавлено в версии 3.4.

class ssl.AlertDescription

Коллекция констант ALERT_DESCRIPTION_* типа enum.IntEnum.

Добавлено в версии 3.6.

Purpose.SERVER_AUTH

Параметр для create_default_context() и SSLContext.load_default_certs(). Это значение указывает, что контекст может использоваться для аутентификации веб-серверов (следовательно, он будет использоваться для создания клиентских сокетов).

Добавлено в версии 3.4.

Purpose.CLIENT_AUTH

Параметр для create_default_context() и SSLContext.load_default_certs(). Это значение указывает, что контекст может использоваться для аутентификации веб-клиентов (следовательно, он будет использоваться для создания серверных сокетов).

Добавлено в версии 3.4.

class ssl.SSLErrorNumber

Коллекция констант enum.IntEnum SSL_ERROR_*.

Добавлено в версии 3.6.

class ssl.TLSVersion

Коллекция enum.IntEnum версий SSL и TLS для SSLContext.maximum_version и SSLContext.minimum_version.

Добавлено в версии 3.7.

TLSVersion.MINIMUM_SUPPORTED
TLSVersion.MAXIMUM_SUPPORTED

Минимальная или максимальная поддерживаемая версия SSL или TLS. Это специальные константы. Их значения не отражают самые низкую и высокую доступные версии TLS/SSL.

TLSVersion.SSLv3
TLSVersion.TLSv1
TLSVersion.TLSv1_1
TLSVersion.TLSv1_2
TLSVersion.TLSv1_3

От SSL 3.0 до TLS 1.3.

Устарело с версии 3.10: Все элементы TLSVersion, кроме TLSVersion.TLSv1_2 и TLSVersion.TLSv1_3, устарели.

Сокеты SSL

class ssl.SSLSocket(socket.socket)

Сокеты SSL предоставляют следующие методы объектов сокетов:

  • accept()
  • bind()
  • close()
  • connect()
  • detach()
  • fileno()
  • getpeername(), getsockname()
  • getsockopt(), setsockopt()
  • gettimeout(), settimeout(), setblocking()
  • listen()
  • makefile()
  • recv(), recv_into() (однако передавать ненулевой аргумент flags нельзя)
  • send(), sendall() (с тем же ограничением)
  • sendfile() (но os.sendfile будет использоваться только для незашифрованных сокетов, в противном случае будет использоваться send())
  • shutdown()

Однако, поскольку протокол SSL (и TLS) использует собственное кадрирование поверх TCP, абстракция сокетов SSL в некоторых отношениях может отличаться от спецификации обычных сокетов на уровне ОС. См. в частности примечания о неблокирующих сокетах.

Экземпляры SSLSocket необходимо создавать с помощью метода SSLContext.wrap_socket().

Изменено в версии 3.5: Добавлен метод sendfile().

Изменено в версии 3.5: Метод shutdown() больше не сбрасывает тайм-аут сокета при каждом получении или отправке байтов. Теперь тайм-аут сокета задаёт максимальную общую продолжительность завершения работы.

Устарело с версии 3.6: Создание экземпляра SSLSocket напрямую считается устаревшим; используйте SSLContext.wrap_socket() для обёртывания сокета.

Изменено в версии 3.7: Экземпляры SSLSocket необходимо создавать с помощью wrap_socket(). В более ранних версиях экземпляры можно было создавать напрямую. Эта возможность никогда не документировалась и официально не поддерживалась.

Изменено в версии 3.10: Теперь Python использует внутри SSL_read_ex и SSL_write_ex. Эти функции поддерживают чтение и запись данных размером более 2 ГБ. Запись данных нулевой длины больше не завершается ошибкой нарушения протокола.

Сокеты SSL также имеют следующие дополнительные методы и атрибуты:

SSLSocket.read(len=1024, buffer=None)

Читает из сокета SSL до len байт данных и возвращает результат в виде экземпляра bytes. Если указан buffer, данные читаются в буфер, а метод возвращает количество прочитанных байтов.

Вызывает SSLWantReadError или SSLWantWriteError, если сокет неблокирующий и чтение приведёт к блокировке.

Поскольку в любой момент возможно повторное согласование, вызов read() также может вызвать операции записи.

Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждом получении или отправке байтов. Теперь тайм-аут сокета задаёт максимальную общую продолжительность чтения до len байт.

Устарело с версии 3.6: Используйте recv() вместо read().

SSLSocket.write(data)

Записывает data в сокет SSL и возвращает количество записанных байтов. Аргумент data должен быть объектом, поддерживающим буферный интерфейс.

Вызывает SSLWantReadError или SSLWantWriteError, если сокет неблокирующий и запись приведёт к блокировке.

Поскольку в любой момент возможно повторное согласование, вызов write() также может вызвать операции чтения.

Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждом получении или отправке байтов. Теперь тайм-аут сокета задаёт максимальную общую продолжительность записи data.

Устарело с версии 3.6: Используйте send() вместо write().

Примечание

Методы read() и write() — это низкоуровневые методы, которые читают и записывают незашифрованные данные уровня приложения, а также расшифровывают и шифруют их для передачи по сети. Для работы этих методов требуется активное SSL-соединение, то есть рукопожатие должно быть завершено, а SSLSocket.unwrap() не должен быть вызван.

Обычно вместо этих методов следует использовать методы API сокетов, например recv() и send().

SSLSocket.do_handshake(block=False)

Выполняет рукопожатие для настройки SSL.

Если block имеет значение true, а тайм-аут, полученный с помощью gettimeout(), равен нулю, сокет переводится в блокирующий режим до завершения рукопожатия.

Изменено в версии 3.4: Метод рукопожатия также выполняет match_hostname(), если атрибут check_hostname объекта context сокета имеет значение true.

Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждом получении или отправке байтов. Теперь тайм-аут сокета задаёт максимальную общую продолжительность рукопожатия.

Изменено в версии 3.7: Во время рукопожатия OpenSSL сопоставляет имя хоста или IP-адрес. Функция match_hostname() больше не используется. Если OpenSSL отклоняет имя хоста или IP-адрес, рукопожатие немедленно прерывается, а узлу-партнёру отправляется сообщение TLS alert.

SSLSocket.getpeercert(binary_form=False)

Если у другой стороны соединения нет сертификата, возвращает None. Если рукопожатие SSL ещё не выполнено, вызывает ValueError.

Если параметр binary_form имеет значение False и от узла-партнёра получен сертификат, этот метод возвращает экземпляр dict. Если сертификат не прошёл проверку, словарь пуст. Если сертификат прошёл проверку, метод возвращает словарь с несколькими ключами, в том числе subject (субъект, для которого выдан сертификат) и issuer (субъект, выдавший сертификат). Если сертификат содержит расширение Subject Alternative Name (см. RFC 3280), в словаре также будет ключ subjectAltName.

Поля subject и issuer представляют собой кортежи, содержащие последовательность относительных отличительных имён (RDN), заданных в структуре данных сертификата для соответствующих полей; каждая RDN — это последовательность пар «имя — значение». Вот пример из реальной практики:

{'issuer': ((('countryName', 'IL'),),
            (('organizationName', 'StartCom Ltd.'),),
            (('organizationalUnitName',
              'Secure Digital Certificate Signing'),),
            (('commonName',
              'StartCom Class 2 Primary Intermediate Server CA'),)),
 'notAfter': 'Nov 22 08:15:19 2013 GMT',
 'notBefore': 'Nov 21 03:09:52 2011 GMT',
 'serialNumber': '95F0',
 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'California'),),
             (('localityName', 'San Francisco'),),
             (('organizationName', 'Electronic Frontier Foundation, Inc.'),),
             (('commonName', '*.eff.org'),),
             (('emailAddress', 'hostmaster@eff.org'),)),
 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
 'version': 3}

Если параметр binary_form имеет значение True и сертификат был предоставлен, этот метод возвращает DER-кодированное представление всего сертификата в виде последовательности байтов или None, если узел-партнёр не предоставил сертификат. Предоставление сертификата узлом-партнёром зависит от роли сокета SSL:

  • клиентский SSL-сокет: сервер всегда предоставляет сертификат независимо от того, требовалась ли проверка;
  • серверный SSL-сокет: клиент предоставляет сертификат только по запросу сервера; поэтому getpeercert() вернёт None, если вы использовали CERT_NONE (а не CERT_OPTIONAL или CERT_REQUIRED).

См. также SSLContext.check_hostname.

Изменено в версии 3.2: Возвращаемый словарь содержит дополнительные элементы, например issuer и notBefore.

Изменено в версии 3.4: Если рукопожатие не выполнено, вызывается ValueError. Возвращаемый словарь содержит дополнительные элементы расширений X509v3, например crlDistributionPoints, caIssuers и URI OCSP.

Изменено в версии 3.9: В строках с IPv6-адресами больше нет завершающего символа новой строки.

SSLSocket.get_verified_chain()

Возвращает проверенную цепочку сертификатов, предоставленную другой стороной SSL-канала, в виде списка DER-кодированных байтов. Если проверка сертификатов отключена, метод работает так же, как get_unverified_chain().

Добавлено в версии 3.13.

SSLSocket.get_unverified_chain()

Возвращает исходную цепочку сертификатов, предоставленную другой стороной SSL-канала, в виде списка DER-кодированных байтов.

Добавлено в версии 3.13.

SSLSocket.cipher()

Возвращает кортеж из трёх значений: имя используемого шифра, версию протокола SSL, определяющую его использование, и количество используемых секретных битов. Если соединение не установлено, возвращает None.

SSLSocket.shared_ciphers()

Возвращает список шифров, доступных и клиенту, и серверу. Каждый элемент возвращаемого списка — это кортеж из трёх значений: имя шифра, версия протокола SSL, определяющая его использование, и количество секретных битов, используемых шифром. shared_ciphers() возвращает None, если соединение не установлено или сокет является клиентским.

Добавлено в версии 3.5.

SSLSocket.compression()

Возвращает строку с используемым алгоритмом сжатия или None, если соединение не сжато.

Если протокол более высокого уровня поддерживает собственный механизм сжатия, для отключения сжатия на уровне SSL можно использовать OP_NO_COMPRESSION.

Добавлено в версии 3.3.

SSLSocket.get_channel_binding(cb_type='tls-unique')

Возвращает данные привязки к каналу для текущего соединения в виде объекта bytes. Возвращает None, если соединение не установлено или рукопожатие не завершено.

Параметр cb_type позволяет выбрать требуемый тип привязки к каналу. Допустимые типы привязки к каналу перечислены в списке CHANNEL_BINDING_TYPES. В настоящее время поддерживается только привязка к каналу ‘tls-unique’, определённая в RFC 5929. Если запрошен неподдерживаемый тип привязки к каналу, вызывается ValueError.

Добавлено в версии 3.3.

SSLSocket.selected_alpn_protocol()

Возвращает протокол, выбранный во время рукопожатия TLS. Возвращается None, если SSLContext.set_alpn_protocols() не был вызван, если другая сторона не поддерживает ALPN, если этот сокет не поддерживает ни один из предложенных клиентом протоколов или если рукопожатие ещё не состоялось.

Добавлено в версии 3.5.

SSLSocket.selected_npn_protocol()

Возвращает протокол более высокого уровня, выбранный во время рукопожатия TLS/SSL. Возвращает None, если SSLContext.set_npn_protocols() не был вызван, если другая сторона не поддерживает NPN или если рукопожатие ещё не состоялось.

Добавлено в версии 3.3.

Устарело с версии 3.10: ALPN пришёл на смену NPN.

SSLSocket.unwrap()

Выполняет завершающее рукопожатие SSL, удаляющее уровень TLS из базового сокета, и возвращает объект базового сокета. Это можно использовать для перехода от зашифрованного обмена данными по соединению к незашифрованному. Для дальнейшего обмена данными с другой стороной соединения всегда следует использовать возвращённый сокет, а не исходный.

SSLSocket.verify_client_post_handshake()

Запрашивает у клиента TLS 1.3 аутентификацию после рукопожатия (PHA). PHA можно инициировать только для соединения TLS 1.3 с серверного сокета, после начального рукопожатия TLS и при включённой PHA на обеих сторонах; см. SSLContext.post_handshake_auth.

Метод не выполняет обмен сертификатами немедленно. Серверная сторона отправляет CertificateRequest при следующем событии записи и ожидает, что клиент ответит сертификатом при следующем событии чтения.

Если какое-либо предварительное условие не выполнено (например, используется не TLS 1.3 или PHA не включена), вызывается SSLError.

Примечание

Доступно только при использовании OpenSSL 1.1.1 и включённой поддержке TLS 1.3. Без поддержки TLS 1.3 метод вызывает NotImplementedError.

Добавлено в версии 3.8.

SSLSocket.version()

Возвращает строку с фактической версией протокола SSL, согласованной для соединения, или None, если защищённое соединение не установлено. На момент написания возможны следующие возвращаемые значения: "SSLv2", "SSLv3", "TLSv1", "TLSv1.1" и "TLSv1.2". В более новых версиях OpenSSL могут быть определены и другие возвращаемые значения.

Добавлено в версии 3.5.

SSLSocket.pending()

Возвращает количество уже расшифрованных байтов, доступных для чтения и ожидающих в соединении.

SSLSocket.context

Объект SSLContext, с которым связан этот SSL-сокет.

Добавлено в версии 3.2.

SSLSocket.server_side

Логическое значение: True для серверных сокетов и False для клиентских сокетов.

Добавлено в версии 3.2.

SSLSocket.server_hostname

Имя хоста сервера: тип str или None для серверного сокета либо если имя хоста не было указано в конструкторе.

Добавлено в версии 3.2.

Изменено в версии 3.7: Теперь атрибут всегда содержит текст ASCII. Если server_hostname — это интернационализированное доменное имя (IDN), теперь в атрибуте хранится форма A-label ("xn--pythn-mua.org"), а не форма U-label ("pythön.org").

SSLSocket.session

SSLSession для этого SSL-соединения. Сеанс доступен для клиентских и серверных сокетов после выполнения рукопожатия TLS. Для клиентских сокетов сеанс можно установить до вызова do_handshake(), чтобы повторно использовать сеанс.

Добавлено в версии 3.6.

SSLSocket.session_reused

Добавлено в версии 3.6.

Контексты SSL

Добавлено в версии 3.2.

Контекст SSL содержит различные данные, срок жизни которых превышает срок жизни отдельных SSL-соединений, например параметры конфигурации SSL, сертификаты и закрытые ключи. Он также управляет кэшем SSL-сеансов для сокетов на стороне сервера, чтобы ускорить повторные подключения от одних и тех же клиентов.

class ssl.SSLContext(protocol=None)

Создаёт новый контекст SSL. Можно передать параметр protocol, который должен быть одной из констант PROTOCOL_*, определённых в этом модуле. Этот параметр указывает, какую версию протокола SSL использовать. Обычно сервер выбирает определённую версию протокола, а клиент должен подстроиться под выбор сервера. Большинство версий несовместимы друг с другом. Если параметр не указан, по умолчанию используется PROTOCOL_TLS; он обеспечивает наибольшую совместимость с другими версиями.

В таблице показано, какие версии на стороне клиента (по вертикали) могут подключаться к каким версиям на стороне сервера (по горизонтали):

клиент / сервер

SSLv2

SSLv3

TLS [3]

TLSv1

TLSv1.1

TLSv1.2

SSLv2

да

нет

нет [1]

нет

нет

нет

SSLv3

нет

да

нет [2]

нет

нет

нет

TLS (SSLv23) [3]

нет [1]

нет [2]

да

да

да

да

TLSv1

нет

нет

да

да

нет

нет

TLSv1.1

нет

нет

да

нет

да

нет

TLSv1.2

нет

нет

да

нет

нет

да

Сноски

[1] (1,2)

SSLContext по умолчанию отключает SSLv2 с помощью OP_NO_SSLv2.

[2] (1,2)

SSLContext по умолчанию отключает SSLv3 с помощью OP_NO_SSLv3.

[3] (1,2)

Протокол TLS 1.3 будет доступен с PROTOCOL_TLS в OpenSSL версии >= 1.1.1. Отдельной константы PROTOCOL только для TLS 1.3 нет.

См. также

create_default_context() позволяет модулю ssl выбирать параметры безопасности для заданной цели.

Изменено в версии 3.6: Контекст создаётся с безопасными значениями по умолчанию. По умолчанию устанавливаются параметры OP_NO_COMPRESSION, OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE, OP_NO_SSLv2 и OP_NO_SSLv3 (кроме PROTOCOL_SSLv3). Изначальный список наборов шифров содержит только шифры HIGH, не содержит шифров NULL и MD5.

Устарело с версии 3.10: Использование SSLContext без аргумента protocol устарело. В будущем класс контекста будет требовать протокол PROTOCOL_TLS_CLIENT или PROTOCOL_TLS_SERVER.

Изменено в версии 3.10: Теперь наборы шифров по умолчанию включают только безопасные шифры AES и ChaCha20 с прямой секретностью и уровнем безопасности 2. Ключи RSA и DH длиной менее 2048 бит, а также ключи ECC длиной менее 224 бит запрещены. В PROTOCOL_TLS, PROTOCOL_TLS_CLIENT и PROTOCOL_TLS_SERVER минимальной версией TLS является TLS 1.2.

Примечание

После начала использования в соединении SSLContext допускает лишь ограниченное изменение. Добавлять новые сертификаты во внутреннее хранилище доверия можно, однако изменение шифров, параметров проверки или сертификатов mTLS может привести к неожиданному поведению.

Примечание

SSLContext предназначен для совместного использования несколькими соединениями. Поэтому он потокобезопасен, если после использования в соединении его не перенастраивать.

Объекты SSLContext имеют следующие методы и атрибуты:

SSLContext.cert_store_stats()

Возвращает статистику в виде словаря: количество загруженных сертификатов X.509, число сертификатов X.509, помеченных как сертификаты CA, и количество списков отзыва сертификатов.

Пример для контекста с одним сертификатом CA и ещё одним сертификатом:

>>> context.cert_store_stats()
{'crl': 0, 'x509_ca': 1, 'x509': 2}

Добавлено в версии 3.4.

SSLContext.load_cert_chain(certfile, keyfile=None, password=None)

Загружает закрытый ключ и соответствующий ему сертификат. Строка certfile должна содержать путь к одному файлу в формате PEM, содержащему сертификат, а также любое количество сертификатов CA, необходимых для подтверждения подлинности сертификата. Если указана строка keyfile, она должна указывать на файл с закрытым ключом. В противном случае закрытый ключ также будет взят из certfile. Дополнительные сведения о хранении сертификата в файле certfile см. в разделе Сертификаты.

Аргумент password может быть функцией, вызываемой для получения пароля расшифровки закрытого ключа. Она будет вызвана только в том случае, если закрытый ключ зашифрован и требуется пароль. Функция вызывается без аргументов и должна возвращать строку, bytes или bytearray. Если возвращается строка, перед использованием для расшифровки ключа она будет закодирована в UTF-8. Вместо этого в качестве аргумента password можно напрямую передать строку, bytes или bytearray. Если закрытый ключ не зашифрован и пароль не требуется, аргумент будет проигнорирован.

Если аргумент password не указан, а пароль требуется, для интерактивного запроса пароля будет использоваться встроенный механизм запроса пароля OpenSSL.

Если закрытый ключ не соответствует сертификату, возникает исключение SSLError.

Изменено в версии 3.3: Добавлен новый необязательный аргумент password.

SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)

Загружает набор сертификатов удостоверяющих центров (CA) по умолчанию из стандартных расположений. В Windows сертификаты CA загружаются из системных хранилищ CA и ROOT. Во всех системах вызывается SSLContext.set_default_verify_paths(). В будущем метод также может загружать сертификаты CA из других расположений.

Флаг purpose определяет, какие сертификаты CA загружаются. Параметр по умолчанию Purpose.SERVER_AUTH загружает сертификаты, помеченные как доверенные для аутентификации веб-сервера TLS (сокеты на стороне клиента). Purpose.CLIENT_AUTH загружает сертификаты CA для проверки сертификатов клиента на стороне сервера.

Добавлено в версии 3.4.

SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None)

Загружает набор сертификатов удостоверяющих центров (CA), используемых для проверки сертификатов других узлов, если значение verify_mode отличается от CERT_NONE. Необходимо указать хотя бы один из параметров cafile или capath.

Этот метод также может загружать списки отзыва сертификатов (CRL) в формате PEM или DER. Чтобы использовать CRL, необходимо правильно настроить SSLContext.verify_flags.

Если указана строка cafile, она должна содержать путь к файлу с объединёнными сертификатами CA в формате PEM. Дополнительные сведения о размещении сертификатов в этом файле см. в разделе Сертификаты.

Если указана строка capath, она должна содержать путь к каталогу с несколькими сертификатами CA в формате PEM, организованными в соответствии с специфической структурой OpenSSL.

Если указан объект cadata, он должен быть либо строкой ASCII с одним или несколькими сертификатами в формате PEM, либо объектом, подобным bytes, содержащим сертификаты в формате DER. Как и в случае с capath, лишние строки вокруг сертификатов в формате PEM игнорируются, но должен присутствовать хотя бы один сертификат.

Изменено в версии 3.4: Добавлен новый необязательный аргумент cadata.

SSLContext.get_ca_certs(binary_form=False)

Возвращает список загруженных сертификатов удостоверяющих центров (CA). Если параметр binary_form имеет значение False, каждая запись списка представляет собой словарь, аналогичный результату вызова SSLSocket.getpeercert(). В противном случае метод возвращает список сертификатов в формате DER. В возвращаемый список не входят сертификаты из capath, если только сертификат не был запрошен и загружен SSL-соединением.

Примечание

Сертификаты в каталоге capath не загружаются, пока не будут использованы хотя бы один раз.

Добавлено в версии 3.4.

SSLContext.get_ciphers()

Возвращает список включённых шифров. Список упорядочен по приоритету шифров. См. SSLContext.set_ciphers().

Пример:

>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
>>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')
>>> ctx.get_ciphers()
[{'aead': True,
  'alg_bits': 256,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(256) Mac=AEAD',
  'digest': None,
  'id': 50380848,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES256-GCM-SHA384',
  'protocol': 'TLSv1.2',
  'strength_bits': 256,
  'symmetric': 'aes-256-gcm'},
 {'aead': True,
  'alg_bits': 128,
  'auth': 'auth-rsa',
  'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  '
                 'Enc=AESGCM(128) Mac=AEAD',
  'digest': None,
  'id': 50380847,
  'kea': 'kx-ecdhe',
  'name': 'ECDHE-RSA-AES128-GCM-SHA256',
  'protocol': 'TLSv1.2',
  'strength_bits': 128,
  'symmetric': 'aes-128-gcm'}]

Добавлено в версии 3.6.

SSLContext.set_default_verify_paths()

Загружает набор сертификатов удостоверяющих центров (CA) по умолчанию из пути файловой системы, заданного при сборке библиотеки OpenSSL. К сожалению, определить, успешно ли отработал этот метод, непросто: если сертификаты не найдены, ошибка не возвращается. Однако если библиотека OpenSSL поставляется в составе операционной системы, вероятно, она настроена правильно.

SSLContext.set_ciphers(ciphers, /)

Задаёт доступные шифры для сокетов, созданных с этим контекстом. Параметр должен быть строкой в формате списка шифров OpenSSL. Если не удастся выбрать ни одного шифра (поскольку параметры сборки или другая конфигурация запрещают использование всех указанных шифров), возникнет исключение SSLError.

Примечание

После установления соединения метод SSLSocket.cipher() SSL-сокета возвращает выбранный в данный момент шифр.

Наборы шифров TLS 1.3 нельзя отключить с помощью set_ciphers().

SSLContext.set_alpn_protocols(alpn_protocols)

Указывает протоколы, которые сокет должен объявить во время согласования SSL/TLS. Параметр должен быть списком строк ASCII, например ['http/1.1', 'spdy/2'], упорядоченных по предпочтительности. Выбор протокола происходит во время согласования в соответствии с RFC 7301. После успешного согласования метод SSLSocket.selected_alpn_protocol() возвращает согласованный протокол.

Если HAS_ALPN имеет значение False, этот метод вызывает исключение NotImplementedError.

Добавлено в версии 3.5.

SSLContext.set_npn_protocols(npn_protocols)

Указывает протоколы, которые сокет должен объявить во время согласования SSL/TLS. Параметр должен быть списком строк, например ['http/1.1', 'spdy/2'], упорядоченных по предпочтительности. Выбор протокола происходит во время согласования в соответствии с согласованием протокола на уровне приложений. После успешного согласования метод SSLSocket.selected_npn_protocol() возвращает согласованный протокол.

Если HAS_NPN имеет значение False, этот метод вызывает исключение NotImplementedError.

Добавлено в версии 3.3.

Устарело с версии 3.10: На смену NPN пришёл ALPN.

SSLContext.sni_callback

Регистрирует функцию обратного вызова, которая будет вызвана после получения сервером SSL/TLS сообщения согласования TLS Client Hello, если TLS-клиент указал индикацию имени сервера. Механизм индикации имени сервера описан в разделе 3 «Server Name Indication» документа RFC 6066.

Для каждого SSLContext можно задать только одну функцию обратного вызова. Если для sni_callback задано значение None, функция обратного вызова отключается. Повторный вызов этой функции отключит ранее зарегистрированную функцию обратного вызова.

Функция обратного вызова вызывается с тремя аргументами: первый — это ssl.SSLSocket, второй — строка с именем сервера, с которым намерен установить связь клиент (или None, если сообщение TLS Client Hello не содержит имени сервера), а третий аргумент — исходный SSLContext. Аргумент с именем сервера является текстом. Для интернационализированного доменного имени указывается A-метка IDN ("xn--pythn-mua.org").

Обычно эта функция обратного вызова используется для изменения атрибута SSLSocket.context объекта ssl.SSLSocket, присваивая ему новый объект типа SSLContext, представляющий цепочку сертификатов, соответствующую имени сервера.

Из-за раннего этапа согласования TLS-соединения доступны лишь некоторые методы и атрибуты, например SSLSocket.selected_alpn_protocol() и SSLSocket.context. Методы SSLSocket.getpeercert(), SSLSocket.get_verified_chain(), SSLSocket.get_unverified_chain(), SSLSocket.cipher() и SSLSocket.compression() требуют, чтобы TLS-соединение прошло дальше этапа TLS Client Hello. Поэтому они не вернут осмысленные значения, и их небезопасно вызывать.

Функция sni_callback должна возвращать None, чтобы продолжить согласование TLS. Если требуется прервать TLS-соединение, можно вернуть константу ALERT_DESCRIPTION_*. Любое другое возвращаемое значение приведёт к фатальной ошибке TLS с кодом ALERT_DESCRIPTION_INTERNAL_ERROR.

Если функция sni_callback вызывает исключение, TLS-соединение прерывается с фатальным сообщением оповещения TLS ALERT_DESCRIPTION_HANDSHAKE_FAILURE.

Если при сборке библиотеки OpenSSL был определён макрос OPENSSL_NO_TLSEXT, этот метод вызывает исключение NotImplementedError.

Добавлено в версии 3.7.

SSLContext.set_servername_callback(server_name_callback)

Это устаревший API, сохранённый для обратной совместимости. По возможности следует использовать sni_callback. Передаваемый параметр server_name_callback аналогичен sni_callback, за исключением того, что если имя узла сервера является именем домена с интернационализированной кодировкой IDN, функция server_name_callback получает декодированную U-метку ("pythön.org").

Если при декодировании имени сервера возникнет ошибка, TLS-соединение будет прервано, а клиент получит фатальное сообщение оповещения TLS ALERT_DESCRIPTION_INTERNAL_ERROR.

Добавлено в версии 3.4.

SSLContext.load_dh_params(dhfile, /)

Загружает параметры генерации ключей для обмена ключами Диффи — Хеллмана (DH). Использование обмена ключами DH повышает прямую секретность за счёт вычислительных ресурсов (как на сервере, так и на клиенте). Параметр dhfile должен содержать путь к файлу с параметрами DH в формате PEM.

Эта настройка не применяется к клиентским сокетам. Для дополнительного повышения безопасности можно также использовать параметр OP_SINGLE_DH_USE.

Добавлено в версии 3.3.

SSLContext.set_ecdh_curve(curve_name, /)

Задаёт название кривой для обмена ключами Диффи — Хеллмана на эллиптических кривых (ECDH). ECDH значительно быстрее обычного DH и при этом, как принято считать, не уступает ему по безопасности. Параметр curve_name должен быть строкой с названием известной эллиптической кривой, например prime256v1 — широко поддерживаемой кривой.

Эта настройка не применяется к клиентским сокетам. Для дополнительного повышения безопасности можно также использовать параметр OP_SINGLE_ECDH_USE.

Этот метод недоступен, если HAS_ECDH имеет значение False.

Добавлено в версии 3.3.

См. также

SSL/TLS и совершенная прямая секретность

Винсент Берна.

SSLContext.wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)

Оборачивает существующий сокет Python sock и возвращает экземпляр SSLContext.sslsocket_class (по умолчанию SSLSocket). Возвращённый SSL-сокет связан с контекстом, его настройками и сертификатами. sock должен быть сокетом SOCK_STREAM; другие типы сокетов не поддерживаются.

Параметр server_side — это логическое значение, определяющее, должно ли поведение этого сокета соответствовать стороне сервера или клиента.

Для клиентских сокетов создание контекста выполняется отложенно: если базовый сокет ещё не подключён, контекст будет создан после вызова connect() для сокета. Для серверных сокетов, у которых нет удалённого узла, предполагается, что сокет является прослушивающим; SSL-оборачивание на стороне сервера автоматически выполняется для клиентских соединений, принятых методом accept(). Метод может вызывать исключение SSLError.

Для клиентских соединений необязательный параметр server_hostname указывает имя узла службы, к которой выполняется подключение. Это позволяет одному серверу размещать несколько SSL-служб с разными сертификатами, подобно виртуальным узлам HTTP. Если server_side имеет значение true, указание server_hostname вызовет исключение ValueError.

Параметр do_handshake_on_connect определяет, следует ли автоматически выполнять согласование SSL после вызова socket.connect() или приложение вызовет его явно, используя метод SSLSocket.do_handshake(). Явный вызов SSLSocket.do_handshake() позволяет программе управлять блокирующим поведением операций ввода-вывода сокета, выполняемых во время согласования.

Параметр suppress_ragged_eofs определяет, как метод SSLSocket.recv() должен сообщать о неожиданном EOF на другом конце соединения. Если задано значение True (по умолчанию), в ответ на ошибки неожиданного EOF, вызванные базовым сокетом, возвращается обычный EOF (пустой объект bytes); если задано значение False, исключения передаются вызывающему коду.

См. session для параметра session.

Чтобы обернуть SSLSocket в другой SSLSocket, используйте SSLContext.wrap_bio().

Изменено в версии 3.5: Параметр server_hostname теперь можно передавать всегда, даже если OpenSSL не поддерживает SNI.

Изменено в версии 3.6: Добавлен аргумент session.

Изменено в версии 3.7: Метод возвращает экземпляр SSLContext.sslsocket_class, а не жёстко заданный SSLSocket.

SSLContext.sslsocket_class

Тип возвращаемого значения SSLContext.wrap_socket(); по умолчанию — SSLSocket. Атрибут можно присвоить экземплярам SSLContext, чтобы возвращался пользовательский подкласс SSLSocket.

Добавлено в версии 3.7.

SSLContext.wrap_bio(incoming, outgoing, server_side=False, server_hostname=None, session=None)

Оборачивает объекты BIO incoming и outgoing и возвращает экземпляр SSLContext.sslobject_class (по умолчанию — SSLObject). Процедуры SSL считывают входные данные из входящего BIO и записывают данные в исходящий BIO.

Параметры server_side, server_hostname и session имеют то же значение, что и в SSLContext.wrap_socket().

Изменено в версии 3.6: Добавлен аргумент session.

Изменено в версии 3.7: Метод возвращает экземпляр SSLContext.sslobject_class вместо жёстко заданного SSLObject.

SSLContext.sslobject_class

Тип возвращаемого значения SSLContext.wrap_bio(); по умолчанию — SSLObject. Атрибут можно переопределить в экземпляре класса, чтобы возвращался пользовательский подкласс SSLObject.

Добавлено в версии 3.7.

SSLContext.session_stats()

Получает статистику о сеансах SSL, созданных или управляемых этим контекстом. Возвращается словарь, в котором названия каждого показателя сопоставлены с их числовыми значениями. Например, ниже показано общее количество попаданий и промахов в кэше сеансов с момента создания контекста:

>>> stats = context.session_stats()
>>> stats['hits'], stats['misses']
(0, 0)
SSLContext.check_hostname

Нужно ли сопоставлять имя узла сертификата узла-участника с именем узла в SSLSocket.do_handshake(). Для контекста verify_mode должен иметь значение CERT_OPTIONAL или CERT_REQUIRED, а для проверки имени узла необходимо передать server_hostname в wrap_socket(). Включение проверки имени узла автоматически изменяет verify_mode с CERT_NONE на CERT_REQUIRED. Пока проверка имени узла включена, вернуть значение CERT_NONE нельзя. Протокол PROTOCOL_TLS_CLIENT включает проверку имени узла по умолчанию. Для остальных протоколов проверку имени узла необходимо включать явно.

Пример:

import socket, ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))

Добавлено в версии 3.4.

Изменено в версии 3.7: Если проверка имени узла включена, а verify_mode имеет значение CERT_NONE, значение verify_mode теперь автоматически изменяется на CERT_REQUIRED. Ранее такая операция приводила к исключению ValueError.

SSLContext.keylog_filename

Записывает ключи TLS в файл журнала ключей при создании или получении ключевого материала. Файл журнала ключей предназначен только для отладки. Формат файла определён NSS и используется многими анализаторами сетевого трафика, например Wireshark. Файл журнала открывается только для добавления данных. Записи синхронизируются между потоками, но не между процессами.

Добавлено в версии 3.8.

SSLContext.maximum_version

Элемент перечисления TLSVersion, представляющий наивысшую поддерживаемую версию TLS. По умолчанию значение равно TLSVersion.MAXIMUM_SUPPORTED. Для протоколов, отличных от PROTOCOL_TLS, PROTOCOL_TLS_CLIENT и PROTOCOL_TLS_SERVER, атрибут доступен только для чтения.

Атрибуты maximum_version, minimum_version и SSLContext.options влияют на поддерживаемые контекстом версии SSL и TLS. Реализация не предотвращает использование недопустимых комбинаций. Например, контекст, в котором в options задано OP_NO_TLSv1_2, а maximum_version имеет значение TLSVersion.TLSv1_2, не сможет установить соединение TLS 1.2.

Добавлено в версии 3.7.

SSLContext.minimum_version

Аналогичен SSLContext.maximum_version, но задаёт наименьшую поддерживаемую версию или TLSVersion.MINIMUM_SUPPORTED.

Добавлено в версии 3.7.

SSLContext.num_tickets

Управляет количеством билетов сеанса TLS 1.3 для контекста PROTOCOL_TLS_SERVER. Эта настройка не влияет на соединения TLS версий 1.0–1.2.

Добавлено в версии 3.8.

SSLContext.options

Целое число, представляющее набор параметров SSL, включённых для этого контекста. Значение по умолчанию — OP_ALL, но можно указать и другие параметры, например OP_NO_SSLv2, объединив их побитовым ИЛИ.

Изменено в версии 3.6: SSLContext.options возвращает флаги Options:

>>> ssl.create_default_context().options
<Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>

Устарело с версии 3.7: Все параметры OP_NO_SSL* и OP_NO_TLS* устарели начиная с Python 3.7. Вместо них используйте SSLContext.minimum_version и SSLContext.maximum_version.

SSLContext.post_handshake_auth

Включает пострукопожатную аутентификацию клиента TLS 1.3. По умолчанию пострукопожатная аутентификация отключена, и сервер может запросить сертификат клиента TLS только во время первоначального рукопожатия. Если эта функция включена, сервер может запросить сертификат клиента TLS в любой момент после рукопожатия.

Если функция включена на сокетах клиентской стороны, клиент сообщает серверу о поддержке пострукопожатной аутентификации.

Если функция включена на сокетах серверной стороны, необходимо также задать для SSLContext.verify_mode значение CERT_OPTIONAL или CERT_REQUIRED. Фактический обмен сертификатом клиента откладывается до вызова SSLSocket.verify_client_post_handshake() и выполнения операций ввода-вывода.

Добавлено в версии 3.8.

SSLContext.protocol

Версия протокола, выбранная при создании контекста. Этот атрибут доступен только для чтения.

SSLContext.hostname_checks_common_name

Переходит ли check_hostname к проверке общего имени субъекта сертификата, если в сертификате отсутствует расширение альтернативного имени субъекта (по умолчанию: true).

Добавлено в версии 3.7.

Изменено в версии 3.10: Этот флаг не действовал в OpenSSL до версии 1.1.1l. В Python 3.8.9, 3.9.3 и 3.10 добавлены обходные решения для предыдущих версий.

SSLContext.security_level

Целое число, представляющее уровень безопасности контекста. Этот атрибут доступен только для чтения.

Добавлено в версии 3.10.

SSLContext.verify_flags

Флаги для операций проверки сертификатов. Можно задать такие флаги, как VERIFY_CRL_CHECK_LEAF, объединив их побитовым ИЛИ. По умолчанию OpenSSL не требует списки отозванных сертификатов (CRL) и не проверяет их.

Добавлено в версии 3.4.

Изменено в версии 3.6: SSLContext.verify_flags возвращает флаги перечисления VerifyFlags:

>>> ssl.create_default_context().verify_flags
<VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
SSLContext.verify_mode

Нужно ли пытаться проверять сертификаты других узлов-участников и как вести себя в случае неудачной проверки. Значение этого атрибута должно быть одним из следующих: CERT_NONE, CERT_OPTIONAL или CERT_REQUIRED.

Изменено в версии 3.6: SSLContext.verify_mode теперь возвращает перечисление VerifyMode:

>>> ssl.create_default_context().verify_mode
<VerifyMode.CERT_REQUIRED: 2>
SSLContext.set_psk_client_callback(callback)

Включает аутентификацию TLS-PSK (на основе предварительно заданного ключа) для соединения на стороне клиента.

Как правило, аутентификацию на основе сертификатов следует предпочесть этому методу.

Параметр callback — вызываемый объект со следующей сигнатурой: def callback(hint: str | None) -> tuple[str | None, bytes]. Параметр hint — необязательная подсказка идентификатора, отправляемая сервером. Возвращаемое значение — кортеж вида (идентификатор клиента, psk). Идентификатор клиента — необязательная строка, которую сервер может использовать для выбора соответствующего PSK для клиента. После кодирования в UTF-8 длина строки не должна превышать 256 октетов. PSK — это объект, подобный bytes, представляющий предварительно заданный ключ. Чтобы отклонить соединение, верните PSK нулевой длины.

Установка для callback значения None удаляет имеющийся callback.

Примечание

При использовании TLS 1.3:

  • параметр hint всегда равен None.
  • идентификатор клиента должен быть непустой строкой.

Пример использования:

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_client_callback(lambda hint: (None, psk))

# A table using the hint from the server:
psk_table = { 'ServerId_1': bytes.fromhex('c0ffee'),
              'ServerId_2': bytes.fromhex('facade')
}
def callback(hint):
    return 'ClientId_1', psk_table.get(hint, b'')
context.set_psk_client_callback(callback)

Этот метод вызывает исключение NotImplementedError, если HAS_PSK имеет значение False.

Добавлено в версии 3.13.

SSLContext.set_psk_server_callback(callback, identity_hint=None)

Включает аутентификацию TLS-PSK (на основе предварительно заданного ключа) для соединения на стороне сервера.

Как правило, аутентификацию на основе сертификатов следует предпочесть этому методу.

Параметр callback — вызываемый объект со следующей сигнатурой: def callback(identity: str | None) -> bytes. Параметр identity — необязательный идентификатор, передаваемый клиентом; его можно использовать для выбора соответствующего PSK. Возвращаемое значение — объект, подобный bytes, представляющий предварительно заданный ключ. Чтобы отклонить соединение, верните PSK нулевой длины.

Установка для callback значения None удаляет имеющийся callback.

Параметр identity_hint — необязательная строка-подсказка для идентификатора, отправляемая клиенту. После кодирования в UTF-8 длина строки не должна превышать 256 октетов.

Примечание

При использовании TLS 1.3 параметр identity_hint клиенту не отправляется.

Пример использования:

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.maximum_version = ssl.TLSVersion.TLSv1_2
context.set_ciphers('PSK')

# A simple lambda:
psk = bytes.fromhex('c0ffee')
context.set_psk_server_callback(lambda identity: psk)

# A table using the identity of the client:
psk_table = { 'ClientId_1': bytes.fromhex('c0ffee'),
              'ClientId_2': bytes.fromhex('facade')
}
def callback(identity):
    return psk_table.get(identity, b'')
context.set_psk_server_callback(callback, 'ServerId_1')

Этот метод вызывает исключение NotImplementedError, если HAS_PSK имеет значение False.

Добавлено в версии 3.13.

Сертификаты

Сертификаты обычно являются частью системы с открытым и закрытым ключами. В этой системе каждому участнику (им может быть компьютер, человек или организация) назначается уникальный ключ шифрования, состоящий из двух частей. Одна часть ключа является общедоступной и называется открытым ключом; другая хранится в секрете и называется закрытым ключом. Эти две части связаны между собой: если зашифровать сообщение одной из них, расшифровать его можно другой частью и только ею.

Сертификат содержит сведения о двух участниках. В нём указано имя субъекта и открытый ключ субъекта. Кроме того, сертификат содержит утверждение второго участника, издателя, о том, что субъект действительно является тем, за кого себя выдаёт, и что указанный открытый ключ действительно принадлежит субъекту. Утверждение издателя подписывается его закрытым ключом, известным только ему. Однако любой может проверить утверждение издателя, найдя его открытый ключ, расшифровав им утверждение и сравнив результат с остальными сведениями в сертификате. Сертификат также содержит сведения о периоде его действия. Они представлены двумя полями, называемыми «notBefore» и «notAfter».

В Python сертификаты могут использоваться клиентом или сервером для подтверждения своей личности. Можно также потребовать, чтобы другая сторона сетевого соединения предоставила сертификат, который затем проверяется в соответствии с требованиями клиента или сервера. При неудачной проверке попытка соединения может приводить к исключению. Проверка выполняется автоматически базовой инфраструктурой OpenSSL; приложению не нужно разбираться в её механизмах. Однако обычно приложению необходимо предоставить наборы сертификатов, чтобы эта проверка могла выполняться.

В Python сертификаты хранятся в файлах. Они должны быть представлены в формате «PEM» (см. RFC 1422) — это кодировка base64, обрамлённая строкой заголовка и строкой нижнего колонтитула:

-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----

Цепочки сертификатов

Файлы Python с сертификатами могут содержать последовательность сертификатов, иногда называемую цепочкой сертификатов. Цепочка должна начинаться с конкретного сертификата участника, которым «является» клиент или сервер, затем содержать сертификат издателя этого сертификата, далее — сертификат издателя этого сертификата и так далее, пока цепочка не дойдёт до сертификата с самоподписью, то есть сертификата, у которого совпадают субъект и издатель; такой сертификат иногда называют корневым сертификатом. Сертификаты следует просто объединить в файле сертификатов. Например, предположим, что у нас есть цепочка из трёх сертификатов: от сертификата нашего сервера к сертификату удостоверяющего центра, подписавшего сертификат сервера, а затем к корневому сертификату организации, выдавшей сертификат удостоверяющего центра:

-----BEGIN CERTIFICATE-----
... (certificate for your server)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the certificate for the CA)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (the root certificate for the CA's issuer)...
-----END CERTIFICATE-----

Сертификаты CA

Если требуется проверять сертификат другой стороны соединения, необходимо предоставить файл «сертификатов CA», содержащий цепочки сертификатов для каждого издателя, которому вы готовы доверять. Этот файл также просто содержит объединённые цепочки. При проверке Python использует первую найденную в файле подходящую цепочку. Файл сертификатов платформы можно использовать, вызвав SSLContext.load_default_certs(); это автоматически выполняется функцией create_default_context().

Объединённые ключ и сертификат

Часто закрытый ключ хранится в том же файле, что и сертификат; в этом случае достаточно передать только параметр certfile в SSLContext.load_cert_chain(). Если закрытый ключ хранится вместе с сертификатом, он должен находиться перед первым сертификатом в цепочке:

-----BEGIN RSA PRIVATE KEY-----
... (private key in base64 encoding) ...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
... (certificate in base64 PEM encoding) ...
-----END CERTIFICATE-----

Самоподписанные сертификаты

Если вы собираетесь создать сервер, предоставляющий службы соединения с SSL-шифрованием, вам потребуется получить сертификат для этой службы. Существует множество способов получить подходящие сертификаты, например купить сертификат у удостоверяющего центра. Ещё один распространённый способ — создать самоподписанный сертификат. Проще всего это сделать с помощью пакета OpenSSL, например так:

% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Generating a 1024 bit RSA private key
.......++++++
.............................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:MyState
Locality Name (eg, city) []:Some City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.
Organizational Unit Name (eg, section) []:My Group
Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com
Email Address []:ops@myserver.mygroup.myorganization.com
%

Недостаток самоподписанного сертификата в том, что он является собственным корневым сертификатом и отсутствует в кэше известных (и доверенных) корневых сертификатов у всех остальных.

Примеры

Проверка поддержки SSL

Чтобы проверить наличие поддержки SSL в установленной версии Python, пользовательский код должен использовать следующий шаблон:

try:
    import ssl
except ImportError:
    pass
else:
    ...  # do something that requires SSL support

Операции на стороне клиента

В этом примере создаётся контекст SSL с рекомендуемыми настройками безопасности для клиентских сокетов, включая автоматическую проверку сертификатов:

>>> context = ssl.create_default_context()

Если вы предпочитаете самостоятельно настраивать параметры безопасности, можно создать контекст с нуля (но помните, что настройки могут оказаться неверными):

>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")

(в этом фрагменте предполагается, что операционная система хранит комплект всех сертификатов CA в /etc/ssl/certs/ca-bundle.crt; в противном случае вы получите ошибку и вам придётся изменить расположение)

Протокол PROTOCOL_TLS_CLIENT настраивает контекст для проверки сертификатов и имён узлов. Для verify_mode задаётся значение CERT_REQUIRED, а для check_hostname — True. Все остальные протоколы создают контексты SSL с небезопасными настройками по умолчанию.

При использовании контекста для подключения к серверу CERT_REQUIRED и check_hostname проверяют сертификат сервера: убеждаются, что сертификат сервера подписан одним из сертификатов CA, проверяют корректность подписи и другие свойства, например срок действия и соответствие имени узла:

>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
...                            server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))

Затем можно получить сертификат:

>>> cert = conn.getpeercert()

При визуальном осмотре видно, что сертификат действительно идентифицирует нужную службу (то есть HTTPS-узел www.python.org):

>>> pprint.pprint(cert)
{'OCSP': ('http://ocsp.digicert.com',),
 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
                           'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
 'issuer': ((('countryName', 'US'),),
            (('organizationName', 'DigiCert Inc'),),
            (('organizationalUnitName', 'www.digicert.com'),),
            (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
 'notAfter': 'Sep  9 12:00:00 2016 GMT',
 'notBefore': 'Sep  5 00:00:00 2014 GMT',
 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
 'subject': ((('businessCategory', 'Private Organization'),),
             (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
             (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
             (('serialNumber', '3359300'),),
             (('streetAddress', '16 Allen Rd'),),
             (('postalCode', '03894-4801'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'NH'),),
             (('localityName', 'Wolfeboro'),),
             (('organizationName', 'Python Software Foundation'),),
             (('commonName', 'www.python.org'),)),
 'subjectAltName': (('DNS', 'www.python.org'),
                    ('DNS', 'python.org'),
                    ('DNS', 'pypi.org'),
                    ('DNS', 'docs.python.org'),
                    ('DNS', 'testpypi.org'),
                    ('DNS', 'bugs.python.org'),
                    ('DNS', 'wiki.python.org'),
                    ('DNS', 'hg.python.org'),
                    ('DNS', 'mail.python.org'),
                    ('DNS', 'packaging.python.org'),
                    ('DNS', 'pythonhosted.org'),
                    ('DNS', 'www.pythonhosted.org'),
                    ('DNS', 'test.pythonhosted.org'),
                    ('DNS', 'us.pycon.org'),
                    ('DNS', 'id.python.org')),
 'version': 3}

Теперь, когда SSL-канал установлен, а сертификат проверен, можно продолжить взаимодействие с сервером:

>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))
[b'HTTP/1.1 200 OK',
 b'Date: Sat, 18 Oct 2014 18:27:20 GMT',
 b'Server: nginx',
 b'Content-Type: text/html; charset=utf-8',
 b'X-Frame-Options: SAMEORIGIN',
 b'Content-Length: 45679',
 b'Accept-Ranges: bytes',
 b'Via: 1.1 varnish',
 b'Age: 2188',
 b'X-Served-By: cache-lcy1134-LCY',
 b'X-Cache: HIT',
 b'X-Cache-Hits: 11',
 b'Vary: Cookie',
 b'Strict-Transport-Security: max-age=63072000; includeSubDomains',
 b'Connection: close',
 b'',
 b'']

См. приведённое ниже обсуждение вопросов безопасности.

Операции на стороне сервера

Для работы сервера обычно необходимы сертификат сервера и закрытый ключ, каждый в отдельном файле. Сначала создайте контекст, содержащий ключ и сертификат, чтобы клиенты могли проверить подлинность сервера. Затем откройте сокет, привяжите его к порту, вызовите для него listen() и начните ожидать подключения клиентов:

import socket, ssl

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")

bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)

Когда клиент подключится, вызовите для сокета accept(), чтобы получить новый сокет с другой стороны, и используйте метод контекста SSLContext.wrap_socket(), чтобы создать серверный SSL-сокет для соединения:

while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        deal_with_client(connstream)
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()

Затем считывайте данные из connstream и обрабатывайте их, пока не завершите работу с клиентом (или пока клиент не завершит работу с вами):

def deal_with_client(connstream):
    data = connstream.recv(1024)
    # empty data means the client is finished with us
    while data:
        if not do_something(connstream, data):
            # we'll assume do_something returns False
            # when we're finished with client
            break
        data = connstream.recv(1024)
    # finished with client

После этого вернитесь к ожиданию подключений новых клиентов (разумеется, настоящий сервер, скорее всего, обрабатывал бы каждое клиентское соединение в отдельном потоке либо переводил сокеты в неблокирующий режим и использовал цикл обработки событий).

Примечания о неблокирующих сокетах

Сокеты SSL в неблокирующем режиме ведут себя несколько иначе, чем обычные сокеты. Поэтому при работе с неблокирующими сокетами необходимо учитывать несколько особенностей:

  • Большинство методов SSLSocket при блокировке операции ввода-вывода вызывают SSLWantWriteError или SSLWantReadError, а не BlockingIOError. SSLWantReadError вызывается, если требуется операция чтения из базового сокета, а SSLWantWriteError — если требуется операция записи в базовый сокет. Обратите внимание: попытка записать данные в SSL-сокет может потребовать предварительного чтения из базового сокета, а попытка прочитать данные из SSL-сокета может потребовать предварительной записи в базовый сокет.

    Изменено в версии 3.5: В предыдущих версиях Python метод SSLSocket.send() возвращал ноль вместо вызова исключения SSLWantWriteError или SSLWantReadError.

  • Вызов select() сообщает, что сокет на уровне ОС доступен для чтения (или записи), но это не означает, что на верхнем уровне SSL имеется достаточно данных. Например, могла поступить только часть кадра SSL. Поэтому необходимо быть готовым к ошибкам SSLSocket.recv() и SSLSocket.send() и повторить операцию после следующего вызова select().
  • И наоборот, поскольку у уровня SSL есть собственное кадрирование, в SSL-сокете могут оставаться данные для чтения, даже если select() об этом не знает. Поэтому сначала следует вызвать SSLSocket.recv(), чтобы получить все потенциально доступные данные, и лишь затем при необходимости блокироваться на вызове select().

    (Разумеется, аналогичные меры нужны и при использовании других примитивов, таких как poll() или примитивов модуля selectors.)

  • Само рукопожатие SSL будет неблокирующим: метод SSLSocket.do_handshake() необходимо вызывать повторно, пока он не завершится успешно. Ниже приведён пример использования select() для ожидания готовности сокета:

    while True:
        try:
            sock.do_handshake()
            break
        except ssl.SSLWantReadError:
            select.select([sock], [], [])
        except ssl.SSLWantWriteError:
            select.select([], [sock], [])
    

См. также

Модуль asyncio поддерживает неблокирующие SSL-сокеты и предоставляет высокоуровневый API потоков. Он опрашивает события с помощью модуля selectors и обрабатывает исключения SSLWantWriteError, SSLWantReadError и BlockingIOError. Он также выполняет рукопожатие SSL асинхронно.

Поддержка Memory BIO

Добавлено в версии 3.5.

Начиная с появления модуля SSL в Python 2.6, класс SSLSocket предоставляет две связанные, но различные группы возможностей:

  • Обработка протокола SSL
  • Сетевой ввод-вывод

API сетевого ввода-вывода идентичен API класса socket.socket, от которого также наследуется SSLSocket. Благодаря этому SSL-сокет можно использовать как непосредственную замену обычного сокета, что позволяет легко добавить поддержку SSL в существующее приложение.

Совместное использование обработки протокола SSL и сетевого ввода-вывода обычно работает хорошо, но в некоторых случаях возникают проблемы. Например, асинхронные фреймворки ввода-вывода могут использовать модель мультиплексирования ввода-вывода, отличную от модели «select/poll для файлового дескриптора» (на основе готовности), которая предполагается классом socket.socket и внутренними процедурами OpenSSL для ввода-вывода через сокеты. Это особенно актуально для таких платформ, как Windows, где эта модель неэффективна. Для этого предусмотрен вариант класса SSLSocket с ограниченным набором возможностей, называемый SSLObject.

class ssl.SSLObject

Вариант класса SSLSocket с ограниченным набором возможностей, представляющий экземпляр протокола SSL без методов сетевого ввода-вывода. Этот класс обычно используют авторы фреймворков, которым нужно реализовать асинхронный ввод-вывод для SSL через буферы памяти.

Этот класс реализует интерфейс поверх низкоуровневого объекта SSL, созданного OpenSSL. Этот объект хранит состояние SSL-соединения, но сам не обеспечивает сетевой ввод-вывод. Ввод-вывод необходимо выполнять с помощью отдельных объектов «BIO» — уровня абстракции ввода-вывода OpenSSL.

У этого класса нет публичного конструктора. Экземпляр SSLObject необходимо создать с помощью метода wrap_bio(). Этот метод создаёт экземпляр SSLObject и связывает его с парой BIO. Входящий BIO используется для передачи данных из Python экземпляру протокола SSL, а исходящий BIO — для передачи данных в обратном направлении.

Доступны следующие методы:

  • context
  • server_side
  • server_hostname
  • session
  • session_reused
  • read()
  • write()
  • getpeercert()
  • get_verified_chain()
  • get_unverified_chain()
  • selected_alpn_protocol()
  • selected_npn_protocol()
  • cipher()
  • shared_ciphers()
  • compression()
  • pending()
  • do_handshake()
  • verify_client_post_handshake()
  • unwrap()
  • get_channel_binding()
  • version()

По сравнению с SSLSocket у этого объекта отсутствуют следующие возможности:

  • Любой вид сетевого ввода-вывода; recv() и send() выполняют чтение и запись только в базовые буферы MemoryBIO.
  • Механизм do_handshake_on_connect отсутствует. Для начала рукопожатия необходимо всегда вручную вызывать do_handshake().
  • Обработка suppress_ragged_eofs отсутствует. Все нарушения протокола, связанные с достижением конца файла, приводят к исключению SSLEOFError.
  • Вызов метода unwrap() ничего не возвращает, в отличие от SSL-сокета, который возвращает базовый сокет.
  • Функция обратного вызова server_name_callback, переданная в SSLContext.set_servername_callback(), получит экземпляр SSLObject вместо экземпляра SSLSocket в качестве первого параметра.

Некоторые примечания об использовании SSLObject:

  • Весь ввод-вывод для SSLObject является неблокирующим. Это означает, например, что read() вызовет исключение SSLWantReadError, если ему потребуется больше данных, чем доступно во входящем BIO.

Изменено в версии 3.7: Экземпляры SSLObject необходимо создавать с помощью wrap_bio(). В предыдущих версиях экземпляры можно было создавать напрямую. Такая возможность никогда не документировалась и официально не поддерживалась.

Объект SSLObject взаимодействует с внешним миром с помощью буферов памяти. Для этого предназначен класс MemoryBIO, предоставляющий буфер памяти. Он оборачивает объект Memory BIO (Basic IO) OpenSSL:

class ssl.MemoryBIO

Буфер памяти, который можно использовать для передачи данных между Python и экземпляром протокола SSL.

pending

Возвращает количество байтов, находящихся в данный момент в буфере памяти.

eof

Логическое значение, указывающее, находится ли Memory BIO в данный момент в позиции конца файла.

read(n=-1, /)

Читает из буфера памяти до n байтов. Если n не указано или имеет отрицательное значение, возвращаются все байты.

write(buf, /)

Записывает байты из buf в Memory BIO. Аргумент buf должен быть объектом, поддерживающим протокол буфера.

Возвращаемое значение — количество записанных байтов, которое всегда равно длине buf.

write_eof()

Записывает маркер EOF в Memory BIO. После вызова этого метода вызывать write() нельзя. Атрибут eof станет равен true после чтения всех данных, находящихся в буфере.

Сеанс SSL

Добавлено в версии 3.6.

class ssl.SSLSession

Объект сеанса, используемый методом session.

id
time
timeout
ticket_lifetime_hint
has_ticket

Соображения безопасности

Оптимальные настройки по умолчанию

Для использования в клиентском режиме, если у вас нет особых требований к политике безопасности, настоятельно рекомендуется использовать функцию create_default_context() для создания контекста SSL. Она загрузит доверенные сертификаты центров сертификации системы, включит проверку сертификатов и проверку имени хоста, а также попытается выбрать достаточно безопасные настройки протокола и шифров.

Например, ниже показано, как использовать класс smtplib.SMTP для создания доверенного и безопасного соединения с сервером SMTP:

>>> import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Ready to start TLS')

Если для соединения требуется сертификат клиента, его можно добавить с помощью SSLContext.load_cert_chain().

В отличие от этого, если создать контекст SSL, самостоятельно вызвав конструктор SSLContext, проверка сертификатов и имени хоста по умолчанию включена не будет. В таком случае прочитайте приведённые ниже разделы, чтобы обеспечить надлежащий уровень безопасности.

Настройка вручную

Проверка сертификатов

При непосредственном вызове конструктора SSLContext по умолчанию используется CERT_NONE. Поскольку этот режим не проверяет подлинность другой стороны, он может быть небезопасным, особенно в клиентском режиме, когда обычно необходимо удостовериться в подлинности сервера, с которым устанавливается соединение. Поэтому в клиентском режиме настоятельно рекомендуется использовать CERT_REQUIRED. Однако этого недостаточно: также необходимо проверить, что сертификат сервера, который можно получить вызовом SSLSocket.getpeercert(), соответствует нужной службе. Для многих протоколов и приложений службу можно идентифицировать по имени хоста. Эта стандартная проверка выполняется автоматически, если включён параметр SSLContext.check_hostname.

Изменено в версии 3.7: Теперь соответствие имени хоста проверяет OpenSSL. Python больше не использует match_hostname().

В серверном режиме, если необходимо аутентифицировать клиентов средствами уровня SSL (а не более высокоуровневым механизмом аутентификации), нужно также указать CERT_REQUIRED и аналогичным образом проверить сертификат клиента.

Версии протокола

Версии SSL 2 и 3 считаются небезопасными, поэтому их использование опасно. Если нужна максимальная совместимость клиентов и серверов, рекомендуется использовать PROTOCOL_TLS_CLIENT или PROTOCOL_TLS_SERVER в качестве версии протокола. SSLv2 и SSLv3 по умолчанию отключены.

>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_2
>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3

Созданный выше контекст SSL-клиента будет разрешать подключение к серверу только по TLSv1.2 и TLSv1.3 (если они поддерживаются вашей системой). PROTOCOL_TLS_CLIENT по умолчанию включает проверку сертификатов и имени хоста. В контекст необходимо загрузить сертификаты.

Выбор шифров

Если у вас повышенные требования к безопасности, набор шифров, доступных при согласовании сеанса SSL, можно настроить с помощью метода SSLContext.set_ciphers(). Начиная с Python 3.2.3, модуль ssl по умолчанию отключает некоторые слабые шифры, однако набор шифров может потребоваться дополнительно ограничить. Обязательно ознакомьтесь с документацией OpenSSL о формате списка шифров. Чтобы проверить, какие шифры включены заданным списком, используйте SSLContext.get_ciphers() или команду openssl ciphers в вашей системе.

Многопроцессность

Если этот модуль используется в многопроцессном приложении (например, с помощью модулей multiprocessing или concurrent.futures), учитывайте, что встроенный генератор случайных чисел OpenSSL некорректно обрабатывает разветвлённые процессы. Если приложение использует какие-либо возможности SSL вместе с os.fork(), необходимо изменить состояние PRNG родительского процесса. Для этого достаточно любого успешного вызова RAND_add() или RAND_bytes().

TLS 1.3

Добавлено в версии 3.7.

Протокол TLS 1.3 несколько отличается от предыдущих версий TLS/SSL. Некоторые новые возможности TLS 1.3 пока недоступны.

  • В TLS 1.3 используется отдельный набор наборов шифров. Все наборы шифров AES-GCM и ChaCha20 включены по умолчанию. Метод SSLContext.set_ciphers() пока не позволяет включать или отключать шифры TLS 1.3, однако метод SSLContext.get_ciphers() возвращает их.
  • Билеты сеанса больше не передаются во время начального рукопожатия и обрабатываются иначе. SSLSocket.session и SSLSession несовместимы с TLS 1.3.
  • Сертификаты на стороне клиента также больше не проверяются во время начального рукопожатия. Сервер может запросить сертификат в любой момент. Клиенты обрабатывают запросы сертификатов при отправке данных приложения на сервер или получении данных от него.
  • Такие возможности TLS 1.3, как ранняя передача данных, отложенный запрос сертификата клиента TLS, настройка алгоритмов подписи и повторное согласование ключей, пока не поддерживаются.

См. также

Class socket.socket

Документация базового класса socket

Надёжное шифрование SSL/TLS: введение

Введение из документации Apache HTTP Server

RFC 1422: Усиление конфиденциальности электронной почты в Интернете. Часть II: управление ключами на основе сертификатов

Стив Кент

RFC 4086: Требования к случайности для обеспечения безопасности

Дональд И. Истлейк, Джеффри И. Шиллер, Стив Крокер

RFC 5280: Профиль сертификатов и списков отозванных сертификатов (CRL) инфраструктуры открытых ключей Internet X.509

Дэвид Купер и др.

RFC 5246: Протокол безопасности транспортного уровня (TLS), версия 1.2

Тим Диркс и Эрик Рескорла.

RFC 6066: Расширения протокола безопасности транспортного уровня (TLS)

Дональд И. Истлейк

IANA TLS: параметры безопасности транспортного уровня (TLS)

IANA

RFC 7525: Рекомендации по безопасному использованию протоколов безопасности транспортного уровня (TLS) и безопасности транспортного уровня на основе датаграмм (DTLS)

IETF

Рекомендации Mozilla по настройке TLS на стороне сервера

Mozilla

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/ssl.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API