ssl — оболочка TLS/SSL для объектов сокетов
Исходный код: Lib/ssl.py
Этот модуль предоставляет сетевым сокетам клиентской и серверной сторон доступ к шифрованию Transport Layer Security (часто называемому «Secure Sockets Layer») и средствам аутентификации узлов. Модуль использует библиотеку OpenSSL. Он доступен во всех современных системах Unix, Windows, macOS и, вероятно, на других платформах, если на них установлена OpenSSL.
Примечание
Некоторые особенности поведения могут зависеть от платформы, поскольку выполняются вызовы 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 — необязательные сертификаты ЦС, которым следует доверять при проверке сертификатов, как и в
SSLContext.load_verify_locations(). Если все три параметра равныNone, эта функция может выбрать доверие к системным сертификатам ЦС по умолчанию.Настройки:
PROTOCOL_TLS_CLIENTилиPROTOCOL_TLS_SERVER,OP_NO_SSLv2иOP_NO_SSLv3, наборы шифров с высоким уровнем шифрования, без RC4 и без неаутентифицированных наборов шифров. ПередачаSERVER_AUTHв качестве параметра purpose устанавливаетverify_modeв значениеCERT_REQUIREDи либо загружает сертификаты ЦС (если задан хотя бы один из параметров cafile, capath или cadata), либо используетSSLContext.load_default_certs()для загрузки сертификатов ЦС по умолчанию.Если поддерживается
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, если генератор псевдослучайных чисел не получил достаточно начальных данных или если текущий метод RAND не поддерживает эту операцию. Для проверки состояния генератора псевдослучайных чисел можно использоватьRAND_status(), а для его инициализации —RAND_add().Для почти всех приложений предпочтительнее использовать
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: Теперь принимаются изменяемые объекты, подобные байтам.
Обработка сертификатов
-
ssl.cert_time_to_seconds(cert_time) -
Возвращает время в секундах с начала эпохи по строке
cert_time, представляющей дату «notBefore» или «notAfter» сертификата в формате"%b %d %H:%M:%S %Y %Z"strptime (локаль C).Пример:
>>> import ssl >>> timestamp = ssl.cert_time_to_seconds("Jan 5 09:34:43 2018 GMT") >>> timestamp 1515144883 >>> from datetime import datetime >>> print(datetime.utcfromtimestamp(timestamp)) 2018-01-05 09:34:43Даты «notBefore» и «notAfter» должны указываться по времени GMT (RFC 5280).
Изменено в версии 3.5: Входное время интерпретируется как время UTC, согласно часовому поясу «GMT», указанному во входной строке. Ранее использовался местный часовой пояс. Возвращается целое число (входной формат не поддерживает доли секунды).
-
ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout]) -
По адресу
addrSSL-защищённого сервера, заданному парой (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 -
Коллекция
enum.IntEnumконстант CERT_*.Добавлено в версии 3.6.
-
ssl.VERIFY_DEFAULT -
Возможное значение для
SSLContext.verify_flags. В этом режиме списки отозванных сертификатов (CRL) не проверяются. По умолчанию OpenSSL не требует и не проверяет CRL.Добавлено в версии 3.4.
-
ssl.VERIFY_CRL_CHECK_LEAF -
Возможное значение для
SSLContext.verify_flags. В этом режиме проверяется только сертификат узла, но не промежуточные сертификаты CA. Для этого режима необходим действительный CRL, подписанный издателем сертификата узла (его непосредственным родительским CA). Если надлежащий CRL не загружен с помощьюSSLContext.load_verify_locations, проверка завершится неудачей.Добавлено в версии 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 -
Коллекция
enum.IntFlagконстант VERIFY_*.Добавлено в версии 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 -
Коллекция
enum.IntFlagконстант OP_*.
-
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.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 -
Коллекция
enum.IntEnumконстант ALERT_DESCRIPTION_*.Добавлено в версии 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 -
Коллекция версий SSL и TLS
enum.IntEnumдля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: Вместо
read()используйтеrecv().
-
SSLSocket.write(data) -
Записывает data в SSL-сокет и возвращает количество записанных байтов. Аргумент data должен быть объектом, поддерживающим буферный интерфейс.
Вызывает
SSLWantReadErrorилиSSLWantWriteError, если сокет неблокирующий и запись должна была бы заблокироваться.Поскольку повторное согласование может произойти в любой момент, вызов
write()также может привести к операциям чтения.Изменено в версии 3.5: Время ожидания сокета больше не сбрасывается при каждом получении или отправке байтов. Теперь оно задаёт максимальную общую продолжительность записи data.
Устарело с версии 3.6: Вместо
write()используйтеsend().
Примечание
Методы 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: Имя узла или IP-адрес проверяется OpenSSL во время рукопожатия. Функция
match_hostname()больше не используется. Если OpenSSL отклоняет имя узла или IP-адрес, рукопожатие немедленно прерывается, а другой стороне отправляется предупреждение TLS.
-
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. Если
SSLContext.set_alpn_protocols()не вызывался, другая сторона не поддерживает ALPN, этот сокет не поддерживает ни один из предложенных клиентом протоколов или рукопожатие ещё не произошло, возвращаетсяNone.Добавлено в версии 3.5.
-
SSLSocket.selected_npn_protocol() -
Возвращает протокол более высокого уровня, выбранный во время рукопожатия TLS/SSL. Если
SSLContext.set_npn_protocols()не вызывался, другая сторона не поддерживает NPN или рукопожатие ещё не произошло, возвращаетсяNone.Добавлено в версии 3.3.
Устарело с версии 3.10: NPN уступил место ALPN
-
SSLSocket.unwrap() -
Выполняет рукопожатие для завершения SSL-соединения, удаляет уровень TLS из базового сокета и возвращает объект базового сокета. Это позволяет перейти от зашифрованного обмена данными по соединению к незашифрованному. Для дальнейшего обмена данными с другой стороной соединения всегда следует использовать возвращённый сокет, а не исходный.
-
SSLSocket.verify_client_post_handshake() -
Запрашивает пострукопожатную аутентификацию (PHA) у клиента TLS 1.3. Инициировать 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_hostname вызовет исключение
ValueError, если значение server_side равно true.Параметр
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. Реализация не предотвращает недопустимые сочетания. Например, контекст сOP_NO_TLSv1_2вoptionsи значениемTLSVersion.TLSv1_2дляmaximum_versionне сможет установить соединение 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— необязательная подсказка идентификатора, отправляемая сервером. Возвращаемое значение — кортеж вида (client-identity, psk). Client-identity — необязательная строка, которую сервер может использовать для выбора соответствующего PSK для клиента. При кодировании в UTF-8 длина строки должна быть не более256октетов. PSK — это объект, подобный bytes, представляющий предварительно установленный ключ. Чтобы отклонить соединение, верните PSK нулевой длины.Если задать для
callbackзначениеNone, существующий обратный вызов будет удалён.Примечание
При использовании TLS 1.3:
- параметр
hintвсегда равенNone. - client-identity должен быть непустой строкой.
Пример использования:
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, существующий обратный вызов будет удалён.Параметр
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-----
Сертификаты центров сертификации
Если требуется проверять сертификат другой стороны соединения, необходимо предоставить файл «сертификатов ЦС», содержащий цепочки сертификатов для каждого издателя, которому вы доверяете. Этот файл также состоит из объединённых цепочек. Для проверки 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")
(в этом фрагменте предполагается, что операционная система помещает набор всех сертификатов ЦС в /etc/ssl/certs/ca-bundle.crt; если это не так, возникнет ошибка, и вам придётся указать правильное расположение)
Протокол PROTOCOL_TLS_CLIENT настраивает контекст для проверки сертификатов и имени узла. verify_mode присваивается значение CERT_REQUIRED, а check_hostname присваивается значение True. Все остальные протоколы создают контексты SSL с небезопасными настройками по умолчанию.
Когда вы используете контекст для подключения к серверу, CERT_REQUIRED и check_hostname проверяют сертификат сервера: убеждаются, что сертификат сервера подписан одним из сертификатов ЦС, проверяют корректность подписи и другие свойства, например срок действия и соответствие имени узла:
>>> 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, предоставляющий буфер памяти. Он оборачивает объект OpenSSL memory BIO (Basic IO):
-
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_3 >>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
Созданный выше контекст SSL разрешает подключаться к серверу только по TLSv1.3 и более поздним версиям (если они поддерживаются вашей системой). PROTOCOL_TLS_CLIENT по умолчанию включает проверку сертификатов и имени узла. Необходимо загрузить сертификаты в контекст.
Выбор шифров
Если у вас есть повышенные требования к безопасности, с помощью метода SSLContext.set_ciphers() можно настроить набор шифров, разрешённых при согласовании сеанса SSL. Начиная с Python 3.2.3, модуль ssl по умолчанию отключает некоторые слабые шифры, однако вы можете дополнительно ограничить выбор шифров. Обязательно ознакомьтесь с документацией OpenSSL о формате списка шифров. Чтобы проверить, какие шифры включены заданным списком, используйте SSLContext.get_ciphers() или команду openssl ciphers в вашей системе.
Многопроцессная обработка
Если вы используете этот модуль в многопроцессном приложении (например, с помощью модулей multiprocessing или concurrent.futures), учтите, что внутренний генератор случайных чисел OpenSSL некорректно обрабатывает дочерние процессы, созданные с помощью fork. Если приложение использует какие-либо функции SSL вместе с os.fork(), необходимо изменить состояние ГПСЧ родительского процесса. Для этого достаточно любого успешного вызова 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: управление ключами на основе сертификатов
-
Steve Kent
- RFC 4086: Требования к случайности для обеспечения безопасности
-
Donald E., Jeffrey I. Schiller
- RFC 5280: Профиль сертификатов инфраструктуры открытых ключей Internet X.509 и списков отзыва сертификатов (CRL)
-
D. Cooper
- RFC 5246: Протокол защиты транспортного уровня (TLS), версия 1.2
-
T. Dierks et. al.
- RFC 6066: Расширения протокола защиты транспортного уровня (TLS)
-
D. Eastlake
- IANA TLS: параметры протокола защиты транспортного уровня (TLS)
-
IANA
- RFC 7525: Рекомендации по безопасному использованию протоколов защиты транспортного уровня (TLS) и защиты транспортного уровня для дейтаграмм (DTLS)
-
IETF
- Рекомендации Mozilla по TLS на стороне сервера
-
Mozilla
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/ssl.html