ssl.md
1> **Источник:** https://python-all.ru/3.11/library/ssl.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`ssl`](https://python-all.ru/3.11/library/ssl.html#module-ssl) – обёртка TLS/SSL для сокетов89**Исходный код:** [Lib/ssl.py](https://python-all.ru/src/3.11/Lib/ssl.py)1011---1213Этот модуль предоставляет доступ к шифрованию по протоколу безопасности транспортного уровня (часто называемому "Secure Sockets Layer") и средствам проверки подлинности одноранговых узлов для сетевых сокетов как на стороне клиента, так и на стороне сервера. Модуль использует библиотеку OpenSSL. Он доступен на всех современных системах Unix, Windows, macOS и, вероятно, на других платформах, при условии, что на них установлена OpenSSL.1415> **Примечание**16>17> Некоторые особенности поведения могут зависеть от платформы, поскольку используются системные API сокетов. Установленная версия OpenSSL также может влиять на поведение. Например, TLSv1.3 доступен в OpenSSL версии 1.1.1.1819> **Предупреждение**20>21> Не следует использовать этот модуль без ознакомления с [рекомендациями по безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security). В противном случае может возникнуть ложное ощущение безопасности, поскольку настройки по умолчанию модуля ssl не обязательно подходят для конкретного приложения.2223[Доступность](https://python-all.ru/3.11/library/intro.html#availability): not Emscripten, not WASI.2425Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.11/library/intro.html#wasm-availability) для получения дополнительной информации.2627В этом разделе описываются объекты и функции модуля `ssl`; более общую информацию о TLS, SSL и сертификатах можно найти в документах, перечисленных в разделе «См. также» внизу.2829Этот модуль предоставляет класс [`ssl.SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), производный от типа [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket), и предоставляет обёртку, подобную сокету, которая также шифрует и расшифровывает данные, передаваемые через сокет, с помощью SSL. Он поддерживает дополнительные методы, такие как `getpeercert()`, который извлекает сертификат другой стороны соединения, и `cipher()`, который извлекает шифр, используемый для защищённого соединения.3031Для более сложных приложений класс [`ssl.SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) помогает управлять настройками и сертификатами, которые затем могут наследоваться SSL-сокетами, созданными через метод [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket).3233Изменено в версии 3.5.3: Обновлено для поддержки связывания с OpenSSL 1.1.03435Изменено в версии 3.6: OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль ssl потребует как минимум OpenSSL 1.0.2 или 1.1.0.3637Изменено в версии 3.10: [**PEP 644**](https://python-all.ru/3.11/library/ssl.html) реализован. Модуль ssl требует OpenSSL 1.1.1 или новее.3839Использование устаревших констант и функций приводит к предупреждениям об устаревании.4041## Функции, константы и исключения4243### Создание сокетов4445Начиная с Python 3.2 и 2.7.9, рекомендуется использовать [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket) экземпляра [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) для обёртывания сокетов в объекты [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket). Вспомогательная функция [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) возвращает новый контекст с безопасными настройками по умолчанию. Старая функция [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket) устарела, так как она неэффективна и не поддерживает указание имени сервера (SNI) и проверку имени хоста.4647Пример клиентского сокета с контекстом по умолчанию и двойным стеком IPv4/IPv6:4849```python50import socket51import ssl5253hostname = 'www.python.org'54context = ssl.create_default_context()5556with socket.create_connection((hostname, 443)) as sock:57 with context.wrap_socket(sock, server_hostname=hostname) as ssock:58 print(ssock.version())59```6061Пример клиентского сокета с пользовательским контекстом и IPv4:6263```python64hostname = 'www.python.org'65# PROTOCOL_TLS_CLIENT требует правильной цепочки сертификатов и имени хоста66context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)67context.load_verify_locations('path/to/cabundle.pem')6869with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:70 with context.wrap_socket(sock, server_hostname=hostname) as ssock:71 print(ssock.version())72```7374Пример серверного сокета, прослушивающего localhost IPv4:7576```python77context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)78context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')7980with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:81 sock.bind(('127.0.0.1', 8443))82 sock.listen(5)83 with context.wrap_socket(sock, server_side=True) as ssock:84 conn, addr = ssock.accept()85 ...86```8788### Создание контекста8990Вспомогательная функция помогает создавать объекты [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) для распространённых целей.9192#### `ssl.create_default_context(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)`9394Возвращает новый объект [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) с настройками по умолчанию для указанного *назначения*. Настройки выбираются модулем [`ssl`](https://python-all.ru/3.11/library/ssl.html#module-ssl) и обычно представляют более высокий уровень безопасности, чем при непосредственном вызове конструктора [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext).9596*cafile*, *capath*, *cadata* представляют необязательные сертификаты ЦС, которым следует доверять при проверке сертификатов, как в [`SSLContext.load_verify_locations()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_verify_locations). Если все три равны [`None`](https://python-all.ru/3.11/library/constants.html#None), эта функция может вместо этого доверять системным сертификатам ЦС по умолчанию.9798Настройки: [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) или [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER), [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2) и [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3) с наборами шифров высокой стойкости без RC4 и без неаутентифицированных наборов шифров. Передача [`SERVER_AUTH`](https://python-all.ru/3.11/library/ssl.html#ssl.Purpose.SERVER_AUTH) в качестве *назначения* устанавливает [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) в [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) и либо загружает сертификаты ЦС (если указан хотя бы один из *cafile*, *capath* или *cadata*), либо использует [`SSLContext.load_default_certs()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_default_certs) для загрузки сертификатов ЦС по умолчанию.99100Если [`keylog_filename`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.keylog_filename) поддерживается и установлена переменная окружения `SSLKEYLOGFILE`, [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) включает запись ключей.101102> **Примечание**103>104> Протокол, параметры, шифр и другие настройки могут в любой момент измениться на более строгие значения без предварительного уведомления об устаревании. Эти значения представляют собой разумный баланс между совместимостью и безопасностью.105>106> Если приложению требуются особые настройки, нужно создать [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) и применить их самостоятельно.107108> **Примечание**109>110> Если при попытке некоторых старых клиентов или серверов подключиться с помощью [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext), созданного этой функцией, возникает ошибка «Несовпадение протокола или набора шифров», возможно, они поддерживают только SSL 3.0, который эта функция исключает с помощью [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3). SSL 3.0 общепризнанно [полностью скомпрометирован](https://python-all.ru/3.11/library/ssl.html). Если всё же необходимо продолжить использование этой функции, но при этом разрешить подключения SSL 3.0, можно снова включить их с помощью:111>112> ```python113> ctx = ssl.create_default_context(Purpose.CLIENT_AUTH)114> ctx.options &= ~ssl.OP_NO_SSLv3115> ```116117Новое в версии 3.4.118119Изменено в версии 3.4.4: RC4 был удалён из строки шифров по умолчанию.120121Изменено в версии 3.6: ChaCha20/Poly1305 был добавлен в строку шифров по умолчанию.1221233DES был удалён из строки шифров по умолчанию.124125Изменено в версии 3.8: Добавлена поддержка логирования ключей в `SSLKEYLOGFILE`.126127Изменено в версии 3.10: Контекст теперь использует протокол [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) или [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER) вместо общего [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS).128129### Исключения130131#### `exception ssl.SSLError`132133Возникает при ошибке в базовой реализации SSL (в настоящее время предоставляемой библиотекой OpenSSL). Это указывает на проблемы в высокоуровневом уровне шифрования и аутентификации, наложенном на нижележащее сетевое соединение. Эта ошибка является подтипом [`OSError`](https://python-all.ru/3.11/library/exceptions.html#OSError). Код ошибки и сообщение экземпляров [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError) предоставляются библиотекой OpenSSL.134135Изменено в версии 3.3: [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError) ранее был подтипом [`socket.error`](https://python-all.ru/3.11/library/socket.html#socket.error).136137#### `library`138139Строковый мнемонический код, обозначающий подмодуль OpenSSL, в котором произошла ошибка, например `SSL`, `PEM` или `X509`. Набор возможных значений зависит от версии OpenSSL.140141Новое в версии 3.3.142143#### `reason`144145Строковый мнемонический код, обозначающий причину этой ошибки, например `CERTIFICATE_VERIFY_FAILED`. Набор возможных значений зависит от версии OpenSSL.146147Новое в версии 3.3.148149#### `exception ssl.SSLZeroReturnError`150151Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый при попытке чтения или записи, когда SSL-соединение было корректно закрыто. Обратите внимание, что это не означает, что нижележащий транспорт (например, TCP) был закрыт.152153Новое в версии 3.3.154155#### `exception ssl.SSLWantReadError`156157Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый [неблокирующим SSL-сокетом](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) при попытке чтения или записи данных, но для выполнения запроса необходимо получить больше данных по нижележащему TCP-транспорту.158159Новое в версии 3.3.160161#### `exception ssl.SSLWantWriteError`162163Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый [неблокирующим SSL-сокетом](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) при попытке чтения или записи данных, но для выполнения запроса необходимо отправить больше данных по нижележащему TCP-транспорту.164165Новое в версии 3.3.166167#### `exception ssl.SSLSyscallError`168169Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый при возникновении системной ошибки во время выполнения операции с SSL-сокетом. К сожалению, нет простого способа узнать исходный номер errno.170171Новое в версии 3.3.172173#### `exception ssl.SSLEOFError`174175Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый при внезапном завершении SSL-соединения. Обычно не следует пытаться повторно использовать нижележащий транспорт при возникновении этой ошибки.176177Новое в версии 3.3.178179#### `exception ssl.SSLCertVerificationError`180181Подкласс [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), возбуждаемый при неудачной проверке сертификата.182183Добавлено в версии 3.7.184185#### `verify_code`186187Числовой код ошибки, обозначающий ошибку проверки.188189#### `verify_message`190191Человекочитаемая строка с описанием ошибки проверки.192193#### `exception ssl.CertificateError`194195Псевдоним для [`SSLCertVerificationError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLCertVerificationError).196197Изменено в версии 3.7: Это исключение теперь является псевдонимом для [`SSLCertVerificationError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLCertVerificationError).198199### Генерация случайных чисел200201#### `ssl.RAND_bytes(num)`202203Возвращает *num* криптостойких псевдослучайных байт. Вызывает исключение [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), если ГПСЧ (PRNG) не был инициализирован достаточным количеством данных или если операция не поддерживается текущим методом RAND. [`RAND_status()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_status) можно использовать для проверки состояния ГПСЧ, а [`RAND_add()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_add) – для его инициализации.204205Для практически всех приложений предпочтительнее использовать [`os.urandom()`](https://python-all.ru/3.11/library/os.html#os.urandom).206207Прочитайте статью в Википедии [Криптостойкий генератор псевдослучайных чисел (CSPRNG)](https://python-all.ru/3.11/library/ssl.html), чтобы узнать требования к криптостойкому генератору.208209Новое в версии 3.3.210211#### `ssl.RAND_pseudo_bytes(num)`212213Возвращает (bytes, is\_cryptographic): bytes – это *num* псевдослучайных байтов, is\_cryptographic равно `True`, если сгенерированные байты являются криптостойкими. Вызывает [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), если операция не поддерживается текущим методом RAND.214215Сгенерированные последовательности псевдослучайных байтов будут уникальными, если они имеют достаточную длину, но не обязательно непредсказуемы. Их можно использовать для некриптографических целей и для некоторых целей в криптографических протоколах, но обычно не для генерации ключей и т.д.216217Для практически всех приложений предпочтительнее использовать [`os.urandom()`](https://python-all.ru/3.11/library/os.html#os.urandom).218219Новое в версии 3.3.220221Устарело с версии 3.6: OpenSSL объявил устаревшим [`ssl.RAND_pseudo_bytes()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_pseudo_bytes), используйте [`ssl.RAND_bytes()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_bytes) вместо него.222223#### `ssl.RAND_status()`224225Возвращает `True`, если ГПСЧ (псевдослучайный генератор чисел) SSL был инициализирован достаточным количеством случайных данных, и `False` в противном случае. Можно использовать `ssl.RAND_egd()` и [`ssl.RAND_add()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_add) для увеличения случайности генератора псевдослучайных чисел.226227#### `ssl.RAND_add(bytes, entropy)`228229Смешивает заданные *bytes* (байты) с генератором псевдослучайных чисел SSL. Параметр *entropy* (число с плавающей точкой) задаёт нижнюю границу энтропии, содержащейся в строке (поэтому всегда можно использовать `0.0`). См. [**RFC 1750**](https://python-all.ru/3.11/library/ssl.html) для получения дополнительной информации об источниках энтропии.230231Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.11/glossary.html#term-bytes-like-object).232233### Обработка сертификатов234235#### `ssl.match_hostname(cert, hostname)`236237Проверяет, что *cert* (в декодированном формате, возвращаемом [`SSLSocket.getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert)) соответствует заданному *hostname*. Применяются правила проверки идентичности HTTPS-серверов, описанные в [**RFC 2818**](https://python-all.ru/3.11/library/ssl.html), [**RFC 5280**](https://python-all.ru/3.11/library/ssl.html) и [**RFC 6125**](https://python-all.ru/3.11/library/ssl.html). Кроме HTTPS, эта функция подходит для проверки идентичности серверов в различных протоколах на основе SSL, таких как FTPS, IMAPS, POPS и других.238239[`CertificateError`](https://python-all.ru/3.11/library/ssl.html#ssl.CertificateError) возбуждается при неудаче. При успехе функция не возвращает ничего:240241```python242>>> cert = {'subject': ((('commonName', 'example.com'),),)}243>>> ssl.match_hostname(cert, "example.com")244>>> ssl.match_hostname(cert, "example.org")245Traceback (most recent call last):246 File "<stdin>", line 1, in <module>247 File "/home/py3k/Lib/ssl.py", line 130, in match_hostname248ssl.CertificateError: hostname 'example.org' doesn't match 'example.com'249```250251Новое в версии 3.2.252253Изменено в версии 3.3.3: Теперь функция следует [**RFC 6125**](https://python-all.ru/3.11/library/ssl.html), разделу 6.4.3 и не соответствует ни множественным подстановочным знакам (например, `*.*.com` или `*a*.example.org`), ни подстановочному знаку внутри фрагмента интернационализированного доменного имени (IDN). IDN A-метки, такие как `www*.xn--pthon-kva.org`, по-прежнему поддерживаются, но `x*.python.org` больше не соответствует `xn--tda.python.org`.254255Изменено в версии 3.5: Теперь поддерживается сопоставление IP-адресов, если они присутствуют в поле subjectAltName сертификата.256257Изменено в версии 3.7: Эта функция больше не используется для TLS-соединений. Проверка имени хоста теперь выполняется OpenSSL.258259Разрешает подстановочный знак, только если он находится самым левым и единственным символом в этом сегменте. Частичные подстановочные знаки, такие как `www*.example.com`, больше не поддерживаются.260261Устарело с версии 3.7.262263#### `ssl.cert_time_to_seconds(cert_time)`264265Возвращает время в секундах с начала эпохи (Epoch), используя строку `cert_time` представляющую дату “notBefore” или “notAfter” из сертификата в формате `"%b %d %H:%M:%S %Y %Z"` strptime (локаль C).266267Вот пример:268269```pycon270>>> import ssl271>>> timestamp = ssl.cert_time_to_seconds("Jan 5 09:34:43 2018 GMT")272>>> timestamp 2731515144883274>>> from datetime import datetime275>>> print(datetime.utcfromtimestamp(timestamp)) 2762018-01-05 09:34:43277```278279Даты “notBefore” or “notAfter” должны использовать GMT ([**RFC 5280**](https://python-all.ru/3.11/library/ssl.html)).280281Изменено в версии 3.5: Входное время теперь интерпретируется как время в UTC, как указано часовым поясом 'GMT' во входной строке. Ранее использовался местный часовой пояс. Возвращает целое число (во входном формате нет долей секунды).282283#### `ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout])`284285По адресу `addr` SSL-защищённого сервера, заданному в виде пары (*имя хоста*, *порт*), получает сертификат сервера и возвращает его в виде строки в формате PEM. Если указан `ssl_version`, используется эта версия протокола SSL для попытки подключения к серверу. Если указан `ca_certs`, это должен быть файл со списком корневых сертификатов, в том же формате, что и для одноимённого параметра в [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket). Вызов попытается проверить сертификат сервера по этому набору корневых сертификатов; если проверка не удастся, вызов завершится ошибкой. Тайм-аут можно задать с помощью параметра `timeout`.286287Изменено в версии 3.3: Эта функция теперь совместима с IPv6.288289Изменено в версии 3.5: Значение по умолчанию *ssl\_version* изменено с [`PROTOCOL_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv3) на [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS) для максимальной совместимости с современными серверами.290291Изменено в версии 3.10: Добавлен параметр *timeout*.292293#### `ssl.DER_cert_to_PEM_cert(DER_cert_bytes)`294295Принимая сертификат в виде набора байтов в кодировке DER, возвращает версию того же сертификата в виде строки в кодировке PEM.296297#### `ssl.PEM_cert_to_DER_cert(PEM_cert_string)`298299Принимая сертификат в виде строки ASCII в формате PEM, возвращает последовательность байтов в кодировке DER для того же сертификата.300301#### `ssl.get_default_verify_paths()`302303Возвращает именованный кортеж с путями к файлу cafile и каталогу capath OpenSSL по умолчанию. Эти пути совпадают с используемыми в [`SSLContext.set_default_verify_paths()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_default_verify_paths). Возвращаемое значение – это [именованный кортеж](https://python-all.ru/3.11/glossary.html#term-named-tuple) `DefaultVerifyPaths`:304305- `cafile` – разрешённый (абсолютный) путь к cafile или `None`, если файл не существует,306- `capath` – разрешённый путь к capath или `None`, если каталог не существует,307- `openssl_cafile_env` – переменная окружения OpenSSL, указывающая на cafile,308- `openssl_cafile` – жёстко заданный путь к cafile,309- `openssl_capath_env` – переменная окружения OpenSSL, указывающая на capath,310- `openssl_capath` – жёстко заданный путь к каталогу capath311312Новое в версии 3.4.313314#### `ssl.enum_certificates(store_name)`315316Извлекает сертификаты из системного хранилища сертификатов Windows. *store\_name* может быть одним из `CA`, `ROOT` или `MY`. Windows также может предоставлять дополнительные хранилища сертификатов.317318Функция возвращает список кортежей (cert\_bytes, encoding\_type, trust). Параметр encoding\_type задаёт кодировку cert\_bytes. Это может быть `x509_asn` для данных X.509 ASN.1 или `pkcs_7_asn` для данных PKCS#7 ASN.1. Параметр trust определяет назначение сертификата в виде набора OID или точно `True`, если сертификат считается надёжным для всех целей.319320Пример:321322```python323>>> ssl.enum_certificates("CA")324[(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}),325 (b'data...', 'x509_asn', True)]326```327328[Доступность](https://python-all.ru/3.11/library/intro.html#availability): Windows.329330Новое в версии 3.4.331332#### `ssl.enum_crls(store_name)`333334Извлекает CRL из системного хранилища сертификатов Windows. *store\_name* может быть одним из `CA`, `ROOT` или `MY`. Windows также может предоставлять дополнительные хранилища сертификатов.335336Функция возвращает список кортежей (cert\_bytes, encoding\_type, trust). Параметр encoding\_type задаёт кодировку cert\_bytes. Это может быть `x509_asn` для данных X.509 ASN.1 или `pkcs_7_asn` для данных PKCS#7 ASN.1.337338[Доступность](https://python-all.ru/3.11/library/intro.html#availability): Windows.339340Новое в версии 3.4.341342#### `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)`343344Принимает экземпляр `sock` класса [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket) и возвращает экземпляр [`ssl.SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), подтипа [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket), который оборачивает базовый сокет в контекст SSL. `sock` должен быть сокетом [`SOCK_STREAM`](https://python-all.ru/3.11/library/socket.html#socket.SOCK_STREAM); другие типы сокетов не поддерживаются.345346Внутри функция создаёт [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) с протоколом *ssl\_version* и [`SSLContext.options`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.options), установленным в *cert\_reqs*. Если заданы параметры *keyfile*, *certfile*, *ca\_certs* или *ciphers*, то значения передаются в [`SSLContext.load_cert_chain()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_cert_chain), [`SSLContext.load_verify_locations()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_verify_locations) и [`SSLContext.set_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_ciphers).347348Аргументы *server\_side*, *do\_handshake\_on\_connect* и *suppress\_ragged\_eofs* имеют тот же смысл, что и [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket).349350Устарело с версии 3.7: Начиная с Python 3.2 и 2.7.9, рекомендуется использовать [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket) вместо [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket). Эта функция верхнего уровня ограничена и создаёт небезопасный клиентский сокет без указания имени сервера или проверки имени хоста.351352### Константы353354> Все константы теперь являются коллекциями [`enum.IntEnum`](https://python-all.ru/3.11/library/enum.html#enum.IntEnum) или [`enum.IntFlag`](https://python-all.ru/3.11/library/enum.html#enum.IntFlag).355>356> Новое в версии 3.6.357358#### `ssl.CERT_NONE`359360Возможное значение для [`SSLContext.verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) или параметра `cert_reqs` в [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket). За исключением [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) это режим по умолчанию. Для клиентских сокетов принимается практически любой сертификат. Ошибки проверки, такие как ненадёжный или просроченный сертификат, игнорируются и не прерывают рукопожатие TLS/SSL.361362В серверном режиме сертификат у клиента не запрашивается, поэтому клиент не отправляет его для аутентификации по клиентскому сертификату.363364См. обсуждение [соображений безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) ниже.365366#### `ssl.CERT_OPTIONAL`367368Возможное значение для [`SSLContext.verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) или параметра `cert_reqs` в [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket). В клиентском режиме [`CERT_OPTIONAL`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_OPTIONAL) имеет то же значение, что и [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED). Рекомендуется использовать [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) для клиентских сокетов.369370В серверном режиме клиенту отправляется запрос клиентского сертификата. Клиент может либо проигнорировать запрос, либо отправить сертификат для выполнения аутентификации по клиентскому сертификату TLS. Если клиент решает отправить сертификат, он проверяется. Любая ошибка проверки немедленно прерывает рукопожатие TLS.371372Использование этой настройки требует передачи действительного набора сертификатов ЦС: либо в [`SSLContext.load_verify_locations()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_verify_locations), либо в качестве значения параметра `ca_certs` для [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket).373374#### `ssl.CERT_REQUIRED`375376Возможное значение для [`SSLContext.verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) или параметра `cert_reqs` в [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket). В этом режиме сертификат требуется от другой стороны сокетного соединения; будет возбуждено [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), если сертификат не предоставлен или его проверка не удалась. Этот режим **не** достаточен для проверки сертификата в клиентском режиме, поскольку не выполняется сопоставление имён хостов. [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) также должен быть включён для проверки подлинности сертификата. [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) использует [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) и по умолчанию включает [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname).377378В серверном сокете этот режим обеспечивает обязательную аутентификацию по клиентскому сертификату TLS. Клиенту отправляется запрос клиентского сертификата, и клиент должен предоставить действительный и надёжный сертификат.379380Использование этой настройки требует передачи действительного набора сертификатов ЦС: либо в [`SSLContext.load_verify_locations()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_verify_locations), либо в качестве значения параметра `ca_certs` для [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket).381382#### `class ssl.VerifyMode`383384Коллекция [`enum.IntEnum`](https://python-all.ru/3.11/library/enum.html#enum.IntEnum) констант CERT\_\*.385386Новое в версии 3.6.387388#### `ssl.VERIFY_DEFAULT`389390Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags). В этом режиме списки отзыва сертификатов (CRL) не проверяются. По умолчанию OpenSSL не требует и не проверяет CRL.391392Новое в версии 3.4.393394#### `ssl.VERIFY_CRL_CHECK_LEAF`395396Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags). В этом режиме проверяется только сертификат однорангового узла, но ни один из промежуточных сертификатов ЦС. Режим требует действительного CRL, подписанного эмитентом сертификата однорангового узла (его прямым вышестоящим ЦС). Если подходящий CRL не был загружен с помощью [`SSLContext.load_verify_locations`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_verify_locations), проверка не удастся.397398Новое в версии 3.4.399400#### `ssl.VERIFY_CRL_CHECK_CHAIN`401402Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags). В этом режиме проверяются CRL всех сертификатов в цепочке сертификата однорангового узла.403404Новое в версии 3.4.405406#### `ssl.VERIFY_X509_STRICT`407408Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags) для отключения обходных путей для повреждённых сертификатов X.509.409410Новое в версии 3.4.411412#### `ssl.VERIFY_ALLOW_PROXY_CERTS`413414Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags) для включения проверки прокси-сертификатов.415416Новое в версии 3.10.417418#### `ssl.VERIFY_X509_TRUSTED_FIRST`419420Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags). Оно указывает OpenSSL отдавать предпочтение доверенным сертификатам при построении цепочки доверия для проверки сертификата. Этот флаг включён по умолчанию.421422Новое в версии 3.4.4.423424#### `ssl.VERIFY_X509_PARTIAL_CHAIN`425426Возможное значение для [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags). Оно указывает OpenSSL принимать промежуточные УЦ в хранилище доверенных сертификатов как доверенные якоря, так же как и самоподписанные корневые сертификаты УЦ. Это позволяет доверять сертификатам, выпущенным промежуточным УЦ, без необходимости доверять его вышестоящему корневому УЦ.427428Новое в версии 3.10.429430#### `class ssl.VerifyFlags`431432[`enum.IntFlag`](https://python-all.ru/3.11/library/enum.html#enum.IntFlag) набор констант VERIFY\_\*.433434Новое в версии 3.6.435436#### `ssl.PROTOCOL_TLS`437438Выбирает самую высокую версию протокола, поддерживаемую как клиентом, так и сервером. Несмотря на название, эта опция может выбирать как протокол «SSL», так и «TLS».439440Новое в версии 3.6.441442Устарело с версии 3.10: TLS-клиенты и серверы требуют разных настроек по умолчанию для безопасной связи. Общая константа протокола TLS устарела в пользу [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER).443444#### `ssl.PROTOCOL_TLS_CLIENT`445446Автоматически согласовывает самую высокую версию протокола, поддерживаемую как клиентом, так и сервером, и настраивает контекст для соединений на стороне клиента. Данный протокол по умолчанию включает [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) и [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname).447448Новое в версии 3.6.449450#### `ssl.PROTOCOL_TLS_SERVER`451452Автоматически согласовывает самую высокую версию протокола, поддерживаемую как клиентом, так и сервером, и настраивает контекст для соединений на стороне сервера.453454Новое в версии 3.6.455456#### `ssl.PROTOCOL_SSLv23`457458Псевдоним для [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS).459460Устарело с версии 3.6: Используйте [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS) вместо.461462#### `ssl.PROTOCOL_SSLv2`463464Выбирает SSL версии 2 в качестве протокола шифрования канала.465466Этот протокол недоступен, если OpenSSL скомпилирован с опцией `no-ssl2`.467468> **Предупреждение**469>470> SSL версии 2 небезопасен. Его использование крайне не рекомендуется.471472Устарело с версии 3.6: OpenSSL убрал поддержку SSLv2.473474#### `ssl.PROTOCOL_SSLv3`475476Выбирает SSL версии 3 в качестве протокола шифрования канала.477478Этот протокол недоступен, если OpenSSL скомпилирован с опцией `no-ssl3`.479480> **Предупреждение**481>482> SSL версии 3 небезопасен. Его использование крайне не рекомендуется.483484Устарело с версии 3.6: OpenSSL объявил устаревшими все версионно-зависимые протоколы. Используйте протокол по умолчанию [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER) или [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) с [`SSLContext.minimum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.minimum_version) и [`SSLContext.maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version) вместо.485486#### `ssl.PROTOCOL_TLSv1`487488Выбирает TLS версии 1.0 в качестве протокола шифрования канала.489490Устарело с версии 3.6: OpenSSL объявил устаревшими все версионно-зависимые протоколы.491492#### `ssl.PROTOCOL_TLSv1_1`493494Выбирает TLS версии 1.1 в качестве протокола шифрования канала. Доступно только в openssl версии 1.0.1+.495496Новое в версии 3.4.497498Устарело с версии 3.6: OpenSSL объявил устаревшими все версионно-зависимые протоколы.499500#### `ssl.PROTOCOL_TLSv1_2`501502Выбирает TLS версии 1.2 в качестве протокола шифрования канала. Доступно только в openssl версии 1.0.1+.503504Новое в версии 3.4.505506Устарело с версии 3.6: OpenSSL объявил устаревшими все версионно-зависимые протоколы.507508#### `ssl.OP_ALL`509510Включает обходные пути для различных ошибок, присутствующих в других реализациях SSL. Эта опция включена по умолчанию. Она не обязательно устанавливает те же флаги, что и константа `SSL_OP_ALL` от OpenSSL.511512Новое в версии 3.2.513514#### `ssl.OP_NO_SSLv2`515516Предотвращает подключение по SSLv2. Эта опция применима только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Она не позволяет сторонам выбирать SSLv2 в качестве версии протокола.517518Новое в версии 3.2.519520Устарело с версии 3.6: SSLv2 устарел521522#### `ssl.OP_NO_SSLv3`523524Предотвращает подключение по SSLv3. Этот параметр применим только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Он не позволяет участникам выбирать SSLv3 в качестве версии протокола.525526Новое в версии 3.2.527528Устарело с версии 3.6: SSLv3 устарел529530#### `ssl.OP_NO_TLSv1`531532Предотвращает подключение по TLSv1. Этот параметр применим только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Он не позволяет участникам выбирать TLSv1 в качестве версии протокола.533534Новое в версии 3.2.535536Устарело с версии 3.7: Этот параметр устарел начиная с OpenSSL 1.1.0, используйте новые [`SSLContext.minimum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.minimum_version) и [`SSLContext.maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version) вместо них.537538#### `ssl.OP_NO_TLSv1_1`539540Предотвращает подключение по TLSv1.1. Этот параметр применим только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Он не позволяет участникам выбирать TLSv1.1 в качестве версии протокола. Доступно только для OpenSSL версии 1.0.1 и выше.541542Новое в версии 3.4.543544Устарело с версии 3.7: Этот параметр устарел начиная с OpenSSL 1.1.0.545546#### `ssl.OP_NO_TLSv1_2`547548Предотвращает подключение по TLSv1.2. Этот параметр применим только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Он не позволяет участникам выбирать TLSv1.2 в качестве версии протокола. Доступно только для OpenSSL версии 1.0.1 и выше.549550Новое в версии 3.4.551552Устарело с версии 3.7: Этот параметр устарел начиная с OpenSSL 1.1.0.553554#### `ssl.OP_NO_TLSv1_3`555556Предотвращает подключение по TLSv1.3. Этот параметр применим только в сочетании с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS). Он не позволяет участникам выбирать TLSv1.3 в качестве версии протокола. TLS 1.3 доступен начиная с OpenSSL 1.1.1. Если Python был собран с более старой версией OpenSSL, этот флаг по умолчанию равен *0*.557558Новое в версии 3.6.3.559560Устарело с версии 3.7: Этот параметр устарел начиная с OpenSSL 1.1.0. Он был добавлен в версии 2.7.15 и 3.6.3 для обратной совместимости с OpenSSL 1.0.2.561562#### `ssl.OP_NO_RENEGOTIATION`563564Отключает любое пересогласование в TLSv1.2 и более ранних версиях. Не отправляет сообщения HelloRequest и игнорирует запросы на пересогласование через ClientHello.565566Этот параметр доступен только в OpenSSL 1.1.0h и выше.567568Добавлено в версии 3.7.569570#### `ssl.OP_CIPHER_SERVER_PREFERENCE`571572Использовать порядок шифров, заданный на сервере, а не на клиенте. Этот параметр не влияет на клиентские сокеты и сокеты сервера SSLv2.573574Новое в версии 3.3.575576#### `ssl.OP_SINGLE_DH_USE`577578Предотвращает повторное использование одного и того же DH-ключа для разных SSL-сессий. Это улучшает прямую секретность, но требует больше вычислительных ресурсов. Данная опция применяется только к серверным сокетам.579580Новое в версии 3.3.581582#### `ssl.OP_SINGLE_ECDH_USE`583584Предотвращает повторное использование одного и того же ECDH-ключа для разных SSL-сессий. Это улучшает прямую секретность, но требует больше вычислительных ресурсов. Данная опция применяется только к серверным сокетам.585586Новое в версии 3.3.587588#### `ssl.OP_ENABLE_MIDDLEBOX_COMPAT`589590Отправляет фиктивные сообщения Change Cipher Spec (CCS) в процессе рукопожатия TLS 1.3, чтобы подключение TLS 1.3 выглядело больше как подключение TLS 1.2.591592Этот параметр доступен только в OpenSSL 1.1.1 и выше.593594Новое в версии 3.8.595596#### `ssl.OP_NO_COMPRESSION`597598Отключает сжатие в SSL-канале. Это полезно, если прикладной протокол поддерживает собственный механизм сжатия.599600Новое в версии 3.3.601602#### `class ssl.Options`603604[`enum.IntFlag`](https://python-all.ru/3.11/library/enum.html#enum.IntFlag) коллекция констант OP\_\*.605606#### `ssl.OP_NO_TICKET`607608Предотвращает запрос сессионного билета со стороны клиента.609610Новое в версии 3.6.611612#### `ssl.OP_IGNORE_UNEXPECTED_EOF`613614Игнорирует неожиданное завершение TLS-соединений.615616Эта опция доступна только в OpenSSL 3.0.0 и новее.617618Новое в версии 3.10.619620#### `ssl.HAS_ALPN`621622Указывает, имеет ли библиотека OpenSSL встроенную поддержку расширения TLS *Согласование протокола прикладного уровня*, как описано в [**RFC 7301**](https://python-all.ru/3.11/library/ssl.html).623624Новое в версии 3.5.625626#### `ssl.HAS_NEVER_CHECK_COMMON_NAME`627628Указывает, имеет ли библиотека OpenSSL встроенную поддержку отключения проверки общего имени субъекта и [`SSLContext.hostname_checks_common_name`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.hostname_checks_common_name) является доступным для записи.629630Добавлено в версии 3.7.631632#### `ssl.HAS_ECDH`633634Указывает, имеет ли библиотека OpenSSL встроенную поддержку обмена ключами Диффи-Хеллмана на основе эллиптических кривых. Это должно быть истиной (true), если только эта возможность не была явно отключена распространителем.635636Новое в версии 3.3.637638#### `ssl.HAS_SNI`639640Указывает, имеет ли библиотека OpenSSL встроенную поддержку расширения *Указание имени сервера (Server Name Indication)* (как определено в [**RFC 6066**](https://python-all.ru/3.11/library/ssl.html)).641642Новое в версии 3.2.643644#### `ssl.HAS_NPN`645646Указывает, имеет ли библиотека OpenSSL встроенную поддержку *Согласования следующего протокола*, как описано в [Согласовании протокола прикладного уровня](https://python-all.ru/3.11/library/ssl.html). Если истина (true), вы можете использовать метод [`SSLContext.set_npn_protocols()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_npn_protocols) для объявления поддерживаемых протоколов.647648Новое в версии 3.3.649650#### `ssl.HAS_SSLv2`651652Указывает, имеет ли библиотека OpenSSL встроенную поддержку протокола SSL 2.0.653654Добавлено в версии 3.7.655656#### `ssl.HAS_SSLv3`657658Указывает, имеет ли библиотека OpenSSL встроенную поддержку протокола SSL 3.0.659660Добавлено в версии 3.7.661662#### `ssl.HAS_TLSv1`663664Указывает, имеет ли библиотека OpenSSL встроенную поддержку протокола TLS 1.0.665666Добавлено в версии 3.7.667668#### `ssl.HAS_TLSv1_1`669670Указывает, имеет ли библиотека OpenSSL встроенную поддержку протокола TLS 1.1.671672Добавлено в версии 3.7.673674#### `ssl.HAS_TLSv1_2`675676Указывает, имеет ли библиотека OpenSSL встроенную поддержку протокола TLS 1.2.677678Добавлено в версии 3.7.679680#### `ssl.HAS_TLSv1_3`681682Определяет, поддерживает ли библиотека OpenSSL протокол TLS 1.3 на встроенном уровне.683684Добавлено в версии 3.7.685686#### `ssl.CHANNEL_BINDING_TYPES`687688Список поддерживаемых типов привязки каналов TLS. Строки из этого списка можно использовать в качестве аргументов для [`SSLSocket.get_channel_binding()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.get_channel_binding).689690Новое в версии 3.3.691692#### `ssl.OPENSSL_VERSION`693694Строка с версией библиотеки OpenSSL, загруженной интерпретатором:695696```python697>>> ssl.OPENSSL_VERSION698'OpenSSL 1.0.2k 26 Jan 2017'699```700701Новое в версии 3.2.702703#### `ssl.OPENSSL_VERSION_INFO`704705Кортеж из пяти целых чисел, содержащий информацию о версии библиотеки OpenSSL:706707```python708>>> ssl.OPENSSL_VERSION_INFO709(1, 0, 2, 11, 15)710```711712Новое в версии 3.2.713714#### `ssl.OPENSSL_VERSION_NUMBER`715716Сырой номер версии библиотеки OpenSSL в виде целого числа:717718```python719>>> ssl.OPENSSL_VERSION_NUMBER720268443839721>>> hex(ssl.OPENSSL_VERSION_NUMBER)722'0x100020bf'723```724725Новое в версии 3.2.726727#### `ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE`728729#### `ssl.ALERT_DESCRIPTION_INTERNAL_ERROR`730731#### `ALERT_DESCRIPTION_*`732733Описания предупреждений из [**RFC 5246**](https://python-all.ru/3.11/library/ssl.html) и других источников. [Реестр предупреждений TLS IANA](https://python-all.ru/3.11/library/ssl.html) содержит этот список и ссылки на RFC, где определено их значение.734735Используется как возвращаемое значение колбэка в [`SSLContext.set_servername_callback()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_servername_callback).736737Новое в версии 3.4.738739#### `class ssl.AlertDescription`740741[`enum.IntEnum`](https://python-all.ru/3.11/library/enum.html#enum.IntEnum) набор констант ALERT\_DESCRIPTION\_\*.742743Новое в версии 3.6.744745#### `Purpose.SERVER_AUTH`746747Параметр для [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) и [`SSLContext.load_default_certs()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_default_certs). Это значение указывает, что контекст может использоваться для аутентификации веб-серверов (поэтому он будет использоваться для создания клиентских сокетов).748749Новое в версии 3.4.750751#### `Purpose.CLIENT_AUTH`752753Параметр для [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) и [`SSLContext.load_default_certs()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_default_certs). Это значение указывает, что контекст может использоваться для аутентификации веб-клиентов (поэтому он будет использоваться для создания серверных сокетов).754755Новое в версии 3.4.756757#### `class ssl.SSLErrorNumber`758759[`enum.IntEnum`](https://python-all.ru/3.11/library/enum.html#enum.IntEnum) набор констант SSL\_ERROR\_\*.760761Новое в версии 3.6.762763#### `class ssl.TLSVersion`764765[`enum.IntEnum`](https://python-all.ru/3.11/library/enum.html#enum.IntEnum) набор версий SSL и TLS для [`SSLContext.maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version) и [`SSLContext.minimum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.minimum_version).766767Добавлено в версии 3.7.768769#### `TLSVersion.MINIMUM_SUPPORTED`770771#### `TLSVersion.MAXIMUM_SUPPORTED`772773Минимальная или максимальная поддерживаемая версия SSL или TLS. Это магические константы. Их значения не соответствуют наименьшей и наибольшей доступным версиям TLS/SSL.774775#### `TLSVersion.SSLv3`776777#### `TLSVersion.TLSv1`778779#### `TLSVersion.TLSv1_1`780781#### `TLSVersion.TLSv1_2`782783#### `TLSVersion.TLSv1_3`784785от SSL 3.0 до TLS 1.3.786787Устарело с версии 3.10: Все члены [`TLSVersion`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion), кроме [`TLSVersion.TLSv1_2`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion.TLSv1_2) и [`TLSVersion.TLSv1_3`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion.TLSv1_3), устарели.788789## SSL-сокеты790791#### `class ssl.SSLSocket(socket.socket)`792793SSL-сокеты предоставляют следующие методы [объектов сокетов](https://python-all.ru/3.11/library/socket.html#socket-objects):794795- [`accept()`](https://python-all.ru/3.11/library/socket.html#socket.socket.accept)796- [`bind()`](https://python-all.ru/3.11/library/socket.html#socket.socket.bind)797- [`close()`](https://python-all.ru/3.11/library/socket.html#socket.socket.close)798- [`connect()`](https://python-all.ru/3.11/library/socket.html#socket.socket.connect)799- [`detach()`](https://python-all.ru/3.11/library/socket.html#socket.socket.detach)800- [`fileno()`](https://python-all.ru/3.11/library/socket.html#socket.socket.fileno)801- [`getpeername()`](https://python-all.ru/3.11/library/socket.html#socket.socket.getpeername), [`getsockname()`](https://python-all.ru/3.11/library/socket.html#socket.socket.getsockname)802- [`getsockopt()`](https://python-all.ru/3.11/library/socket.html#socket.socket.getsockopt), [`setsockopt()`](https://python-all.ru/3.11/library/socket.html#socket.socket.setsockopt)803- [`gettimeout()`](https://python-all.ru/3.11/library/socket.html#socket.socket.gettimeout), [`settimeout()`](https://python-all.ru/3.11/library/socket.html#socket.socket.settimeout), [`setblocking()`](https://python-all.ru/3.11/library/socket.html#socket.socket.setblocking)804- [`listen()`](https://python-all.ru/3.11/library/socket.html#socket.socket.listen)805- [`makefile()`](https://python-all.ru/3.11/library/socket.html#socket.socket.makefile)806- [`recv()`](https://python-all.ru/3.11/library/socket.html#socket.socket.recv), [`recv_into()`](https://python-all.ru/3.11/library/socket.html#socket.socket.recv_into) (однако передача ненулевого аргумента `flags` не разрешена)807- [`send()`](https://python-all.ru/3.11/library/socket.html#socket.socket.send), [`sendall()`](https://python-all.ru/3.11/library/socket.html#socket.socket.sendall) (с тем же ограничением)808- [`sendfile()`](https://python-all.ru/3.11/library/socket.html#socket.socket.sendfile) (но [`os.sendfile`](https://python-all.ru/3.11/library/os.html#os.sendfile) будет использоваться только для сокетов с незашифрованным текстом, иначе будет использоваться [`send()`](https://python-all.ru/3.11/library/socket.html#socket.socket.send))809- [`shutdown()`](https://python-all.ru/3.11/library/socket.html#socket.socket.shutdown)810811Однако, поскольку протокол SSL (и TLS) имеет собственную структуру поверх TCP, абстракция SSL-сокетов может в некоторых аспектах отличаться от спецификации обычных сокетов на уровне ОС. Особенно см. [примечания о неблокирующих сокетах](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking).812813Экземпляры [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) должны создаваться с помощью метода [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket).814815Изменено в версии 3.5: Был добавлен метод `sendfile()`.816817Изменено в версии 3.5: Метод `shutdown()` не сбрасывает тайм-аут сокета каждый раз, когда принимаются или отправляются байты. Теперь тайм-аут сокета – это максимальная общая продолжительность завершения работы.818819Устарело с версии 3.6: Создавать экземпляр [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) напрямую устарело; используйте [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket) для обёртывания сокета.820821Изменено в версии 3.7:[`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) экземпляры должны создаваться с помощью [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket). В более ранних версиях можно было создавать экземпляры напрямую. Это никогда не было документировано и официально не поддерживалось.822823Изменено в версии 3.10: Python теперь использует `SSL_read_ex` и `SSL_write_ex` внутренне. Функции поддерживают чтение и запись данных размером более 2 ГБ. Запись данных нулевой длины больше не вызывает ошибку нарушения протокола.824825SSL-сокеты также имеют следующие дополнительные методы и атрибуты:826827#### `SSLSocket.read(len=1024, buffer=None)`828829Считывает до *len* байт данных из SSL-сокета и возвращает результат в виде экземпляра `bytes`. Если указан *buffer*, то считывает в этот буфер и возвращает количество прочитанных байт.830831Возбуждает [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError) или [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError), если сокет является [неблокирующим](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) и чтение заблокируется.832833Поскольку в любой момент возможна повторная переговорка, вызов [`read()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.read) также может вызвать операции записи.834835Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается каждый раз при получении или отправке байт. Теперь тайм-аут сокета – это максимальная общая продолжительность чтения до *len* байт.836837Устарело с версии 3.6: Используйте `recv()` вместо [`read()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.read).838839#### `SSLSocket.write(buf)`840841Записывает *buf* в SSL-сокет и возвращает количество записанных байт. Аргумент *buf* должен быть объектом, поддерживающим буферный интерфейс.842843Возбуждает [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError) или [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError), если сокет является [неблокирующим](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) и запись заблокируется.844845Поскольку в любой момент возможна повторная переговорка, вызов [`write()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.write) также может вызвать операции чтения.846847Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждом получении или отправке байт. Теперь тайм-аут сокета – это максимальная общая продолжительность записи *buf*.848849Устарело с версии 3.6: Используйте `send()` вместо [`write()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.write).850851> **Примечание**852>853> Методы [`read()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.read) и [`write()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.write) – это низкоуровневые методы для чтения и записи незашифрованных данных уровня приложения и их расшифровки/зашифровки в зашифрованные данные уровня передачи. Для использования этих методов требуется активное SSL-соединение, то есть рукопожатие должно быть завершено, а [`SSLSocket.unwrap()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.unwrap) не вызывался.854>855> Обычно вместо этих методов следует использовать методы сокетного API, такие как [`recv()`](https://python-all.ru/3.11/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.11/library/socket.html#socket.socket.send).856857#### `SSLSocket.do_handshake()`858859Выполняет рукопожатие для настройки SSL.860861Изменено в версии 3.4: Метод рукопожатия также выполняет [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname), если атрибут [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) объекта [`context`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.context) сокета равен true.862863Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждом получении или отправке байтов. Теперь тайм-аут сокета – это максимальная общая продолжительность рукопожатия.864865Изменено в версии 3.7: Имя хоста или IP-адрес теперь сопоставляется OpenSSL во время рукопожатия. Функция [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname) больше не используется. Если OpenSSL отклоняет имя хоста или IP-адрес, рукопожатие прерывается досрочно, и одноранговому узлу отправляется сообщение TLS-оповещения.866867#### `SSLSocket.getpeercert(binary_form=False)`868869Если для однорангового узла на другом конце соединения нет сертификата, возвращается `None`. Если рукопожатие SSL еще не выполнено, вызывается исключение [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError).870871Если параметр `binary_form` равен [`False`](https://python-all.ru/3.11/library/constants.html#False) и от однорангового узла получен сертификат, этот метод возвращает экземпляр [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict). Если сертификат не был проверен, словарь пуст. Если сертификат был проверен, возвращается словарь с несколькими ключами, среди которых `subject` (субъект, для которого выдан сертификат) и `issuer` (субъект, выдавший сертификат). Если сертификат содержит экземпляр расширения *Subject Alternative Name* (см. [**RFC 3280**](https://python-all.ru/3.11/library/ssl.html)), в словаре также будет ключ `subjectAltName`.872873Поля `subject` и `issuer` – это кортежи, содержащие последовательность относительных отличительных имен (RDN) в структуре данных сертификата для соответствующих полей, причем каждый RDN является последовательностью пар имя-значение. Вот реальный пример:874875```python876{'issuer': ((('countryName', 'IL'),),877 (('organizationName', 'StartCom Ltd.'),),878 (('organizationalUnitName',879 'Secure Digital Certificate Signing'),),880 (('commonName',881 'StartCom Class 2 Primary Intermediate Server CA'),)),882 'notAfter': 'Nov 22 08:15:19 2013 GMT',883 'notBefore': 'Nov 21 03:09:52 2011 GMT',884 'serialNumber': '95F0',885 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),886 (('countryName', 'US'),),887 (('stateOrProvinceName', 'California'),),888 (('localityName', 'San Francisco'),),889 (('organizationName', 'Electronic Frontier Foundation, Inc.'),),890 (('commonName', '*.eff.org'),),891 (('emailAddress', 'hostmaster@eff.org'),)),892 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),893 'version': 3}894```895896> **Примечание**897>898> Для проверки сертификата для конкретной службы можно использовать функцию [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname).899900Если параметр `binary_form` равен [`True`](https://python-all.ru/3.11/library/constants.html#True) и сертификат был предоставлен, этот метод возвращает DER-кодированную форму всего сертификата в виде последовательности байтов или [`None`](https://python-all.ru/3.11/library/constants.html#None), если одноранговый узел не предоставил сертификат. Предоставляет ли одноранговый узел сертификат, зависит от роли SSL-сокета:901902- для клиентского SSL-сокета сервер всегда предоставляет сертификат, независимо от того, требовалась ли проверка;903- для серверного SSL-сокета клиент предоставляет сертификат только по запросу сервера; поэтому [`getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert) вернет [`None`](https://python-all.ru/3.11/library/constants.html#None), если использовался [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE) (а не [`CERT_OPTIONAL`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_OPTIONAL) или [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED)).904905Изменено в версии 3.2: Возвращаемый словарь включает дополнительные элементы, такие как `issuer` и `notBefore`.906907Изменено в версии 3.4: Вызывается [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), если рукопожатие не выполнено. Возвращаемый словарь включает дополнительные элементы расширений X509v3, такие как `crlDistributionPoints`, `caIssuers` и `OCSP` URI.908909Изменено в версии 3.9: Строки IPv6-адресов больше не содержат завершающего перевода строки.910911#### `SSLSocket.cipher()`912913Возвращает кортеж из трех значений: название используемого шифра, версию протокола SSL, определяющую его использование, и количество используемых секретных бит. Если соединение не установлено, возвращает `None`.914915#### `SSLSocket.shared_ciphers()`916917Возвращает список шифров, доступных как на клиенте, так и на сервере. Каждый элемент возвращаемого списка – это кортеж из трех значений: название шифра, версия протокола SSL, определяющая его использование, и количество секретных бит, используемых шифром. [`shared_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.shared_ciphers) возвращает `None`, если соединение не установлено или сокет является клиентским.918919Новое в версии 3.5.920921#### `SSLSocket.compression()`922923Возвращает используемый алгоритм сжатия в виде строки или `None`, если соединение не сжато.924925Если протокол более высокого уровня поддерживает собственный механизм сжатия, можно использовать [`OP_NO_COMPRESSION`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_COMPRESSION) для отключения сжатия на уровне SSL.926927Новое в версии 3.3.928929#### `SSLSocket.get_channel_binding(cb_type='tls-unique')`930931Получает данные привязки канала для текущего соединения в виде объекта bytes. Возвращает `None`, если нет соединения или рукопожатие не завершено.932933Параметр *cb\_type* позволяет выбрать желаемый тип привязки канала. Допустимые типы привязки канала перечислены в списке [`CHANNEL_BINDING_TYPES`](https://python-all.ru/3.11/library/ssl.html#ssl.CHANNEL_BINDING_TYPES). В настоящее время поддерживается только привязка канала 'tls-unique', определяемая [**RFC 5929**](https://python-all.ru/3.11/library/ssl.html). Если запрошен неподдерживаемый тип привязки канала, будет вызвано [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError).934935Новое в версии 3.3.936937#### `SSLSocket.selected_alpn_protocol()`938939Возвращает протокол, выбранный во время рукопожатия TLS. Если [`SSLContext.set_alpn_protocols()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_alpn_protocols) не был вызван, другая сторона не поддерживает ALPN, этот сокет не поддерживает ни один из предложенных клиентом протоколов, или рукопожатие ещё не произошло, возвращается `None`.940941Новое в версии 3.5.942943#### `SSLSocket.selected_npn_protocol()`944945Возвращает протокол более высокого уровня, выбранный во время рукопожатия TLS/SSL. Если [`SSLContext.set_npn_protocols()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_npn_protocols) не был вызван, или другая сторона не поддерживает NPN, или рукопожатие ещё не произошло, возвращается `None`.946947Новое в версии 3.3.948949Устарело с версии 3.10: NPN заменён на ALPN950951#### `SSLSocket.unwrap()`952953Выполняет рукопожатие завершения SSL, которое удаляет слой TLS из базового сокета и возвращает объект базового сокета. Это можно использовать для перехода от зашифрованной работы по соединению к незашифрованной. Возвращённый сокет всегда следует использовать для дальнейшего обмена данными с другой стороной соединения, а не исходный сокет.954955#### `SSLSocket.verify_client_post_handshake()`956957Запрашивает аутентификацию после рукопожатия (PHA) у клиента TLS 1.3. PHA может быть инициирована только для соединения TLS 1.3 на стороне серверного сокета, после начального рукопожатия TLS и при включённой PHA на обеих сторонах; см. [`SSLContext.post_handshake_auth`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.post_handshake_auth).958959Метод не выполняет обмен сертификатами немедленно. Серверная сторона отправляет CertificateRequest во время следующего события записи и ожидает, что клиент ответит сертификатом во время следующего события чтения.960961Если какое-либо предусловие не выполнено (например, не TLS 1.3, PHA не включена), вызывается [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError).962963> **Примечание**964>965> Доступно только при наличии OpenSSL 1.1.1 и включённом TLS 1.3. Без поддержки TLS 1.3 метод вызывает [`NotImplementedError`](https://python-all.ru/3.11/library/exceptions.html#NotImplementedError).966967Новое в версии 3.8.968969#### `SSLSocket.version()`970971Возвращает фактическую версию протокола SSL, согласованную соединением, в виде строки, или `None`, если безопасное соединение не установлено. На момент написания документации возможные возвращаемые значения включают `"SSLv2"`, `"SSLv3"`, `"TLSv1"`, `"TLSv1.1"` и `"TLSv1.2"`. Последние версии OpenSSL могут определять дополнительные возвращаемые значения.972973Новое в версии 3.5.974975#### `SSLSocket.pending()`976977Возвращает количество уже расшифрованных байтов, доступных для чтения, ожидающих на соединении.978979#### `SSLSocket.context`980981Объект [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext), к которому привязан этот SSL-сокет. Если SSL сокет был создан с помощью устаревшей функции [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket) (а не [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket)), это пользовательский объект контекста, созданный для этого SSL-сокета.982983Новое в версии 3.2.984985#### `SSLSocket.server_side`986987Логическое значение, равное `True` для серверных сокетов и `False` для клиентских сокетов.988989Новое в версии 3.2.990991#### `SSLSocket.server_hostname`992993Имя хоста сервера: тип [`str`](https://python-all.ru/3.11/library/stdtypes.html#str), или `None` для серверного сокета, или если имя хоста не было указано в конструкторе.994995Новое в версии 3.2.996997Изменено в версии 3.7: Атрибут теперь всегда является текстом ASCII. Если `server_hostname` является интернационализированным доменным именем (IDN), этот атрибут теперь хранит форму A-label (`"xn--pythn-mua.org"`), а не форму U-label (`"pythön.org"`).998999#### `SSLSocket.session`10001001[`SSLSession`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSession) для этого SSL-соединения. Сессия доступна для клиентских и серверных сокетов после выполнения рукопожатия TLS. Для клиентских сокетов сессия может быть установлена до вызова [`do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake), чтобы повторно использовать сессию.10021003Новое в версии 3.6.10041005#### `SSLSocket.session_reused`10061007Новое в версии 3.6.10081009## Контексты SSL10101011Новое в версии 3.2.10121013Контекст SSL хранит различные данные, которые живут дольше, чем отдельные SSL-соединения, такие как параметры конфигурации SSL, сертификат(ы) и закрытый(е) ключ(и). Он также управляет кешем SSL-сессий для серверных сокетов, чтобы ускорить повторные подключения от одних и тех же клиентов.10141015#### `class ssl.SSLContext(protocol=None)`10161017Создаёт новый контекст SSL. Можно передать *протокол*, который должен быть одной из констант `PROTOCOL_*`, определённых в этом модуле. Параметр указывает, какую версию протокола SSL использовать. Обычно сервер выбирает конкретную версию протокола, а клиент должен подстраиваться под выбор сервера. Большинство версий несовместимы с другими версиями. Если параметр не указан, по умолчанию используется [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS); он обеспечивает наибольшую совместимость с другими версиями.10181019Ниже приведена таблица, показывающая, какие версии на стороне клиента (по вертикали) могут подключаться к каким версиям на стороне сервера (по горизонтали):10201021| *клиент* / **сервер** | **SSLv2** | **SSLv3** | **TLS** [\[3\]](https://python-all.ru/3.11/library/ssl.html#id9) | **TLSv1** | **TLSv1.1** | **TLSv1.2** |1022| --- | --- | --- | --- | --- | --- | --- |1023| *SSLv2* | да | нет | нет [\[1\]](https://python-all.ru/3.11/library/ssl.html#id7) | нет | нет | нет |1024| *SSLv3* | нет | да | нет [\[2\]](https://python-all.ru/3.11/library/ssl.html#id8) | нет | нет | нет |1025| *TLS* (*SSLv23*) [\[3\]](https://python-all.ru/3.11/library/ssl.html#id9) | нет [\[1\]](https://python-all.ru/3.11/library/ssl.html#id7) | нет [\[2\]](https://python-all.ru/3.11/library/ssl.html#id8) | да | да | да | да |1026| *TLSv1* | нет | нет | да | да | нет | нет |1027| *TLSv1.1* | нет | нет | да | нет | да | нет |1028| *TLSv1.2* | нет | нет | да | нет | нет | да |10291030Сноски10311032\[1\]10331034([1](https://python-all.ru/3.11/library/ssl.html#id2),[2](https://python-all.ru/3.11/library/ssl.html#id5))10351036[`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) по умолчанию отключает SSLv2 с помощью [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2).10371038\[2\]10391040([1](https://python-all.ru/3.11/library/ssl.html#id3),[2](https://python-all.ru/3.11/library/ssl.html#id6))10411042[`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) по умолчанию отключает SSLv3 с помощью [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3).10431044\[3\]10451046([1](https://python-all.ru/3.11/library/ssl.html#id1),[2](https://python-all.ru/3.11/library/ssl.html#id4))10471048Протокол TLS 1.3 будет доступен с [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS) в OpenSSL \>= 1.1.1. Для одного только TLS 1.3 не существует отдельной константы PROTOCOL.10491050> **См. также**1051>1052> [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) позволяет модулю [`ssl`](https://python-all.ru/3.11/library/ssl.html#module-ssl) выбирать настройки безопасности для заданной цели.10531054Изменено в версии 3.6: Контекст создаётся с безопасными значениями по умолчанию. По умолчанию установлены параметры [`OP_NO_COMPRESSION`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_COMPRESSION), [`OP_CIPHER_SERVER_PREFERENCE`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_CIPHER_SERVER_PREFERENCE), [`OP_SINGLE_DH_USE`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_SINGLE_DH_USE), [`OP_SINGLE_ECDH_USE`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_SINGLE_ECDH_USE), [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2) (за исключением [`PROTOCOL_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv2)), и [`OP_NO_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv3) (за исключением [`PROTOCOL_SSLv3`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv3)). Начальный список наборов шифров содержит только `HIGH` шифры, без `NULL` шифров и без `MD5` шифров (за исключением [`PROTOCOL_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_SSLv2)).10551056Устарело с версии 3.10: Вызов [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) без аргумента protocol устарел. В будущем класс контекста будет требовать протокол [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) или [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER).10571058Изменено в версии 3.10: Наборы шифров по умолчанию теперь включают только безопасные шифры AES и ChaCha20 с прямой секретностью и уровнем безопасности 2. Ключи RSA и DH с длиной менее 2048 бит и ключи ECC с длиной менее 224 бит запрещены. [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS), [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER) используют TLS 1.2 как минимальную версию TLS.10591060Объекты [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) имеют следующие методы и атрибуты:10611062#### `SSLContext.cert_store_stats()`10631064Возвращает словарь со статистикой о количестве загруженных X.509 сертификатов, количестве сертификатов X.509, помеченных как сертификаты CA, и списках отзыва сертификатов.10651066Пример для контекста с одним сертификатом CA и одним другим сертификатом:10671068```python1069>>> context.cert_store_stats()1070{'crl': 0, 'x509_ca': 1, 'x509': 2}1071```10721073Новое в версии 3.4.10741075#### `SSLContext.load_cert_chain(certfile, keyfile=None, password=None)`10761077Загружает закрытый ключ и соответствующий сертификат. Строка *certfile* должна быть путём к одному файлу в формате PEM, содержащему сертификат, а также любое количество сертификатов CA, необходимых для установления подлинности сертификата. Строка *keyfile*, если присутствует, должна указывать на файл, содержащий закрытый ключ. В противном случае закрытый ключ также будет взят из *certfile*. См. обсуждение [Сертификаты](https://python-all.ru/3.11/library/ssl.html#ssl-certificates) для получения дополнительной информации о том, как сертификат хранится в *certfile*.10781079Аргумент *password* может быть функцией, вызываемой для получения пароля для расшифровки закрытого ключа. Она будет вызвана только в том случае, если закрытый ключ зашифрован и требуется пароль. Она будет вызвана без аргументов, и должна возвращать строку, bytes или bytearray. Если возвращаемое значение – строка, она будет закодирована в UTF-8 перед использованием для расшифровки ключа. В качестве альтернативы, строка, bytes или bytearray могут быть переданы напрямую в качестве аргумента *password*. Этот аргумент будет проигнорирован, если закрытый ключ не зашифрован и пароль не требуется.10801081Если аргумент *password* не указан и требуется пароль, будет использован встроенный механизм запроса пароля OpenSSL для интерактивного запроса пароля у пользователя.10821083Вызывается исключение [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError), если закрытый ключ не соответствует сертификату.10841085Изменено в версии 3.3: Новый необязательный аргумент *password*.10861087#### `SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH)`10881089Загружает набор стандартных сертификатов "центров сертификации" (CA) из стандартных расположений. В Windows загружает сертификаты CA из системных хранилищ `CA` и `ROOT`. На всех системах вызывает [`SSLContext.set_default_verify_paths()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_default_verify_paths). В будущем метод может также загружать сертификаты CA из других расположений.10901091Флаг *purpose* определяет, какие именно сертификаты CA загружаются. Настройка по умолчанию [`Purpose.SERVER_AUTH`](https://python-all.ru/3.11/library/ssl.html#ssl.Purpose.SERVER_AUTH) загружает сертификаты, помеченные и доверенные для аутентификации TLS веб-сервера (клиентские сокеты). [`Purpose.CLIENT_AUTH`](https://python-all.ru/3.11/library/ssl.html#ssl.Purpose.CLIENT_AUTH) загружает сертификаты CA для проверки сертификата клиента на стороне сервера.10921093Новое в версии 3.4.10941095#### `SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None)`10961097Загружает набор сертификатов "центров сертификации" (CA), используемых для проверки сертификатов других узлов, когда [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) отличается от [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE). Должен быть указан хотя бы один из параметров *cafile* или *capath*.10981099Этот метод также может загружать списки отзыва сертификатов (CRL) в формате PEM или DER. Чтобы использовать CRL, необходимо правильно настроить [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags).11001101Строка *cafile*, если присутствует, содержит путь к файлу, содержащему объединённые сертификаты CA в формате PEM. См. обсуждение [Сертификаты](https://python-all.ru/3.11/library/ssl.html#ssl-certificates) для получения дополнительной информации о том, как организовать сертификаты в этом файле.11021103Строка *capath*, если присутствует, задаёт путь к каталогу, содержащему несколько сертификатов CA в формате PEM, согласно [специфической структуре OpenSSL](https://python-all.ru/3.11/library/ssl.html).11041105Объект *cadata*, если присутствует, представляет собой либо ASCII-строку с одним или несколькими сертификатами в кодировке PEM, либо [байтоподобный объект](https://python-all.ru/3.11/glossary.html#term-bytes-like-object) с сертификатами в кодировке DER. Как и в случае с *capath*, дополнительные строки вокруг сертификатов в кодировке PEM игнорируются, но должен присутствовать хотя бы один сертификат.11061107Изменено в версии 3.4: Новый необязательный аргумент *cadata*11081109#### `SSLContext.get_ca_certs(binary_form=False)`11101111Возвращает список загруженных сертификатов “certification authority” (CA). Если параметр `binary_form` равен [`False`](https://python-all.ru/3.11/library/constants.html#False), каждый элемент списка представляет собой словарь, аналогичный выводу [`SSLSocket.getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert). В противном случае метод возвращает список сертификатов в формате DER. Возвращаемый список не содержит сертификаты из *capath*, если только сертификат не был запрошен и загружен через SSL-соединение.11121113> **Примечание**1114>1115> Сертификаты в каталоге capath не загружаются, пока не будут использованы хотя бы один раз.11161117Новое в версии 3.4.11181119#### `SSLContext.get_ciphers()`11201121Возвращает список включённых шифров. Список упорядочен по приоритету шифров. См. [`SSLContext.set_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_ciphers).11221123Пример:11241125```python1126>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)1127>>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA')1128>>> ctx.get_ciphers()1129[{'aead': True,1130 'alg_bits': 256,1131 'auth': 'auth-rsa',1132 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA '1133 'Enc=AESGCM(256) Mac=AEAD',1134 'digest': None,1135 'id': 50380848,1136 'kea': 'kx-ecdhe',1137 'name': 'ECDHE-RSA-AES256-GCM-SHA384',1138 'protocol': 'TLSv1.2',1139 'strength_bits': 256,1140 'symmetric': 'aes-256-gcm'},1141 {'aead': True,1142 'alg_bits': 128,1143 'auth': 'auth-rsa',1144 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA '1145 'Enc=AESGCM(128) Mac=AEAD',1146 'digest': None,1147 'id': 50380847,1148 'kea': 'kx-ecdhe',1149 'name': 'ECDHE-RSA-AES128-GCM-SHA256',1150 'protocol': 'TLSv1.2',1151 'strength_bits': 128,1152 'symmetric': 'aes-128-gcm'}]1153```11541155Новое в версии 3.6.11561157#### `SSLContext.set_default_verify_paths()`11581159Загружает набор сертификатов по умолчанию “certification authority” (CA) из пути файловой системы, заданного при сборке библиотеки OpenSSL. К сожалению, нет простого способа узнать, успешно ли выполняется этот метод: ошибка не возвращается, если сертификаты не найдены. Однако, если библиотека OpenSSL поставляется как часть операционной системы, она, скорее всего, настроена правильно.11601161#### `SSLContext.set_ciphers(ciphers)`11621163Устанавливает доступные шифры для сокетов, создаваемых с этим контекстом. Значение должно быть строкой в [формате списка шифров OpenSSL](https://python-all.ru/3.11/library/ssl.html). Если ни один шифр не может быть выбран (из-за опций компиляции или других настроек, запрещающих использование всех указанных шифров), будет вызвано исключение [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError).11641165> **Примечание**1166>1167> при подключении метод [`SSLSocket.cipher()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.cipher) SSL-сокетов вернёт текущий выбранный шифр.1168>1169> Наборы шифров TLS 1.3 нельзя отключить с помощью [`set_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_ciphers).11701171#### `SSLContext.set_alpn_protocols(protocols)`11721173Определяет, какие протоколы сокет должен объявлять во время рукопожатия SSL/TLS. Это должен быть список строк ASCII, например `['http/1.1', 'spdy/2']`, упорядоченных по предпочтению. Выбор протокола происходит во время рукопожатия и выполняется в соответствии с [**RFC 7301**](https://python-all.ru/3.11/library/ssl.html). После успешного рукопожатия метод [`SSLSocket.selected_alpn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_alpn_protocol) вернёт согласованный протокол.11741175Этот метод вызовет [`NotImplementedError`](https://python-all.ru/3.11/library/exceptions.html#NotImplementedError), если [`HAS_ALPN`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_ALPN) равно `False`.11761177Новое в версии 3.5.11781179#### `SSLContext.set_npn_protocols(protocols)`11801181Определяет, какие протоколы сокет должен объявлять во время рукопожатия SSL/TLS. Это должен быть список строк, например `['http/1.1', 'spdy/2']`, упорядоченный по предпочтению. Выбор протокола происходит во время рукопожатия и выполняется в соответствии с [Согласованием протокола прикладного уровня](https://python-all.ru/3.11/library/ssl.html) (Application Layer Protocol Negotiation). После успешного рукопожатия метод [`SSLSocket.selected_npn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_npn_protocol) вернёт согласованный протокол.11821183Этот метод вызовет [`NotImplementedError`](https://python-all.ru/3.11/library/exceptions.html#NotImplementedError), если [`HAS_NPN`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_NPN) равно `False`.11841185Новое в версии 3.3.11861187Устарело с версии 3.10: NPN заменён на ALPN11881189#### `SSLContext.sni_callback`11901191Регистрирует функцию обратного вызова, которая будет вызвана после получения сервером SSL/TLS сообщения TLS Client Hello, когда клиент TLS указывает индикацию имени сервера. Механизм индикации имени сервера описан в [**RFC 6066**](https://python-all.ru/3.11/library/ssl.html) раздел 3 – Server Name Indication.11921193Для каждого `SSLContext` можно установить только один колбэк. Если *sni\_callback* установлено в `None`, колбэк отключается. Повторный вызов этой функции отключит ранее зарегистрированный колбэк.11941195Функция обратного вызова будет вызвана с тремя аргументами: первый – [`ssl.SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), второй – строка, представляющая имя сервера, с которым клиент намерен установить соединение (или [`None`](https://python-all.ru/3.11/library/constants.html#None), если TLS Client Hello не содержит имя сервера), и третий аргумент – исходный [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext). Аргумент имени сервера является текстовым. Для интернационализированных доменных имён имя сервера представляет собой IDN A-метку (`"xn--pythn-mua.org"`).11961197Типичное использование этого колбэка – изменить атрибут [`SSLSocket.context`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.context) объекта [`ssl.SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) на новый объект типа [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext), представляющий цепочку сертификатов, соответствующую имени сервера.11981199Из-за ранней фазы согласования TLS-соединения доступны только ограниченные методы и атрибуты, такие как [`SSLSocket.selected_alpn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_alpn_protocol) и [`SSLSocket.context`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.context). Методы [`SSLSocket.getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert), [`SSLSocket.cipher()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.cipher) и [`SSLSocket.compression()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.compression) требуют, чтобы TLS-соединение прошло стадию TLS Client Hello, поэтому они не вернут значимых значений и не могут быть безопасно вызваны.12001201Функция *sni\_callback* должна возвращать `None`, чтобы позволить продолжить согласование TLS. Если требуется ошибка TLS, можно вернуть константу [`ALERT_DESCRIPTION_*`](https://python-all.ru/3.11/library/ssl.html#ssl.ALERT_DESCRIPTION_INTERNAL_ERROR). Другие возвращаемые значения приведут к фатальной ошибке TLS с [`ALERT_DESCRIPTION_INTERNAL_ERROR`](https://python-all.ru/3.11/library/ssl.html#ssl.ALERT_DESCRIPTION_INTERNAL_ERROR).12021203Если из функции *sni\_callback* будет вызвано исключение, TLS-соединение будет завершено с фатальным предупреждением TLS [`ALERT_DESCRIPTION_HANDSHAKE_FAILURE`](https://python-all.ru/3.11/library/ssl.html#ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE).12041205Этот метод вызовет исключение [`NotImplementedError`](https://python-all.ru/3.11/library/exceptions.html#NotImplementedError), если библиотека OpenSSL была собрана с определённым OPENSSL\_NO\_TLSEXT.12061207Добавлено в версии 3.7.12081209#### `SSLContext.set_servername_callback(server_name_callback)`12101211Это устаревший API, сохранённый для обратной совместимости. По возможности следует использовать [`sni_callback`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.sni_callback). Заданный *server\_name\_callback* похож на *sni\_callback*, за исключением того, что когда имя хоста сервера является интернационализированным доменным именем в кодировке IDN, *server\_name\_callback* получает декодированную U-метку (`"pythön.org"`).12121213Если при декодировании имени сервера происходит ошибка, TLS-соединение завершится, отправив клиенту [`ALERT_DESCRIPTION_INTERNAL_ERROR`](https://python-all.ru/3.11/library/ssl.html#ssl.ALERT_DESCRIPTION_INTERNAL_ERROR) фатальное предупреждающее сообщение TLS.12141215Новое в версии 3.4.12161217#### `SSLContext.load_dh_params(dhfile)`12181219Загружает параметры генерации ключей для обмена ключами Диффи-Хеллмана (DH). Использование обмена ключами DH улучшает прямую секретность ценой вычислительных ресурсов (как на сервере, так и на клиенте). Параметр *dhfile* должен указывать путь к файлу, содержащему параметры DH в формате PEM.12201221Этот параметр не применяется к клиентским сокетам. Также можно использовать опцию [`OP_SINGLE_DH_USE`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_SINGLE_DH_USE) для дальнейшего повышения безопасности.12221223Новое в версии 3.3.12241225#### `SSLContext.set_ecdh_curve(curve_name)`12261227Устанавливает имя кривой для обмена ключами на основе эллиптических кривых (ECDH). ECDH значительно быстрее обычного DH, при этом, возможно, столь же безопасен. Параметр *curve\_name* должен быть строкой, описывающей известную эллиптическую кривую, например `prime256v1` для широко поддерживаемой кривой.12281229Этот параметр не применяется к клиентским сокетам. Также можно использовать опцию [`OP_SINGLE_ECDH_USE`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_SINGLE_ECDH_USE) для дальнейшего повышения безопасности.12301231Этот метод недоступен, если [`HAS_ECDH`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_ECDH) имеет значение `False`.12321233Новое в версии 3.3.12341235> **См. также**1236>1237> **[SSL/TLS и совершенная прямая секретность](https://python-all.ru/3.11/library/ssl.html)**1238>1239> Vincent Bernat.12401241#### `SSLContext.wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None)`12421243Оборачивает существующий сокет Python *sock* и возвращает экземпляр [`SSLContext.sslsocket_class`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.sslsocket_class) (по умолчанию [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket)). Возвращаемый SSL-сокет привязан к контексту, его настройкам и сертификатам. *sock* должен быть сокетом [`SOCK_STREAM`](https://python-all.ru/3.11/library/socket.html#socket.SOCK_STREAM); другие типы сокетов не поддерживаются.12441245Параметр `server_side` – это логическое значение, указывающее, требуется ли поведение серверной или клиентской стороны для этого сокета.12461247Для клиентских сокетов построение контекста выполняется лениво; если базовый сокет ещё не подключён, построение контекста будет выполнено после вызова `connect()` на сокете. Для серверных сокетов, если у сокета нет удалённого узла, считается, что это слушающий сокет, и SSL-обёртка на стороне сервера автоматически выполняется для клиентских подключений, принятых через метод `accept()`. Метод может возбудить исключение [`SSLError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLError).12481249Для клиентских подключений необязательный параметр *server\_hostname* задаёт имя хоста службы, к которой выполняется подключение. Это позволяет одному серверу размещать несколько SSL-служб с разными сертификатами, аналогично виртуальным хостам HTTP. Указание *server\_hostname* вызовет исключение [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), если *server\_side* равно true.12501251Параметр `do_handshake_on_connect` определяет, следует ли выполнять рукопожатие SSL автоматически после `socket.connect()`, или же прикладная программа будет вызывать его явно с помощью метода [`SSLSocket.do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake). Явный вызов [`SSLSocket.do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake) даёт программе контроль над блокирующим поведением ввода-вывода сокета, участвующего в рукопожатии.12521253Параметр `suppress_ragged_eofs` определяет, как метод `SSLSocket.recv()` должен сигнализировать о неожиданном EOF от другого конца соединения. Если задано значение [`True`](https://python-all.ru/3.11/library/constants.html#True) (по умолчанию), он возвращает обычный EOF (пустой объект bytes) в ответ на ошибки неожиданного EOF, возникшие в базовом сокете; если [`False`](https://python-all.ru/3.11/library/constants.html#False), то исключения будут переданы обратно вызывающему коду.12541255*session*, см. [`session`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.session).12561257Чтобы обернуть [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) в другой [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), используйте [`SSLContext.wrap_bio()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_bio).12581259Изменено в версии 3.5: Всегда разрешается передавать server\_hostname, даже если OpenSSL не поддерживает SNI.12601261Изменено в версии 3.6: Добавлен аргумент *session*.12621263Изменено в версии 3.7: Метод возвращает экземпляр [`SSLContext.sslsocket_class`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.sslsocket_class) вместо жёстко заданного [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket).12641265#### `SSLContext.sslsocket_class`12661267Возвращаемый тип [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket), по умолчанию [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket). Атрибут можно переопределить на экземпляре класса, чтобы возвращать пользовательский подкласс [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket).12681269Добавлено в версии 3.7.12701271#### `SSLContext.wrap_bio(incoming, outgoing, server_side=False, server_hostname=None, session=None)`12721273Оборачивает объекты BIO *incoming* и *outgoing* и возвращает экземпляр [`SSLContext.sslobject_class`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.sslobject_class) (по умолчанию [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject)). Процедуры SSL будут читать входные данные из входящего BIO и записывать данные в исходящий BIO.12741275Параметры *server\_side*, *server\_hostname* и *session* имеют тот же смысл, что и в [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket).12761277Изменено в версии 3.6: Добавлен аргумент *session*.12781279Изменено в версии 3.7: Метод возвращает экземпляр [`SSLContext.sslobject_class`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.sslobject_class) вместо жёстко заданного [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject).12801281#### `SSLContext.sslobject_class`12821283Возвращаемый тип [`SSLContext.wrap_bio()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_bio), по умолчанию [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject). Атрибут можно переопределить на экземпляре класса, чтобы возвращать пользовательский подкласс [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject).12841285Добавлено в версии 3.7.12861287#### `SSLContext.session_stats()`12881289Получает статистику о сеансах SSL, созданных или управляемых этим контекстом. Возвращается словарь, который сопоставляет названия каждого [фрагмента информации](https://python-all.ru/3.11/library/ssl.html) с их числовыми значениями. Например, вот общее количество попаданий и промахов в кэше сеансов с момента создания контекста:12901291```python1292>>> stats = context.session_stats()1293>>> stats['hits'], stats['misses']1294(0, 0)1295```12961297#### `SSLContext.check_hostname`12981299Определяет, нужно ли проверять hostname в сертификате однорангового узла в [`SSLSocket.do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake). Атрибут [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) контекста должен быть установлен в [`CERT_OPTIONAL`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_OPTIONAL) или [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED), а для проверки hostname необходимо передать *server\_hostname* в [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket). Включение проверки hostname автоматически меняет [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) с [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE) на [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED). Его нельзя вернуть обратно на [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE), пока проверка hostname включена. Протокол [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) включает проверку hostname по умолчанию. Для остальных протоколов проверку hostname нужно включать явно.13001301Пример:13021303```python1304import socket, ssl13051306context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)1307context.verify_mode = ssl.CERT_REQUIRED1308context.check_hostname = True1309context.load_default_certs()13101311s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)1312ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')1313ssl_sock.connect(('www.verisign.com', 443))1314```13151316Новое в версии 3.4.13171318Изменено в версии 3.7: [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) теперь автоматически меняется на [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED), когда включена проверка hostname, а [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) равен [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE). Раньше та же операция завершилась бы с ошибкой [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError).13191320#### `SSLContext.keylog_filename`13211322Записывает ключи TLS в файл журнала ключей каждый раз, когда генерируется или принимается ключевой материал. Файл журнала предназначен только для отладки. Формат файла определён NSS и используется многими анализаторами трафика, такими как Wireshark. Файл открывается в режиме только добавления. Записи синхронизируются между потоками, но не между процессами.13231324Новое в версии 3.8.13251326#### `SSLContext.maximum_version`13271328Элемент перечисления [`TLSVersion`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion), представляющий самую высокую поддерживаемую версию TLS. Значение по умолчанию – [`TLSVersion.MAXIMUM_SUPPORTED`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion.MAXIMUM_SUPPORTED). Атрибут доступен только для чтения для протоколов, отличных от [`PROTOCOL_TLS`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS), [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) и [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER).13291330Атрибуты [`maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version), [`minimum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.minimum_version) и [`SSLContext.options`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.options) влияют на поддерживаемые версии SSL и TLS контекста. Реализация не препятствует некорректным комбинациям. Например, контекст с [`OP_NO_TLSv1_2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_TLSv1_2) в [`options`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.options) и [`maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version), установленным в [`TLSVersion.TLSv1_2`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion.TLSv1_2), не сможет установить соединение по TLS 1.2.13311332Добавлено в версии 3.7.13331334#### `SSLContext.minimum_version`13351336Аналогично [`SSLContext.maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version), но задаёт самую низкую поддерживаемую версию или [`TLSVersion.MINIMUM_SUPPORTED`](https://python-all.ru/3.11/library/ssl.html#ssl.TLSVersion.MINIMUM_SUPPORTED).13371338Добавлено в версии 3.7.13391340#### `SSLContext.num_tickets`13411342Управляет количеством сессионных билетов TLS 1.3 для контекста [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER). Настройка не влияет на соединения TLS 1.0–1.2.13431344Новое в версии 3.8.13451346#### `SSLContext.options`13471348Целое число, представляющее набор опций SSL, включённых в этом контексте. Значение по умолчанию – [`OP_ALL`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_ALL), но можно указать другие опции, например [`OP_NO_SSLv2`](https://python-all.ru/3.11/library/ssl.html#ssl.OP_NO_SSLv2), комбинируя их с помощью OR.13491350Изменено в версии 3.6: [`SSLContext.options`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.options) возвращает флаги [`Options`](https://python-all.ru/3.11/library/ssl.html#ssl.Options):13511352```python1353>>> ssl.create_default_context().options 1354<Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>1355```13561357Устарело с версии 3.7: Все опции `OP_NO_SSL*` и `OP_NO_TLS*` устарели начиная с Python 3.7. Используйте вместо них [`SSLContext.minimum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.minimum_version) и [`SSLContext.maximum_version`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.maximum_version).13581359#### `SSLContext.post_handshake_auth`13601361Включает аутентификацию клиента после рукопожатия TLS 1.3. По умолчанию аутентификация после рукопожатия отключена, и сервер может запрашивать TLS-сертификат клиента только во время начального рукопожатия. При включении сервер может запрашивать сертификат клиента в любое время после рукопожатия.13621363При включении на клиентских сокетах клиент сообщает серверу, что он поддерживает аутентификацию после рукопожатия.13641365При включении на серверных сокетах [`SSLContext.verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) также должен быть установлен в [`CERT_OPTIONAL`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_OPTIONAL) или [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED). Фактический обмен сертификатами клиента откладывается до вызова [`SSLSocket.verify_client_post_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.verify_client_post_handshake) и выполнения некоторого ввода-вывода.13661367Новое в версии 3.8.13681369#### `SSLContext.protocol`13701371Версия протокола, выбранная при создании контекста. Этот атрибут доступен только для чтения.13721373#### `SSLContext.hostname_checks_common_name`13741375Определяет, будет ли [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) проверять общее имя (common name) субъекта сертификата при отсутствии расширения subject alternative name (по умолчанию: true).13761377Добавлено в версии 3.7.13781379Изменено в версии 3.10: Этот флаг не действовал в OpenSSL версий ниже 1.1.1l. Python 3.8.9, 3.9.3 и 3.10 содержат обходные пути для предыдущих версий.13801381#### `SSLContext.security_level`13821383Целое число, представляющее [уровень безопасности](https://python-all.ru/3.11/library/ssl.html) для контекста. Этот атрибут доступен только для чтения.13841385Новое в версии 3.10.13861387#### `SSLContext.verify_flags`13881389Флаги для операций проверки сертификатов. Можно устанавливать такие флаги, как [`VERIFY_CRL_CHECK_LEAF`](https://python-all.ru/3.11/library/ssl.html#ssl.VERIFY_CRL_CHECK_LEAF), комбинируя их с помощью OR. По умолчанию OpenSSL не требует и не проверяет списки отзыва сертификатов (CRL).13901391Новое в версии 3.4.13921393Изменено в версии 3.6: [`SSLContext.verify_flags`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_flags) возвращает флаги [`VerifyFlags`](https://python-all.ru/3.11/library/ssl.html#ssl.VerifyFlags):13941395```python1396>>> ssl.create_default_context().verify_flags 1397<VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>1398```13991400#### `SSLContext.verify_mode`14011402Определяет, следует ли проверять сертификаты других одноранговых узлов и как вести себя при неудачной проверке. Значение атрибута должно быть одним из [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE), [`CERT_OPTIONAL`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_OPTIONAL) или [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED).14031404Изменено в версии 3.6: [`SSLContext.verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) возвращает перечисление [`VerifyMode`](https://python-all.ru/3.11/library/ssl.html#ssl.VerifyMode):14051406```python1407>>> ssl.create_default_context().verify_mode 1408<VerifyMode.CERT_REQUIRED: 2>1409```14101411## Сертификаты14121413Сертификаты в целом являются частью системы открытых и закрытых ключей. В этой системе каждому *субъекту* (которым может быть машина, человек или организация) присваивается уникальный двухчастный ключ шифрования. Одна часть ключа является открытой и называется *открытым ключом*; другая часть хранится в секрете и называется *закрытым ключом*. Две части связаны так, что если зашифровать сообщение одной частью, его можно расшифровать только другой частью, и **только** другой частью.14141415Сертификат содержит информацию о двух субъектах. Он содержит имя *субъекта* и его открытый ключ. Также он содержит заявление второго субъекта – *эмитента*, о том, что субъект является тем, за кого себя выдаёт, и что это действительно его открытый ключ. Заявление эмитента подписано закрытым ключом эмитента, который знает только эмитент. Однако любой может проверить заявление эмитента, найдя его открытый ключ, расшифровав им заявление и сравнив его с другой информацией в сертификате. Сертификат также содержит информацию о периоде времени, в течение которого он действителен. Это выражается двумя полями, называемыми «notBefore» и «notAfter».14161417При использовании сертификатов в Python клиент или сервер может использовать сертификат для подтверждения своей личности. Другая сторона сетевого соединения также может быть обязана предоставить сертификат, и этот сертификат может быть проверен к удовлетворению клиента или сервера, требующего такой проверки. Можно настроить попытку соединения так, чтобы она вызывала исключение, если проверка не удалась. Проверка выполняется автоматически базовым фреймворком OpenSSL; приложению не нужно вникать в её механику. Но приложению обычно необходимо предоставить наборы сертификатов, чтобы этот процесс мог происходить.14181419Python uses files to contain certificates. They should be formatted as “PEM” (see [**RFC 1422**](https://python-all.ru/3.11/library/ssl.html)), which is a base-64 encoded form wrapped with a header line and a footer line:14201421```python1422-----BEGIN CERTIFICATE-----1423... (certificate in base64 PEM encoding) ...1424-----END CERTIFICATE-----1425```14261427### Цепочки сертификатов14281429The Python files which contain certificates can contain a sequence of certificates, sometimes called a *certificate chain*. This chain should start with the specific certificate for the principal who “is” the client or server, and then the certificate for the issuer of that certificate, and then the certificate for the issuer of *that* certificate, and so on up the chain till you get to a certificate which is *self-signed*, that is, a certificate which has the same subject and issuer, sometimes called a *root certificate*. The certificates should just be concatenated together in the certificate file. For example, suppose we had a three certificate chain, from our server certificate to the certificate of the certification authority that signed our server certificate, to the root certificate of the agency which issued the certification authority’s certificate:14301431```python1432-----BEGIN CERTIFICATE-----1433... (certificate for your server)...1434-----END CERTIFICATE-----1435-----BEGIN CERTIFICATE-----1436... (the certificate for the CA)...1437-----END CERTIFICATE-----1438-----BEGIN CERTIFICATE-----1439... (the root certificate for the CA's issuer)...1440-----END CERTIFICATE-----1441```14421443### Сертификаты УЦ14441445Если требуется проверка сертификата другой стороны соединения, необходимо предоставить файл «CA certs», содержащий цепочки сертификатов для каждого эмитента, которому вы готовы доверять. Этот файл просто содержит эти цепочки, объединённые вместе. Для проверки Python будет использовать первую найденную в файле подходящую цепочку. Файл сертификатов платформы можно использовать, вызвав [`SSLContext.load_default_certs()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_default_certs); это делается автоматически с помощью [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context).14461447### Объединённый ключ и сертификат14481449Часто закрытый ключ хранится в том же файле, что и сертификат; в этом случае достаточно передать только параметр `certfile` функциям [`SSLContext.load_cert_chain()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_cert_chain) и [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.wrap_socket). Если закрытый ключ хранится вместе с сертификатом, он должен располагаться перед первым сертификатом в цепочке сертификатов:14501451```python1452-----BEGIN RSA PRIVATE KEY-----1453... (private key in base64 encoding) ...1454-----END RSA PRIVATE KEY-----1455-----BEGIN CERTIFICATE-----1456... (certificate in base64 PEM encoding) ...1457-----END CERTIFICATE-----1458```14591460### Самоподписанные сертификаты14611462Если планируется создать сервер, предоставляющий услуги SSL-защищённого соединения, потребуется приобрести сертификат для этой службы. Существует много способов получения подходящих сертификатов, например покупка в удостоверяющем центре. Ещё одна распространённая практика – сгенерировать самоподписанный сертификат. Самый простой способ сделать это – использовать пакет OpenSSL, примерно следующим образом:14631464```python1465% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem1466Generating a 1024 bit RSA private key1467.......++++++1468.............................++++++1469writing new private key to 'cert.pem'1470-----1471You are about to be asked to enter information that will be incorporated1472into your certificate request.1473What you are about to enter is what is called a Distinguished Name or a DN.1474There are quite a few fields but you can leave some blank1475For some fields there will be a default value,1476If you enter '.', the field will be left blank.1477-----1478Country Name (2 letter code) [AU]:US1479State or Province Name (full name) [Some-State]:MyState1480Locality Name (eg, city) []:Some City1481Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc.1482Organizational Unit Name (eg, section) []:My Group1483Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com1484Email Address []:ops@myserver.mygroup.myorganization.com1485%1486```14871488Недостаток самоподписанного сертификата в том, что он является собственным корневым сертификатом, и никто другой не будет иметь его в своём кэше известных (и доверенных) корневых сертификатов.14891490## Примеры14911492### Проверка поддержки SSL14931494Чтобы проверить наличие поддержки SSL в установке Python, в пользовательском коде следует использовать следующую идиому:14951496```python1497try:1498 import ssl1499except ImportError:1500 pass1501else:1502 ... # сделать что-то, что требует поддержки SSL1503```15041505### Операции на стороне клиента15061507Этот пример создаёт контекст SSL с рекомендуемыми настройками безопасности для клиентских сокетов, включая автоматическую проверку сертификатов:15081509```python1510>>> context = ssl.create_default_context()1511```15121513Если вы предпочитаете настраивать параметры безопасности самостоятельно, можно создать контекст с нуля (но имейте в виду, что настройки могут оказаться неверными):15141515```python1516>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)1517>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")1518```15191520(этот фрагмент предполагает, что ваша операционная система размещает набор всех сертификатов CA в `/etc/ssl/certs/ca-bundle.crt`; если нет, вы получите ошибку и придётся изменить расположение)15211522Протокол [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) настраивает контекст для проверки сертификатов и проверки имени хоста. [`verify_mode`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.verify_mode) установлен в [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED), а [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) установлен в `True`. Все остальные протоколы создают контексты SSL с небезопасными настройками по умолчанию.15231524При использовании контекста для подключения к серверу [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) и [`check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) проверяют сертификат сервера: они гарантируют, что сертификат сервера был подписан одним из сертификатов ЦС, проверяют корректность подписи, а также проверяют другие свойства, такие как срок действия и идентификация имени хоста:15251526```python1527>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),1528... server_hostname="www.python.org")1529>>> conn.connect(("www.python.org", 443))1530```15311532Затем можно получить сертификат:15331534```python1535>>> cert = conn.getpeercert()1536```15371538Визуальная проверка показывает, что сертификат действительно идентифицирует нужный сервис (то есть HTTPS-хост `www.python.org`):15391540```python1541>>> pprint.pprint(cert)1542{'OCSP': ('http://ocsp.digicert.com',),1543 'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),1544 'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',1545 'http://crl4.digicert.com/sha2-ev-server-g1.crl'),1546 'issuer': ((('countryName', 'US'),),1547 (('organizationName', 'DigiCert Inc'),),1548 (('organizationalUnitName', 'www.digicert.com'),),1549 (('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),1550 'notAfter': 'Sep 9 12:00:00 2016 GMT',1551 'notBefore': 'Sep 5 00:00:00 2014 GMT',1552 'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',1553 'subject': ((('businessCategory', 'Private Organization'),),1554 (('1.3.6.1.4.1.311.60.2.1.3', 'US'),),1555 (('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),1556 (('serialNumber', '3359300'),),1557 (('streetAddress', '16 Allen Rd'),),1558 (('postalCode', '03894-4801'),),1559 (('countryName', 'US'),),1560 (('stateOrProvinceName', 'NH'),),1561 (('localityName', 'Wolfeboro'),),1562 (('organizationName', 'Python Software Foundation'),),1563 (('commonName', 'www.python.org'),)),1564 'subjectAltName': (('DNS', 'www.python.org'),1565 ('DNS', 'python.org'),1566 ('DNS', 'pypi.org'),1567 ('DNS', 'docs.python.org'),1568 ('DNS', 'testpypi.org'),1569 ('DNS', 'bugs.python.org'),1570 ('DNS', 'wiki.python.org'),1571 ('DNS', 'hg.python.org'),1572 ('DNS', 'mail.python.org'),1573 ('DNS', 'packaging.python.org'),1574 ('DNS', 'pythonhosted.org'),1575 ('DNS', 'www.pythonhosted.org'),1576 ('DNS', 'test.pythonhosted.org'),1577 ('DNS', 'us.pycon.org'),1578 ('DNS', 'id.python.org')),1579 'version': 3}1580```15811582Теперь, когда SSL-канал установлен и сертификат проверен, можно продолжить обмен данными с сервером:15831584```python1585>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")1586>>> pprint.pprint(conn.recv(1024).split(b"\r\n"))1587[b'HTTP/1.1 200 OK',1588 b'Date: Sat, 18 Oct 2014 18:27:20 GMT',1589 b'Server: nginx',1590 b'Content-Type: text/html; charset=utf-8',1591 b'X-Frame-Options: SAMEORIGIN',1592 b'Content-Length: 45679',1593 b'Accept-Ranges: bytes',1594 b'Via: 1.1 varnish',1595 b'Age: 2188',1596 b'X-Served-By: cache-lcy1134-LCY',1597 b'X-Cache: HIT',1598 b'X-Cache-Hits: 11',1599 b'Vary: Cookie',1600 b'Strict-Transport-Security: max-age=63072000; includeSubDomains',1601 b'Connection: close',1602 b'',1603 b'']1604```16051606См. обсуждение [соображений безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) ниже.16071608### Операции на стороне сервера16091610Для работы на стороне сервера обычно нужно иметь сертификат сервера и закрытый ключ, каждый в отдельном файле. Сначала создаётся контекст, содержащий ключ и сертификат, чтобы клиенты могли проверить подлинность. Затем открывается сокет, привязывается к порту, вызывается `listen()`, и начинается ожидание подключения клиентов:16111612```python1613import socket, ssl16141615context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)1616context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")16171618bindsocket = socket.socket()1619bindsocket.bind(('myaddr.example.com', 10023))1620bindsocket.listen(5)1621```16221623Когда клиент подключается, вызывается `accept()` на сокете, чтобы получить новый сокет с другого конца, и используется метод контекста [`SSLContext.wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket) для создания серверного SSL-сокета для этого соединения:16241625```python1626while True:1627 newsocket, fromaddr = bindsocket.accept()1628 connstream = context.wrap_socket(newsocket, server_side=True)1629 try:1630 deal_with_client(connstream)1631 finally:1632 connstream.shutdown(socket.SHUT_RDWR)1633 connstream.close()1634```16351636Затем читаются данные из `connstream` и что-то с ними делается, пока не будет завершена работа с клиентом (или клиент не завершит работу с вами):16371638```python1639def deal_with_client(connstream):1640 data = connstream.recv(1024)1641 # пустые данные означают, что клиент закончил работу с нами1642 while data:1643 if not do_something(connstream, data):1644 # будем считать, что do_something возвращает False1645 # когда мы закончили с клиентом1646 break1647 data = connstream.recv(1024)1648 # закончили с клиентом1649```16501651И возвращаемся к ожиданию новых подключений клиентов (конечно, настоящий сервер вероятно обрабатывал бы каждое клиентское соединение в отдельном потоке или переводил сокеты в [неблокирующий режим](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) и использовал цикл событий).16521653## Примечания о неблокирующих сокетах16541655SSL-сокеты ведут себя несколько иначе, чем обычные сокеты в неблокирующем режиме. При работе с неблокирующими сокетами необходимо учитывать несколько моментов:16561657- Большинство методов [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) возбуждают либо [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError), либо [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError) вместо [`BlockingIOError`](https://python-all.ru/3.11/library/exceptions.html#BlockingIOError), если операция ввода-вывода могла бы заблокироваться. [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError) возбуждается, если необходима операция чтения из базового сокета, а [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError) – для операции записи в базовый сокет. Обратите внимание, что попытки *записи* в SSL-сокет могут сначала потребовать *чтения* из базового сокета, а попытки *чтения* из SSL-сокета могут потребовать предварительной *записи* в базовый сокет.16581659 Изменено в версии 3.5: В более ранних версиях Python метод `SSLSocket.send()` возвращал ноль вместо возбуждения [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError) или [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError).1660- Вызов [`select()`](https://python-all.ru/3.11/library/select.html#select.select) сообщает, что с сокета на уровне ОС можно читать (или в него можно писать), но это не означает, что на верхнем уровне SSL достаточно данных. Например, может прибыть только часть SSL-фрейма. Поэтому необходимо быть готовым обрабатывать ошибки `SSLSocket.recv()` и `SSLSocket.send()` и повторить попытку после очередного вызова [`select()`](https://python-all.ru/3.11/library/select.html#select.select).1661- И наоборот, поскольку уровень SSL имеет собственную структуру фреймов, SSL-сокет может по-прежнему иметь доступные для чтения данные без ведома [`select()`](https://python-all.ru/3.11/library/select.html#select.select). Поэтому сначала следует вызвать `SSLSocket.recv()`, чтобы извлечь все потенциально доступные данные, и затем блокироваться на вызове [`select()`](https://python-all.ru/3.11/library/select.html#select.select) только в случае необходимости.16621663 (конечно, аналогичные меры применимы и при использовании других примитивов, таких как [`poll()`](https://python-all.ru/3.11/library/select.html#select.poll), или из модуля [`selectors`](https://python-all.ru/3.11/library/selectors.html#module-selectors))1664- Само SSL-рукопожатие будет неблокирующим: метод [`SSLSocket.do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake) должен повторяться до тех пор, пока он не выполнится успешно. Вот краткая схема с использованием [`select()`](https://python-all.ru/3.11/library/select.html#select.select) для ожидания готовности сокета:16651666 ```python1667 while True:1668 try:1669 sock.do_handshake()1670 break1671 except ssl.SSLWantReadError:1672 select.select([sock], [], [])1673 except ssl.SSLWantWriteError:1674 select.select([], [sock], [])1675 ```16761677> **См. также**1678>1679> Модуль [`asyncio`](https://python-all.ru/3.11/library/asyncio.html#module-asyncio) поддерживает [неблокирующие SSL-сокеты](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking) и предоставляет API более высокого уровня. Он опрашивает события с помощью модуля [`selectors`](https://python-all.ru/3.11/library/selectors.html#module-selectors) и обрабатывает исключения [`SSLWantWriteError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantWriteError), [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError) и [`BlockingIOError`](https://python-all.ru/3.11/library/exceptions.html#BlockingIOError). Он также выполняет квитирование SSL асинхронно.16801681## Поддержка Memory BIO16821683Новое в версии 3.5.16841685С момента появления модуля SSL в Python 2.6 класс [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) предоставляет две связанные, но различные области функциональности:16861687- Обработка протокола SSL1688- Сетевой ввод-вывод16891690API сетевого ввода-вывода идентичен тому, который предоставляет [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket), от которого также наследует [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket). Это позволяет использовать SSL-сокет в качестве прямой замены обычного сокета, что значительно упрощает добавление поддержки SSL в существующее приложение.16911692Объединение обработки протокола SSL и сетевого ввода-вывода обычно работает хорошо, но есть случаи, когда это не так. Примером являются асинхронные фреймворки ввода-вывода, которые хотят использовать другую модель мультиплексирования ввода-вывода, отличную от модели «select/poll на файловом дескрипторе» (основанной на готовности), которая предполагается [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket) и внутренними процедурами сокетного ввода-вывода OpenSSL. Это в основном актуально для таких платформ, как Windows, где эта модель неэффективна. Для этой цели предоставляется вариант [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) с ограниченной функциональностью, называемый [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject).16931694#### `class ssl.SSLObject`16951696Урезанная версия [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), представляющая экземпляр протокола SSL, не содержащая методов сетевого ввода‑вывода. Этот класс обычно используется разработчиками фреймворков, желающими реализовать асинхронный ввод‑вывод для SSL через буферы памяти.16971698Этот класс реализует интерфейс поверх низкоуровневого объекта SSL, реализованного в OpenSSL. Данный объект хранит состояние SSL-соединения, но сам не обеспечивает никакого сетевого ввода‑вывода. Ввод‑вывод должен выполняться через отдельные объекты «BIO», которые являются уровнем абстракции ввода‑вывода в OpenSSL.16991700У этого класса нет открытого конструктора. Экземпляр [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) должен создаваться с помощью метода [`wrap_bio()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_bio). Этот метод создаст экземпляр [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) и свяжет его с парой BIO. *Входящий* BIO используется для передачи данных из Python в экземпляр протокола SSL, а *исходящий* BIO – для передачи данных в обратном направлении.17011702Доступны следующие методы:17031704- [`context`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.context)1705- [`server_side`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.server_side)1706- [`server_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.server_hostname)1707- [`session`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.session)1708- [`session_reused`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.session_reused)1709- [`read()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.read)1710- [`write()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.write)1711- [`getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert)1712- [`selected_alpn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_alpn_protocol)1713- [`selected_npn_protocol()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.selected_npn_protocol)1714- [`cipher()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.cipher)1715- [`shared_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.shared_ciphers)1716- [`compression()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.compression)1717- [`pending()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.pending)1718- [`do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake)1719- [`verify_client_post_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.verify_client_post_handshake)1720- [`unwrap()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.unwrap)1721- [`get_channel_binding()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.get_channel_binding)1722- [`version()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.version)17231724По сравнению с [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket), у этого объекта отсутствуют следующие возможности:17251726- Любая форма сетевого ввода‑вывода; `recv()` и `send()` читают и пишут только в нижележащие буферы [`MemoryBIO`](https://python-all.ru/3.11/library/ssl.html#ssl.MemoryBIO).1727- Нет механизма *do\_handshake\_on\_connect*. Для запуска рукопожатия всегда нужно вручную вызывать [`do_handshake()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.do_handshake).1728- Нет обработки *suppress\_ragged\_eofs*. Все ситуации конца файла, нарушающие протокол, сообщаются через исключение [`SSLEOFError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLEOFError).1729- Вызов метода [`unwrap()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.unwrap) ничего не возвращает, в отличие от SSL-сокета, где он возвращает нижележащий сокет.1730- Колбэк *server\_name\_callback*, переданный в [`SSLContext.set_servername_callback()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_servername_callback), получит экземпляр [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) вместо экземпляра [`SSLSocket`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket) в качестве первого параметра.17311732Несколько замечаний, касающихся использования [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject):17331734- Весь ввод‑вывод на [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) является [неблокирующим](https://python-all.ru/3.11/library/ssl.html#ssl-nonblocking). Это означает, что, например, [`read()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.read) возбудит исключение [`SSLWantReadError`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLWantReadError), если ему потребуется больше данных, чем доступно во входящем BIO.1735- Для `wrap_bio()` не существует вызова на уровне модуля, в отличие от [`wrap_socket()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_socket). Объект [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) всегда создаётся через [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext).17361737Изменено в версии 3.7: [`SSLObject`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLObject) экземпляры должны создаваться с помощью [`wrap_bio()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.wrap_bio). В предыдущих версиях можно было создавать экземпляры напрямую. Это никогда не документировалось и официально не поддерживалось.17381739SSLObject взаимодействует с внешним миром с помощью буферов памяти. Класс [`MemoryBIO`](https://python-all.ru/3.11/library/ssl.html#ssl.MemoryBIO) предоставляет буфер памяти, который можно использовать для этой цели. Он оборачивает объект OpenSSL memory BIO (Basic IO):17401741#### `class ssl.MemoryBIO`17421743Буфер памяти, который можно использовать для передачи данных между Python и экземпляром протокола SSL.17441745#### `pending`17461747Возвращает количество байтов, находящихся в данный момент в буфере памяти.17481749#### `eof`17501751Логическое значение, указывающее, находится ли память BIO в позиции конца файла.17521753#### `read(n=-1)`17541755Читает до *n* байтов из буфера памяти. Если *n* не указан или отрицателен, возвращаются все байты.17561757#### `write(buf)`17581759Записывает байты из *buf* в память BIO. Аргумент *buf* должен быть объектом, поддерживающим протокол буфера.17601761Возвращаемое значение – количество записанных байтов, которое всегда равно длине *buf*.17621763#### `write_eof()`17641765Записывает маркер конца файла (EOF) в память BIO. После вызова этого метода нельзя вызывать [`write()`](https://python-all.ru/3.11/library/ssl.html#ssl.MemoryBIO.write). Атрибут [`eof`](https://python-all.ru/3.11/library/ssl.html#ssl.MemoryBIO.eof) станет истинным после того, как все данные в буфере будут прочитаны.17661767## SSL-сеанс17681769Новое в версии 3.6.17701771#### `class ssl.SSLSession`17721773Объект сеанса, используемый [`session`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.session).17741775#### `id`17761777#### `time`17781779#### `timeout`17801781#### `ticket_lifetime_hint`17821783#### `has_ticket`17841785## Соображения безопасности17861787### Рекомендуемые настройки по умолчанию17881789Для **клиентского использования**, при отсутствии особых требований к политике безопасности, настоятельно рекомендуется применять функцию [`create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) для создания SSL-контекста. Она загрузит доверенные сертификаты ЦС системы, включит проверку сертификатов и имени хоста, а также попытается выбрать достаточно безопасные настройки протокола и шифров.17901791Например, вот как можно использовать класс [`smtplib.SMTP`](https://python-all.ru/3.11/library/smtplib.html#smtplib.SMTP) для создания доверенного защищённого соединения с SMTP-сервером:17921793```python1794>>> import ssl, smtplib1795>>> smtp = smtplib.SMTP("mail.python.org", port=587)1796>>> context = ssl.create_default_context()1797>>> smtp.starttls(context=context)1798(220, b'2.0.0 Ready to start TLS')1799```18001801Если для соединения требуется клиентский сертификат, его можно добавить с помощью [`SSLContext.load_cert_chain()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_cert_chain).18021803Напротив, при создании SSL-контекста через вызов конструктора [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) самостоятельно, в нём по умолчанию не будут включены ни проверка сертификатов, ни проверка имени хоста. В этом случае следует прочитать приведённые ниже абзацы, чтобы достичь хорошего уровня безопасности.18041805### Ручная настройка18061807#### Проверка сертификатов18081809При непосредственном вызове конструктора [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext) значением по умолчанию является [`CERT_NONE`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_NONE). Поскольку он не аутентифицирует другую сторону, это может быть небезопасно, особенно в режиме клиента, где в большинстве случаев хотелось бы убедиться в подлинности сервера, с которым ведётся общение. Поэтому в режиме клиента настоятельно рекомендуется использовать [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED). Однако сам по себе он этого не гарантирует; необходимо также проверить, что сертификат сервера, который можно получить вызовом [`SSLSocket.getpeercert()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.getpeercert), соответствует нужному сервису. Для многих протоколов и приложений сервис можно определить по имени хоста; в этом случае можно использовать функцию [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname). Эта стандартная проверка выполняется автоматически, когда включён [`SSLContext.check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname).18101811Изменено в версии 3.7: Сопоставление имён хостов теперь выполняется библиотекой OpenSSL. Python больше не использует [`match_hostname()`](https://python-all.ru/3.11/library/ssl.html#ssl.match_hostname).18121813В серверном режиме, чтобы аутентифицировать клиентов на уровне SSL (а не с помощью механизма аутентификации более высокого уровня), необходимо также указать [`CERT_REQUIRED`](https://python-all.ru/3.11/library/ssl.html#ssl.CERT_REQUIRED) и аналогично проверить сертификат клиента.18141815#### Версии протоколов18161817Версии SSL 2 и 3 считаются небезопасными и поэтому опасны для использования. Для обеспечения максимальной совместимости между клиентами и серверами рекомендуется использовать в качестве версии протокола [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) или [`PROTOCOL_TLS_SERVER`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_SERVER). SSLv2 и SSLv3 отключены по умолчанию.18181819```python1820>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)1821>>> client_context.minimum_version = ssl.TLSVersion.TLSv1_31822>>> client_context.maximum_version = ssl.TLSVersion.TLSv1_31823```18241825Созданный выше SSL-контекст разрешает только подключения к серверу по TLSv1.3 и новее (если это поддерживается системой). [`PROTOCOL_TLS_CLIENT`](https://python-all.ru/3.11/library/ssl.html#ssl.PROTOCOL_TLS_CLIENT) подразумевает проверку сертификата и имени хоста по умолчанию. В контекст необходимо загрузить сертификаты.18261827#### Выбор шифров18281829При наличии повышенных требований к безопасности точная настройка шифров, используемых при согласовании SSL-сеанса, возможна с помощью метода [`SSLContext.set_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_ciphers). Начиная с Python 3.2.3 модуль ssl отключает некоторые слабые шифры по умолчанию, но может потребоваться дополнительно ограничить выбор шифров. Обязательно прочтите документацию OpenSSL о [формате списка шифров](https://python-all.ru/3.11/library/ssl.html). Чтобы проверить, какие шифры разрешены для данного списка шифров, используйте [`SSLContext.get_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.get_ciphers) или команду `openssl ciphers` в системе.18301831### Многопроцессная работа18321833При использовании этого модуля в составе многопроцессного приложения (с помощью, например, модулей [`multiprocessing`](https://python-all.ru/3.11/library/multiprocessing.html#module-multiprocessing) или [`concurrent.futures`](https://python-all.ru/3.11/library/concurrent.futures.html#module-concurrent.futures)) следует учитывать, что внутренний генератор случайных чисел OpenSSL некорректно обрабатывает порождённые процессы. Приложения должны изменять состояние PRNG родительского процесса, если они используют любую функцию SSL с [`os.fork()`](https://python-all.ru/3.11/library/os.html#os.fork). Любого успешного вызова [`RAND_add()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_add), [`RAND_bytes()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_bytes) или [`RAND_pseudo_bytes()`](https://python-all.ru/3.11/library/ssl.html#ssl.RAND_pseudo_bytes) достаточно.18341835## TLS 1.318361837Добавлено в версии 3.7.18381839Протокол TLS 1.3 ведёт себя несколько иначе, чем предыдущие версии TLS/SSL. Некоторые новые возможности TLS 1.3 пока недоступны.18401841- TLS 1.3 использует отдельный набор наборов шифров. Все наборы шифров AES-GCM и ChaCha20 включены по умолчанию. Метод [`SSLContext.set_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.set_ciphers) пока не может включать или отключать шифры TLS 1.3, но [`SSLContext.get_ciphers()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.get_ciphers) возвращает их.1842- Сессионные билеты больше не отправляются в составе исходного рукопожатия и обрабатываются иначе. [`SSLSocket.session`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSocket.session) и [`SSLSession`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLSession) несовместимы с TLS 1.3.1843- Сертификаты клиента также больше не проверяются во время начального рукопожатия. Сервер может запросить сертификат в любой момент. Клиенты обрабатывают запросы сертификатов во время отправки или получения данных приложения от сервера.1844- Возможности TLS 1.3, такие как ранние данные, отложенный запрос клиентского сертификата TLS, настройка алгоритма подписи и смена ключей, пока не поддерживаются.18451846> **См. также**1847>1848> **Класс [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket)**1849>1850> Документация базового класса [`socket`](https://python-all.ru/3.11/library/socket.html#module-socket)1851>1852> **[SSL/TLS: надёжное шифрование. Введение](https://python-all.ru/3.11/library/ssl.html)**1853>1854> Введение из документации Apache HTTP Server1855>1856> **[**RFC 1422: Улучшение конфиденциальности для электронной почты в Интернете: Часть II: Управление ключами на основе сертификатов**](https://python-all.ru/3.11/library/ssl.html)**1857>1858> Steve Kent1859>1860> **[**RFC 4086: Требования к случайности для обеспечения безопасности**](https://python-all.ru/3.11/library/ssl.html)**1861>1862> Donald E., Jeffrey I. Schiller1863>1864> **[**RFC 5280: Профиль инфраструктуры открытых ключей X.509 Интернета: сертификаты и списки отзыва сертификатов (CRL)**](https://python-all.ru/3.11/library/ssl.html)**1865>1866> D. Cooper1867>1868> **[**RFC 5246: Протокол безопасности транспортного уровня (TLS) версии 1.2**](https://python-all.ru/3.11/library/ssl.html)**1869>1870> T. Dierks et. al.1871>1872> **[**RFC 6066: Расширения безопасности транспортного уровня (TLS)**](https://python-all.ru/3.11/library/ssl.html)**1873>1874> D. Eastlake1875>1876> **[IANA TLS: Параметры безопасности транспортного уровня (TLS)](https://python-all.ru/3.11/library/ssl.html)**1877>1878> IANA1879>1880> **[**RFC 7525: Рекомендации по безопасному использованию безопасности транспортного уровня (TLS) и безопасности дейтаграммного транспортного уровня (DTLS)**](https://python-all.ru/3.11/library/ssl.html)**1881>1882> IETF1883>1884> **[Рекомендации Mozilla по TLS на стороне сервера](https://python-all.ru/3.11/library/ssl.html)**1885>1886> Mozilla1887