Spec-Zone.ru › Python 3.11

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 по умолчанию не обязательно подходят для вашего приложения.

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

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

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

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

Для более сложных приложений класс 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 или новее.

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

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

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

Начиная с Python 3.2 и 2.7.9, рекомендуется использовать SSLContext.wrap_socket() экземпляра SSLContext для обёртывания сокетов в объекты SSLSocket. Вспомогательная функция create_default_context() возвращает новый контекст с безопасными настройками по умолчанию. Старая функция wrap_socket() устарела, поскольку она неэффективна и не поддерживает ни индикацию имени сервера (SNI), ни сопоставление имени хоста.

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

import socket
import ssl

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

Если приложению требуются определённые настройки, следует создать 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

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

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

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

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

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

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

Исключения

exception ssl.SSLError

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

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

library

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

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

reason

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

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

exception ssl.SSLZeroReturnError

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

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

exception ssl.SSLWantReadError

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

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

exception ssl.SSLWantWriteError

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

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

exception ssl.SSLSyscallError

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

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

exception ssl.SSLEOFError

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

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

exception ssl.SSLCertVerificationError

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

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

verify_code

Числовой код ошибки проверки.

verify_message

Текстовое описание ошибки проверки.

exception ssl.CertificateError

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

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

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

ssl.RAND_bytes(num)

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

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

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

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

ssl.RAND_pseudo_bytes(num)

Возвращает (bytes, is_cryptographic): bytes — это num псевдослучайных байтов, is_cryptographic — True, если сгенерированные байты криптографически стойкие. Вызывает исключение SSLError, если текущий метод RAND не поддерживает эту операцию.

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

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

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

Устарело начиная с версии 3.6: OpenSSL объявил ssl.RAND_pseudo_bytes() устаревшей; вместо неё используйте ssl.RAND_bytes().

ssl.RAND_status()

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

ssl.RAND_add(bytes, entropy)

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

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

Обработка сертификатов

ssl.match_hostname(cert, hostname)

Проверяет, соответствует ли cert (в декодированном формате, возвращаемом SSLSocket.getpeercert()) указанному имени хоста hostname. Применяются правила проверки идентичности HTTPS-серверов, описанные в RFC 2818, RFC 5280 и RFC 6125. Помимо HTTPS, эта функция подходит для проверки идентичности серверов в различных протоколах на основе SSL, таких как FTPS, IMAPS, POPS и других.

В случае ошибки вызывается CertificateError. В случае успеха функция ничего не возвращает:

>>> cert = {'subject': ((('commonName', 'example.com'),),)}
>>> ssl.match_hostname(cert, "example.com")
>>> ssl.match_hostname(cert, "example.org")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/py3k/Lib/ssl.py", line 130, in match_hostname
ssl.CertificateError: hostname 'example.org' doesn't match 'example.com'

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

Изменено в версии 3.3.3: Теперь функция соответствует разделу 6.4.3 RFC 6125 и не сопоставляет несколько подстановочных знаков (например, *.*.com или *a*.example.org) и подстановочный знак внутри фрагмента интернационализированного доменного имени (IDN). Метки A IDN, такие как www*.xn--pthon-kva.org, по-прежнему поддерживаются, но x*.python.org больше не соответствует xn--tda.python.org.

Изменено в версии 3.5: Добавлена поддержка сопоставления IP-адресов, указанных в поле subjectAltName сертификата.

Изменено в версии 3.7: Функция больше не используется для TLS-соединений. Сопоставление имени хоста теперь выполняет OpenSSL.

Подстановочный знак разрешён, если он является единственным символом в сегменте и стоит в его начале. Частичные подстановочные знаки, такие как www*.example.com, больше не поддерживаются.

Устарело начиная с версии 3.7.

ssl.cert_time_to_seconds(cert_time)

Возвращает время в секундах с начала эпохи, принимая строку cert_time, представляющую дату «notBefore» или «notAfter» сертификата, в формате strptime "%b %d %H:%M:%S %Y %Z" (локаль 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])

Получает сертификат защищённого SSL-соединением сервера по адресу addr, заданному парой (hostname, port-number), и возвращает его в виде строки в кодировке PEM. Если задан параметр ssl_version, для подключения к серверу используется указанная версия протокола SSL. Если задан параметр ca_certs, он должен указывать на файл со списком корневых сертификатов в том же формате, что и одноимённый параметр в SSLContext.wrap_socket(). Функция попытается проверить сертификат сервера по этому набору корневых сертификатов и завершится ошибкой, если проверка не удастся. Тайм-аут можно задать с помощью параметра 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()

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

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

Добавлено в версии 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.

ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version=PROTOCOL_TLS, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True, ciphers=None)

Принимает экземпляр sock класса socket.socket и возвращает экземпляр ssl.SSLSocket — подкласса socket.socket, который оборачивает базовый сокет в контекст SSL. sock должен быть сокетом типа SOCK_STREAM; другие типы сокетов не поддерживаются.

Внутри функция создаёт SSLContext с протоколом ssl_version и устанавливает SSLContext.options в значение cert_reqs. Если заданы параметры keyfile, certfile, ca_certs или ciphers, их значения передаются в SSLContext.load_cert_chain(), SSLContext.load_verify_locations() и SSLContext.set_ciphers().

Аргументы server_side, do_handshake_on_connect и suppress_ragged_eofs имеют то же значение, что и в SSLContext.wrap_socket().

Устарело начиная с версии 3.7: Начиная с Python 3.2 и 2.7.9 рекомендуется использовать SSLContext.wrap_socket() вместо wrap_socket(). Функция верхнего уровня имеет ограничения и создаёт небезопасный клиентский сокет без индикации имени сервера и сопоставления имени хоста.

Константы

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

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

ssl.CERT_NONE

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

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

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

ssl.CERT_OPTIONAL

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

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

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

ssl.CERT_REQUIRED

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

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

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

class ssl.VerifyMode

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

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

ssl.VERIFY_DEFAULT

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

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

ssl.VERIFY_CRL_CHECK_LEAF

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

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

ssl.VERIFY_CRL_CHECK_CHAIN

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

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

ssl.VERIFY_X509_STRICT

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

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

ssl.VERIFY_ALLOW_PROXY_CERTS

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

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

ssl.VERIFY_X509_TRUSTED_FIRST

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

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

ssl.VERIFY_X509_PARTIAL_CHAIN

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

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

class ssl.VerifyFlags

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

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

ssl.PROTOCOL_TLS

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

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

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

ssl.PROTOCOL_TLS_CLIENT

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

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

ssl.PROTOCOL_TLS_SERVER

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

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

ssl.PROTOCOL_SSLv23

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

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

ssl.PROTOCOL_SSLv2

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

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

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

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

Устарело с версии 3.6: OpenSSL прекратил поддержку SSLv2.

ssl.PROTOCOL_SSLv3

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

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

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

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

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

ssl.PROTOCOL_TLSv1

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

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

ssl.PROTOCOL_TLSv1_1

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

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

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

ssl.PROTOCOL_TLSv1_2

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

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

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

ssl.OP_ALL

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

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

ssl.OP_NO_SSLv2

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

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

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

ssl.OP_NO_SSLv3

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

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

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

ssl.OP_NO_TLSv1

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

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

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

ssl.OP_NO_TLSv1_1

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

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

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

ssl.OP_NO_TLSv1_2

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

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

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

ssl.OP_NO_TLSv1_3

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

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

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

ssl.OP_NO_RENEGOTIATION

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

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

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

ssl.OP_CIPHER_SERVER_PREFERENCE

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

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

ssl.OP_SINGLE_DH_USE

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

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

ssl.OP_SINGLE_ECDH_USE

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

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

ssl.OP_ENABLE_MIDDLEBOX_COMPAT

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

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

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

ssl.OP_NO_COMPRESSION

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

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

class ssl.Options

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

ssl.OP_NO_TICKET

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

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

ssl.OP_IGNORE_UNEXPECTED_EOF

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

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

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

ssl.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.CHANNEL_BINDING_TYPES

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

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

ssl.OPENSSL_VERSION

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

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

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

ssl.OPENSSL_VERSION_INFO

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

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

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

ssl.OPENSSL_VERSION_NUMBER

Номер версии библиотеки OpenSSL в исходном виде, представлен в виде одного целого числа:

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

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

ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE
ssl.ALERT_DESCRIPTION_INTERNAL_ERROR
ALERT_DESCRIPTION_*

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

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

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

class ssl.AlertDescription

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

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

Purpose.SERVER_AUTH

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

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

Purpose.CLIENT_AUTH

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

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

class ssl.SSLErrorNumber

enum.IntEnum набор констант SSL_ERROR_*.

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

class ssl.TLSVersion

enum.IntEnum набор версий SSL и TLS для SSLContext.maximum_version и SSLContext.minimum_version.

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

TLSVersion.MINIMUM_SUPPORTED
TLSVersion.MAXIMUM_SUPPORTED

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

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

От SSL 3.0 до TLS 1.3.

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

SSL-сокеты

class ssl.SSLSocket(socket.socket)

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

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

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

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

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

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

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

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

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

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

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

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

Вызывает SSLWantReadError или SSLWantWriteError, если сокет является неблокирующим и чтение заблокировалось бы.

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

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

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

SSLSocket.write(buf)

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

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

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

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

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

Примечание

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

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

SSLSocket.do_handshake()

Выполняет установочное SSL-рукопожатие.

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

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

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

SSLSocket.getpeercert(binary_form=False)

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

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

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

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

Примечание

Чтобы проверить сертификат для конкретной службы, можно использовать функцию match_hostname().

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

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

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

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

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

SSLSocket.cipher()

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

SSLSocket.shared_ciphers()

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

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

SSLSocket.compression()

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

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

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

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

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

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

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

SSLSocket.selected_alpn_protocol()

Возвращает протокол, выбранный во время TLS-рукопожатия. Если не был вызван 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-сокет. Если SSL-сокет был создан с помощью устаревшей функции wrap_socket() (а не SSLContext.wrap_socket()), это пользовательский объект контекста, созданный для данного SSL-сокета.

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

SSLSocket.server_side

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

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

SSLSocket.server_hostname

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

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

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

SSLSocket.session

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

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

SSLSocket.session_reused

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

Контексты SSL

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

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

class ssl.SSLContext(protocol=None)

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

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

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

SSLv2

SSLv3

TLS [3]

TLSv1

TLSv1.1

TLSv1.2

SSLv2

да

нет

нет [1]

нет

нет

нет

SSLv3

нет

да

нет [2]

нет

нет

нет

TLS (SSLv23) [3]

нет [1]

нет [2]

да

да

да

да

TLSv1

нет

нет

да

да

нет

нет

TLSv1.1

нет

нет

да

нет

да

нет

TLSv1.2

нет

нет

да

нет

нет

да

Сноски

[1] (1,2)

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

[2] (1,2)

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

[3] (1,2)

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

См. также

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

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

Устарело с версии 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 1.2 в качестве минимальной версии TLS.

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

SSLContext.cert_store_stats()

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

Пример для контекста с одним сертификатом 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(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(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 указывает индикацию имени сервера. Механизм индикации имени сервера описан в RFC 6066, раздел 3 — индикация имени сервера.

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

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

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

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

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

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

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

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

SSLContext.set_servername_callback(server_name_callback)

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

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

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

SSLContext.load_dh_params(dhfile)

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

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

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

SSLContext.set_ecdh_curve(curve_name)

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

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

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

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

См. также

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

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

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

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

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

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

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

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

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

Параметр session см. в описании session.

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

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

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

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

SSLContext.sslsocket_class

Тип возвращаемого значения SSLContext.wrap_socket(); по умолчанию — SSLSocket. Атрибут можно переопределить в экземпляре класса, чтобы возвращать пользовательский подкласс 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_REQUIRED, если включена проверка имени узла, а verify_mode имеет значение CERT_NONE. Ранее такая операция приводила к ошибке 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, объединив их побитовой операцией OR.

Изменено в версии 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, объединив их побитовой операцией OR. По умолчанию 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>

Сертификаты

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

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

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

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

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

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

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

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

Сертификаты центров сертификации

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

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

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

-----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 — для передачи данных в обратном направлении.

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

  • context
  • server_side
  • server_hostname
  • session
  • session_reused
  • read()
  • write()
  • getpeercert()
  • 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.
  • В отличие от SSL-сокета, вызов метода unwrap() ничего не возвращает; SSL-сокет возвращает базовый сокет.
  • В качестве первого параметра обратный вызов server_name_callback, переданный в SSLContext.set_servername_callback(), получает экземпляр SSLObject, а не экземпляр SSLSocket.

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

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

Изменено в версии 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.

write_eof()

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

Сеанс 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(), соответствует требуемой службе. Во многих протоколах и приложениях службу можно идентифицировать по имени узла; в этом случае можно использовать функцию match_hostname(). Эта стандартная проверка выполняется автоматически, если включен параметр 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 подразумевает включение проверки сертификатов и имени узла по умолчанию. В контекст необходимо загрузить сертификаты.

Выбор шифров

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

Многопроцессорная обработка

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

TLS 1.3

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

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

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

См. также

Class socket.socket

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

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

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

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

Стив Кент

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

Дональд Э., Джеффри И. Шиллер

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

Д. Купер

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

Т. Диркс и др.

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

Д. Истлейк

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

IANA

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

IETF

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

Mozilla

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

Spec-Zone.ru

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