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.IntEnumSSL_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и URIOCSP.Изменено в версии 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.
-
Возвращает список шифров, доступных и клиенту, и серверу. Каждый элемент возвращаемого списка — это кортеж из трёх значений: имя шифра, версия протокола 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
нет
нет
да
нет
нет
да
Сноски
См. также
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 — для передачи данных в обратном направлении.Доступны следующие методы:
contextserver_sideserver_hostnamesessionsession_reusedread()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.
-
Сеанс 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, настройка алгоритмов подписи и повторное согласование ключей, пока не поддерживаются.
См. также
-
Classsocket.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