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

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


Этот модуль предоставляет доступ к средствам шифрования транспортного уровня безопасности (часто называемому «Secure Sockets Layer») и одноранговой аутентификации для сетевых сокетов, как на стороне клиента, так и на стороне сервера. В этом модуле используется библиотека OpenSSL. Он доступен на всех современных системах Unix, Windows, macOS и, возможно, на дополнительных платформах, при условии, что на этой платформе установлен OpenSSL.

Примечание

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

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

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

Availability: это не Emscripten, это был не я.

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

В этом разделе описываются объекты и функции модуля 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())

Пример серверного сокета, прослушивающего 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 с настройками по умолчанию для данной цели. Настройки выбираются модулем 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() чтобы загрузить сертификаты центра сертификации по умолчанию.

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

Примечание

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

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

Примечание

Если вы обнаружите, что когда некоторые старые клиенты или серверы пытаются подключиться с помощью SSLContext, созданного этой функцией, они получают сообщение об ошибке «Несоответствие протокола или набора шифров», возможно, они поддерживают только SSL3.0, который эта функция исключает, используя OP_NO_SSLv3. Широко распространено мнение, что SSL3.0 соответствует completely broken. Если вы все еще хотите продолжать использовать эту функцию, но по-прежнему разрешаете подключения по протоколу 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, созданный non-blocking SSL socket при попытке считывания или записи данных, но для выполнения запроса необходимо получить больше данных по базовому транспортному протоколу TCP, прежде чем запрос может быть выполнен.

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

exception ssl.SSLWantWriteError

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

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

exception ssl.SSLSyscallError

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

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

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

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

Прочтите статью в Википедии Cryptographically secure pseudorandom number generator (CSPRNG), чтобы ознакомиться с требованиями к криптографически стойкому генератору.

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

ssl.RAND_pseudo_bytes(num)

Return (байты, is_cryptographic): байты - это количество псевдослучайных байт, 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)

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

Изменено в версии 3.5: Теперь доступно для записи bytes-like object.

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

ssl.match_hostname(cert, hostname)

Убедитесь, что сертификат (в декодированном формате, возвращаемом SSLSocket.getpeercert()) соответствует заданному имени хоста. Применяются правила проверки подлинности HTTPS-серверов, описанные в разделах RFC 2818, RFC 5280 и RFC 6125. В дополнение к HTTPS, эта функция должна подходить для проверки подлинности серверов в различных протоколах на основе SSL, таких как FTPS, IMAP, 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: Теперь функция соответствует RFC 6125, раздел 6.4.3, и не соответствует ни нескольким подстановочным знакам (например, *.*.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, представляющей дату «не до» или «не после» из сертификата в формате "%b %d %H:%M:%S %Y %Z" strptime (язык Си).

Вот пример:

>>> 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

Даты «не до» или «не после» должны быть указаны по Гринвичу (RFC 5280).

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

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

Учитывая адрес addr сервера, защищенного SSL, в виде пары (имя хоста, номер порта), извлекает сертификат сервера и возвращает его в виде строки, закодированной в формате 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()

Возвращает именованный кортеж с путями к файлу cafe и capath OpenSSL по умолчанию. Пути такие же, как и в SSLContext.set_default_verify_paths(). Возвращаемое значение равно named tuple DefaultVerifyPaths:

  • cafile - заданный путь к файлу cafe или None, если файл не существует.,

  • capath - разрешенный путь к capath или None, если каталог не существует,

  • openssl_cafile_env - ключ среды OpenSSL, указывающий на файл cafe,

  • openssl_cafile - жестко заданный путь к файлу cafe,

  • openssl_capath_env - ключ среды OpenSSL, указывающий на capath,

  • openssl_capath - жестко заданный путь к каталогу capath

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

ssl.enum_certificates(store_name)

Извлеките сертификаты из системного хранилища сертификатов Windows. имя_хранилища может быть одним из 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. Доверие определяет назначение сертификата в виде набора 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)]

Availability: Окна.

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

ssl.enum_crls(store_name)

Извлеките CRL из хранилища системных сертификатов Windows. имя_хранилища может быть одним из 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.

Availability: Окна.

Добавлено в версии 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, который заключает базовый сокет в SSLContext. 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.

Для использования этого параметра требуется, чтобы был передан действительный набор сертификатов центра сертификации, либо в 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. Клиенту отправляется запрос на сертификат клиента, и клиент должен предоставить действительный и надежный сертификат.

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

class ssl.VerifyMode

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

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

ssl.VERIFY_DEFAULT

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

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

ssl.VERIFY_CRL_CHECK_LEAF

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

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

ssl.VERIFY_CRL_CHECK_CHAIN

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

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

ssl.VERIFY_X509_STRICT

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

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

ssl.VERIFY_ALLOW_PROXY_CERTS

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

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

ssl.VERIFY_X509_TRUSTED_FIRST

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

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

ssl.VERIFY_X509_PARTIAL_CHAIN

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

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

class ssl.VerifyFlags

enum.IntFlag набор констант VERIFY_*.

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

ssl.PROTOCOL_TLS

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

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

Не рекомендуется, начиная с версии 3.10: Для обеспечения безопасной связи клиентам и серверам TLS требуются разные настройки по умолчанию. Общая константа протокола TLS заменена на PROTOCOL_TLS_CLIENT и PROTOCOL_TLS_SERVER.

ssl.PROTOCOL_TLS_CLIENT

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

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

ssl.PROTOCOL_TLS_SERVER

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

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

ssl.PROTOCOL_SSLv23

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

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

ssl.PROTOCOL_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. Этот параметр установлен по умолчанию. Необязательно устанавливать те же флаги, что и в Openssl SSL_OP_ALL constant.

Добавлено в версии 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 и более ранних версиях. Не отправляйте сообщения с запросом приветствия и игнорируйте запросы на повторные переговоры через 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

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

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

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

ssl.OP_NO_COMPRESSION

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

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

class ssl.Options

enum.IntFlag набор констант OP_*.

ssl.OP_NO_TICKET

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

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

ssl.OP_IGNORE_UNEXPECTED_EOF

Игнорируйте неожиданное отключение TLS-соединений.

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

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

ssl.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 встроенную поддержку Следующего согласования протокола, как описано в Application Layer Protocol Negotiation. При значении true вы можете использовать метод 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 и других источников. В IANA TLS Alert Registry содержится этот список и ссылки на RFC, в которых определено их значение.

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

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

class ssl.AlertDescription

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

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

Purpose.SERVER_AUTH

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

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

Purpose.CLIENT_AUTH

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

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

class ssl.SSLErrorNumber

enum.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-сокеты предоставляют следующие методы получения Объекты сокета:

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

Экземпляры 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)

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

Поднимите SSLWantReadError или SSLWantWriteError, если сокет равен non-blocking, и чтение будет заблокировано.

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

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

Не рекомендуется, начиная с версии 3.6: Используйте recv() вместо read().

SSLSocket.write(buf)

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

Поднимите SSLWantReadError или SSLWantWriteError, если сокет равен non-blocking, и запись будет заблокирована.

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

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

Не рекомендуется, начиная с версии 3.6: Используйте send() вместо write().

Примечание

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

Обычно вы должны использовать методы socket 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.

SSLSocket.getpeercert(binary_form=False)

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

Если параметр binary_form равен False и сертификат был получен от однорангового узла, этот метод возвращает экземпляр dict. Если сертификат не был подтвержден, поле dict пусто. Если сертификат был подтвержден, он возвращает 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 и OCSP URI.

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

SSLSocket.cipher()

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

SSLSocket.shared_ciphers()

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

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

SSLSocket.compression()

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

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

Добавлено в версии 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 из базового сокета и возвращает базовый объект socket. Это может быть использовано для перехода от зашифрованной операции при подключении к незашифрованной. Возвращенный сокет всегда следует использовать для дальнейшей связи с другой стороной соединения, а не с исходным сокетом.

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

нет

нет

да

нет

нет

да

Сноски

См.также

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 без протокола считается устаревшим. В будущем для класса context потребуется либо протокол 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 может быть функцией, вызываемой для получения пароля для расшифровки закрытого ключа. Она будет вызвана только в том случае, если закрытый ключ зашифрован и требуется пароль. Он будет вызван без аргументов и должен возвращать строку, байты или bytearray. Если возвращаемое значение является строкой, оно будет закодировано как UTF-8, прежде чем использовать его для расшифровки ключа. В качестве альтернативы в качестве аргумента password может быть указано значение string, bytes или bytearray напрямую. Оно будет проигнорировано, если закрытый ключ не зашифрован и пароль не требуется.

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

Значение SSLError выдается, если закрытый ключ не совпадает с сертификатом.

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

SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)

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

Флаг назначение указывает, какие сертификаты 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 specific layout.

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

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

SSLContext.get_ca_certs(binary_form=False)

Получите список загруженных сертификатов «центра сертификации» (CA). Если параметр binary_form равен False, то каждая запись в списке представляет собой dict, аналогичный результату 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 cipher list format. Если ни один шифр не может быть выбран (поскольку параметры времени компиляции или другая конфигурация запрещают использование всех указанных шифров), будет поднят SSLError.

Примечание

при подключении метод SSL-сокетов SSLSocket.cipher() выдаст выбранный в данный момент шифр.

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

SSLContext.set_alpn_protocols(protocols)

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

Этот метод вызовет NotImplementedError, если HAS_ALPN равно False.

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

SSLContext.set_npn_protocols(protocols)

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

Этот метод вызовет NotImplementedError, если HAS_NPN равно False.

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

Не рекомендуется, начиная с версии 3.10: NPN был заменен на ALPN

SSLContext.sni_callback

Зарегистрируйте функцию обратного вызова, которая будет вызываться после получения SSL/TLS-сервером сообщения Hello handshake от клиента TLS, когда клиент TLS задает указание имени сервера. Механизм указания имени сервера указан в RFC 6066 разделе 3 «Указание имени сервера».

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

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

Типичным использованием этого обратного вызова является изменение атрибута ssl.SSLSocket SSLSocket.context на новый объект типа 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.

Этот метод вызовет NotImplementedError, если при сборке библиотеки OpenSSL был определен OPENSSL_NO_TLSEXT.

Добавлено в версии 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-соединение будет прервано с ALERT_DESCRIPTION_INTERNAL_ERROR фатальным предупреждающим сообщением TLS для клиента.

Добавлено в версии 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 & Perfect Forward Secrecy

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

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() для сокета. Для сокетов на стороне сервера, если у сокета нет удаленного однорангового узла, предполагается, что он является прослушивающим сокетом, и для клиентских подключений, принятых с помощью метода accept(), автоматически выполняется передача SSL на стороне сервера. Метод может вызывать SSLError.

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

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

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

сессия, смотрите session.

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

Изменено в версии 3.5: Всегда разрешайте передавать имя server_host, даже если у OpenSSL нет SNI.

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

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

SSLContext.sslsocket_class

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

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

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

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

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

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

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

SSLContext.sslobject_class

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

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

SSLContext.session_stats()

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

>>> 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 в файл keylog всякий раз, когда генерируется или принимается информация о ключах. Файл журнала ключей предназначен только для целей отладки. Формат файла определяется 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 и maximum_version, установленными в TLSVersion.TLSv1_2, не сможет установить соединение по протоколу TLS 1.2.

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

SSLContext.minimum_version

Например, SSLContext.maximum_version, за исключением того, что это самая низкая поддерживаемая версия или TLSVersion.MINIMUM_SUPPORTED.

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

SSLContext.num_tickets

Позволяет управлять количеством заявок на сеанс TLS 1.3 в контексте PROTOCOL_TLS_SERVER. Этот параметр не влияет на подключения по протоколам TLS 1.0-1.2.

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

SSLContext.options

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

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

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

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

SSLContext.post_handshake_auth

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

При включении сокетов на стороне клиента клиент сигнализирует серверу о том, что он поддерживает аутентификацию после подтверждения подлинности.

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

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

SSLContext.protocol

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

SSLContext.hostname_checks_common_name

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

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

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

SSLContext.security_level

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

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

SSLContext.verify_flags

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

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

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

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

Следует ли пытаться проверить сертификаты других партнеров и как вести себя в случае сбоя проверки. Этот атрибут должен быть одним из CERT_NONE, CERT_OPTIONAL или CERT_REQUIRED.

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

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

Сертификаты

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

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

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

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

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

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

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

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

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

Если вы собираетесь запросить подтверждение сертификата другой стороны соединения, вам необходимо предоставить файл «CA 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")

(в этом фрагменте предполагается, что ваша операционная система помещает пакет всех сертификатов CA в /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

И возвращайтесь к прослушиванию новых клиентских подключений (конечно, реальный сервер, вероятно, обрабатывал бы каждое клиентское подключение в отдельном потоке или помещал бы сокеты в non-blocking mode и использовал цикл обработки событий).

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

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 поддерживает non-blocking SSL sockets и предоставляет API более высокого уровня. Он опрашивает события с помощью модуля selectors и обрабатывает исключения SSLWantWriteError, SSLWantReadError и BlockingIOError. Он также выполняет подтверждение SSL асинхронно.

Биологическая поддержка памяти

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

С тех пор как модуль SSL был представлен в Python 2.6, класс SSLSocket предоставляет две взаимосвязанные, но различные функциональные области:

  • Обработка протокола SSL

  • Сетевой ввод-вывод

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

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

class ssl.SSLObject

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

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

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

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

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

  • Любая форма сетевого ввода-вывода; recv() и send() считываются и записываются только в базовые MemoryBIO буферы.

  • Здесь нет механизма do_handshake_on_connect. Вы всегда должны вручную вызывать do_handshake(), чтобы начать обмен данными.

  • Не выполняется обработка suppress_ragged_eofs. Все условия завершения файла, которые нарушают протокол, сообщаются с помощью исключения SSLEOFError.

  • Вызов метода unwrap() ничего не возвращает, в отличие от SSL-сокета, где он возвращает базовый сокет.

  • Обратный вызов server_name_callback, переданный в SSLContext.set_servername_callback(), получит экземпляр SSLObject вместо экземпляра SSLSocket в качестве своего первого параметра.

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

  • Все операции ввода-вывода для SSLObject равны non-blocking. Это означает, что, например, read() вызовет SSLWantReadError, если потребуется больше данных, чем доступно для входящей биографии.

  • Здесь нет вызова wrap_bio() на уровне модуля, как для wrap_socket(). SSLObject всегда создается с помощью SSLContext.

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

Объект SSL взаимодействует с внешним миром с помощью буферов памяти. Класс MemoryBIO предоставляет буфер памяти, который можно использовать для этой цели. Он обертывает объект OpenSSL memory BIO (базовый ввод-вывод):

class ssl.MemoryBIO

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

pending

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

eof

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

read(n=-1)

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

write(buf)

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

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

write_eof()

Запишите маркер EOF в память 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 о cipher list format. Если вы хотите проверить, какие шифры включены в данный список шифров, используйте команду SSLContext.get_ciphers() или команду openssl ciphers в вашей системе.

Мультипроцессорная обработка

Если вы используете этот модуль как часть многопроцессорного приложения (например, используя модули multiprocessing или concurrent.futures), имейте в виду, что внутренний генератор случайных чисел OpenSSL неправильно обрабатывает разветвленные процессы. Приложения должны изменять состояние PRNG родительского процесса, если они используют какую-либо функцию 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, настройка алгоритма подписи и повторный ввод данных, пока не поддерживаются.

Вернуться на верх