ssl — Обёртка TLS/SSL для сокетов
Исходный код: Lib/ssl.py
Этот модуль предоставляет доступ к средствам шифрования Transport Layer Security (часто называемого «Secure Sockets Layer») и аутентификации участников для сетевых сокетов, как на стороне клиента, так и на стороне сервера. Этот модуль использует библиотеку OpenSSL. Он доступен на всех современных Unix-системах, Windows, macOS и, вероятно, на дополнительных платформах, при условии установки OpenSSL на этой платформе.
Примечание
Некоторые особенности могут зависеть от платформы, поскольку вызовы выполняются к API сокетов операционной системы. Установленная версия OpenSSL также может влиять на поведение. Например, TLSv1.3 с OpenSSL версии 1.1.1.
Предупреждение
Не используйте этот модуль, не прочитав Рекомендации по безопасности. Это может привести к ложному чувству безопасности, поскольку значения по умолчанию модуля ssl не обязательно подходят для вашего приложения.
В этом разделе документируются объекты и функции в модуле ssl; для получения более общей информации о TLS, SSL и сертификатах, обратитесь к документации в разделе «См. также» внизу.
Этот модуль предоставляет класс ssl.SSLSocket, который является производным от типа socket.socket и предоставляет обёртку для сокета, которая также шифрует и дешифрует данные, передаваемые по сокету с использованием SSL. Он поддерживает дополнительные методы, такие как getpeercert(), который извлекает сертификат другой стороны соединения, и cipher(), который извлекает шифр, используемый для защищённого соединения.
Для более сложных приложений класс ssl.SSLContext помогает управлять настройками и сертификатами, которые затем могут быть унаследованы сокетами SSL, созданными с помощью метода SSLContext.wrap_socket().
Изменено в версии 3.5.3: Обновлено для поддержки связывания с OpenSSL 1.1.0
Изменено в версии 3.6: OpenSSL 0.9.8, 1.0.0 и 1.0.1 устарели и больше не поддерживаются. В будущем модуль ssl будет требовать как минимум OpenSSL 1.0.2 или 1.1.0.
Изменено в версии 3.10: PEP 644 реализован. Модуль ssl требует OpenSSL 1.1.1 или более поздней версии.
Использование устаревших констант и функций приводит к предупреждениям об устаревании.
Функции, константы и исключения
Создание сокета
Начиная с Python 3.2 и 2.7.9, рекомендуется использовать метод SSLContext.wrap_socket() экземпляра SSLContext для преобразования сокетов в объекты SSLSocket. Вспомогательная функция create_default_context() возвращает новый контекст с безопасными значениями по умолчанию. Старая функция wrap_socket() устарела, так как она неэффективна и не поддерживает указание имени сервера (SNI) и сопоставление имён хостов.
Пример сокета клиента с контекстом по умолчанию и двойной стековой поддержкой IPv4/IPv6:
import socket
import ssl
hostname = 'www.python.org'
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Пример сокета клиента с настраиваемым контекстом и IPv4:
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Пример сокета сервера, прослушивающего localhost IPv4:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
sock.bind(('127.0.0.1', 8443))
sock.listen(5)
with context.wrap_socket(sock, server_side=True) as ssock:
conn, addr = ssock.accept()
...
Создание контекста
Вспомогательная функция помогает создавать объекты SSLContext для общих целей.
-
ssl.create_default_context(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None) -
Возвращает новый объект
SSLContextс настройками по умолчанию для заданной цели. Настройки выбираются модулемsslи обычно представляют более высокий уровень безопасности, чем при прямом вызове конструктораSSLContext.cafile, capath, cadata представляют необязательные сертификаты УЦ для проверки сертификатов, как в
SSLContext.load_verify_locations(). Если все три равныNone, эта функция может выбрать доверие к сертификатам УЦ по умолчанию системы.Настройки:
PROTOCOL_TLS_CLIENTилиPROTOCOL_TLS_SERVER,OP_NO_SSLv2иOP_NO_SSLv3с мощными наборами шифров без RC4 и без неаутентифицированных наборов шифров. ПередачаSERVER_AUTHкак цели устанавливаетverify_modeвCERT_REQUIREDи либо загружает сертификаты УЦ (если задан хотя бы один из cafile, capath или cadata), либо используетSSLContext.load_default_certs()для загрузки сертификатов УЦ по умолчанию.Когда
keylog_filenameподдерживается и переменная окруженияSSLKEYLOGFILEустановлена,create_default_context()включает протоколирование ключей.Примечание
Протокол, опции, шифры и другие настройки могут быть изменены на более жёсткие значения в любое время без предварительного уведомления об устаревании. Значения представляют собой разумный баланс между совместимостью и безопасностью.
Если ваше приложение нуждается в конкретных настройках, вы должны создать
SSLContextи применить их самостоятельно.Примечание
Если вы обнаружите, что при попытке подключения некоторых устаревших клиентов или серверов к
SSLContext, созданному этой функцией, возникает ошибка «Несовпадение протокола или набора шифров», возможно, они поддерживают только SSL3.0, который эта функция исключает с помощьюOP_NO_SSLv3. SSL3.0 широко считается полностью небезопасным. Если вы всё ещё хотите продолжить использование этой функции, но разрешить подключения SSL 3.0, вы можете повторно включить их, используя:ctx = ssl.create_default_context(Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3
Новое в версии 3.4.
Изменено в версии 3.4.4: RC4 был исключён из стандартного набора шифров.
Изменено в версии 3.6: ChaCha20/Poly1305 был добавлен в стандартный набор шифров.
3DES был исключён из стандартного набора шифров.
Изменено в версии 3.8: Была добавлена поддержка протоколирования ключей в
SSLKEYLOGFILE.Изменено в версии 3.10: Контекст теперь использует протокол
PROTOCOL_TLS_CLIENTилиPROTOCOL_TLS_SERVERвместо универсальногоPROTOCOL_TLS.
Исключения
-
exception ssl.SSLError -
Вызывается для сигнализации об ошибке в базовой реализации SSL (в настоящее время предоставляемой библиотекой OpenSSL). Это указывает на проблему в более высоком уровне шифрования и аутентификации, наложенной на базовое сетевое соединение. Эта ошибка является подтипом
OSError. Код ошибки и сообщение экземпляровSSLErrorпредоставляются библиотекой OpenSSL.Изменено в версии 3.3:
SSLErrorраньше была подтипомsocket.error.-
library -
Мемоническая строка, обозначающая подмодуль OpenSSL, в котором произошла ошибка, например,
SSL,PEMилиX509. Диапазон возможных значений зависит от версии OpenSSL.Введено в версии 3.3.
-
reason -
Мемоническая строка, обозначающая причину возникновения этой ошибки, например
CERTIFICATE_VERIFY_FAILED. Диапазон возможных значений зависит от версии OpenSSL.Введено в версии 3.3.
-
-
exception ssl.SSLZeroReturnError -
Подкласс
SSLError, вызываемый при попытке чтения или записи, когда SSL-соединение было корректно закрыто. Обратите внимание, что это не означает, что базовый транспорт (TCP) был закрыт.Введено в версии 3.3.
-
exception ssl.SSLWantReadError -
Подкласс
SSLError, вызываемый неблокирующим SSL-сокeтом при попытке чтения или записи данных, но для выполнения запроса требуется получить больше данных по базовому TCP-транспорту.Введено в версии 3.3.
-
exception ssl.SSLWantWriteError -
Подкласс
SSLError, вызываемый неблокирующим SSL-сокeтом при попытке чтения или записи данных, но для выполнения запроса требуется отправить больше данных по базовому TCP-транспорту.Введено в версии 3.3.
-
exception ssl.SSLSyscallError -
Подкласс
SSLError, вызываемый при возникновении системной ошибки при попытке выполнения операции на SSL-сокете. К сожалению, нет простого способа проверить исходное значение errno.Введено в версии 3.3.
-
exception ssl.SSLEOFError -
Подкласс
SSLError, вызываемый при внезапном завершении SSL-соединения. Обычно не следует пытаться повторно использовать базовый транспорт при обнаружении этой ошибки.Введено в версии 3.3.
-
exception ssl.SSLCertVerificationError -
Подкласс
SSLError, вызываемый при сбое проверки сертификата.Введено в версии 3.7.
-
verify_code -
Числовое значение кода ошибки проверки.
-
verify_message -
Строка с удобочитаемым сообщением об ошибке проверки.
-
-
exception ssl.CertificateError -
Псевдоним для
SSLCertVerificationError.Изменено в версии 3.7: Исключение теперь является псевдонимом для
SSLCertVerificationError.
Генерация случайных чисел
-
ssl.RAND_bytes(num) -
Возвращает num криптографически безопасных псевдослучайных байтов. Вызывает
SSLError, если генератор псевдослучайных чисел (ПСПЧ) не был инициализирован достаточным количеством данных или если операция не поддерживается текущим методом RAND.RAND_status()можно использовать для проверки состояния ПСПЧ, аRAND_add()— для инициализации ПСПЧ.Для почти всех применений предпочтительнее использовать
os.urandom().Прочитайте статью в Википедии, Cryptographically secure pseudorandom number generator (CSPRNG), чтобы узнать о требованиях к криптографически сильному генератору.
Введено в версии 3.3.
-
ssl.RAND_pseudo_bytes(num) -
Возвращает (байты, is_cryptographic): байты — это num псевдослучайных байтов, is_cryptographic —
Trueесли сгенерированные байты криптографически безопасны. ВызываетSSLError, если операция не поддерживается текущим методом RAND.Сгенерированные последовательности псевдослучайных байтов будут уникальными, если они достаточной длины, но не обязательно предсказуемыми. Их можно использовать для некриптографических целей и для определенных целей в криптографических протоколах, но обычно не для генерации ключей и т. д.
Для почти всех применений предпочтительнее использовать
os.urandom().Введено в версии 3.3.
Устарело начиная с версии 3.6: OpenSSL устарел
ssl.RAND_pseudo_bytes(), используйтеssl.RAND_bytes()вместо него.
-
ssl.RAND_status() -
Возвращает
True, если SSL-генератор псевдослучайных чисел был инициализирован достаточным количеством случайных данных, иFalseв противном случае. Для увеличения случайности генератора псевдослучайных чисел можно использоватьssl.RAND_egd()иssl.RAND_add().
-
ssl.RAND_add(bytes, entropy) -
Включает заданные байты в SSL-генератор псевдослучайных чисел. Параметр entropy (вещественное число) — это нижняя граница энтропии, содержащейся в строке (поэтому вы всегда можете использовать
0.0). См. RFC 1750 для получения дополнительной информации о источниках энтропии.Изменено в версии 3.5: Теперь принимается записываемый bytes-подобный объект.
Обработка сертификатов
-
ssl.match_hostname(cert, hostname) -
Проверьте, что cert (в декодированном формате, как возвращается
SSLSocket.getpeercert()) соответствует заданному hostname. Применяемые правила соответствуют правилам проверки подлинности серверов HTTPS, описанным в RFC 2818, RFC 5280 и RFC 6125. Помимо HTTPS, эта функция подходит для проверки подлинности серверов в различных протоколах на основе SSL, таких как FTPS, IMAPS, POPS и других.CertificateErrorгенерируется при ошибке. При успешном выполнении функция ничего не возвращает:>>> cert = {'subject': ((('commonName', 'example.com'),),)} >>> ssl.match_hostname(cert, "example.com") >>> ssl.match_hostname(cert, "example.org") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/py3k/Lib/ssl.py", line 130, in match_hostname ssl.CertificateError: hostname 'example.org' doesn't match 'example.com'Введена в версии 3.2.
Изменено в версии 3.3.3: Функция теперь соответствует RFC 6125, раздел 6.4.3 и не соответствует нескольким подстановочным знакам (например,
*.*.comили*a*.example.org) или подстановочному знаку внутри фрагмента международного доменного имени (IDN). Метки IDN A-labels, такие какwww*.xn--pthon-kva.orgпо-прежнему поддерживаются, ноx*.python.orgбольше не соответствуетxn--tda.python.org.Изменено в версии 3.5: Теперь поддерживается соответствие IP-адресов, если они присутствуют в поле subjectAltName сертификата.
Изменено в версии 3.7: Функция больше не используется для подключений TLS. Сопоставление имен хостов теперь выполняется OpenSSL.
Поддержка подстановочных знаков разрешена, когда это самый левый и единственный символ в этом сегменте. Частичные подстановочные знаки, такие как
www*.example.comбольше не поддерживаются.Устарело начиная с версии 3.7.
-
ssl.cert_time_to_seconds(cert_time) -
Возвращает время в секундах с эпохи, заданное строкой
cert_time, представляющей дату «notBefore» или «notAfter» из сертификата в формате"%b %d %H:%M:%S %Y %Z"strptime (C locale).Вот пример:
>>> import ssl >>> timestamp = ssl.cert_time_to_seconds("Jan 5 09:34:43 2018 GMT") >>> timestamp 1515144883 >>> from datetime import datetime >>> print(datetime.utcfromtimestamp(timestamp)) 2018-01-05 09:34:43Даты «notBefore» или «notAfter» должны использовать GMT (RFC 5280).
Изменено в версии 3.5: Интерпретирует введённое время как время в UTC, как указано в строке ввода часовым поясом «GMT». Предыдущая версия использовала часовой пояс по умолчанию. Возвращает целое число (нет дробных секунд в формате ввода)
-
ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None[, timeout]) -
Получает сертификат сервера, защищенного SSL, по заданному адресу
addr, в виде пары (hostname, номер_порта), и возвращает его в виде PEM-кодированной строки. Еслиssl_versionуказано, используется эта версия протокола SSL для подключения к серверу. Еслиca_certsуказано, это файл, содержащий список корневых сертификатов, в том же формате, что и для того же параметра вSSLContext.wrap_socket(). Вызов попытается проверить сертификат сервера по этому набору корневых сертификатов и завершится ошибкой, если проверка не удастся. Таймаут можно задать с помощью параметраtimeout.Изменено в версии 3.3: Эта функция теперь совместима с IPv6.
Изменено в версии 3.5: Значение по умолчанию для ssl_version изменено с
PROTOCOL_SSLv3наPROTOCOL_TLSдля максимальной совместимости с современными серверами.Изменено в версии 3.10: Добавлен параметр timeout.
-
ssl.DER_cert_to_PEM_cert(DER_cert_bytes) -
Принимает сертификат в формате DER и возвращает его в PEM-формате.
-
ssl.PEM_cert_to_DER_cert(PEM_cert_string) -
Принимает сертификат в формате PEM и возвращает его в формате DER.
-
ssl.get_default_verify_paths() -
Возвращает кортеж с путями к файлам cafile и capath по умолчанию OpenSSL. Пути такие же, как используемые
SSLContext.set_default_verify_paths(). Результат – именованный кортежDefaultVerifyPaths:-
cafile– абсолютный путь к файлу cafile илиNoneесли файл не существует, -
capath– абсолютный путь к директории capath илиNoneесли директория не существует, -
openssl_cafile_env– переменная окружения OpenSSL, указывающая на cafile, -
openssl_cafile– жестко заданный путь к cafile, -
openssl_capath_env– переменная окружения OpenSSL, указывающая на capath, -
openssl_capath– жестко заданный путь к директории capath
Доступность: LibreSSL игнорирует переменные окружения
openssl_cafile_envиopenssl_capath_env.Введена в версии 3.4.
-
-
ssl.enum_certificates(store_name) -
Получает сертификаты из хранилища сертификатов системы Windows. store_name может быть одним из
CA,ROOTилиMY. Windows может предоставлять дополнительные хранилища сертификатов.Функция возвращает список кортежей (cert_bytes, encoding_type, trust). encoding_type определяет кодировку cert_bytes. Она может быть
x509_asnдля данных X.509 ASN.1 илиpkcs_7_asnдля данных PKCS#7 ASN.1. Trust определяет назначение сертификата как набор OIDS или точноTrueесли сертификат надёжен для всех целей.Пример:
>>> ssl.enum_certificates("CA") [(b'data...', 'x509_asn', {'1.3.6.1.5.5.7.3.1', '1.3.6.1.5.5.7.3.2'}), (b'data...', 'x509_asn', True)]Доступность: Windows.
Введена в версии 3.4.
-
ssl.enum_crls(store_name) -
Получает CRL из хранилища сертификатов системы Windows. store_name может быть одним из
CA,ROOTилиMY. Windows может предоставлять дополнительные хранилища сертификатов.Функция возвращает список кортежей (cert_bytes, encoding_type, trust). Encoding_type определяет кодировку cert_bytes. Она может быть
x509_asnдля данных X.509 ASN.1 илиpkcs_7_asnдля данных PKCS#7 ASN.1.Доступность: Windows.
Введена в версии 3.4.
-
ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version=PROTOCOL_TLS, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True, ciphers=None) -
Принимает экземпляр
socksocket.socketи возвращает экземплярssl.SSLSocket, подтипsocket.socket, который оборачивает базовое сокетное соединение в контексте SSL.sockдолжен быть сокетом типаSOCK_STREAM; другие типы сокетов не поддерживаются.Внутри функция создаёт
SSLContextс протоколом ssl_version иSSLContext.options, установленным в cert_reqs. Если параметры keyfile, certfile, ca_certs или ciphers заданы, их значения передаются вSSLContext.load_cert_chain(),SSLContext.load_verify_locations()иSSLContext.set_ciphers().Аргументы server_side, do_handshake_on_connect и suppress_ragged_eofs имеют то же значение, что и
SSLContext.wrap_socket().Устарело начиная с версии 3.7: С Python 3.2 и 2.7.9 рекомендуется использовать
SSLContext.wrap_socket()вместоwrap_socket(). Функция верхнего уровня ограничена и создаёт небезопасный клиентский сокет без указания имени сервера или соответствия имени хоста.
Постоянные
Все константы теперь являются коллекциями enum.IntEnum или enum.IntFlag.
Новое в версии 3.6.
-
ssl.CERT_NONE -
Возможные значения для
SSLContext.verify_modeили параметраcert_reqsдляwrap_socket(). За исключениемPROTOCOL_TLS_CLIENT, это режим по умолчанию. В клиентском сокете принимается практически любой сертификат. Ошибки валидации, такие как недоверенный или истекший сертификат, игнорируются и не прерывают рукопожатие TLS/SSL.В режиме сервера от клиента не запрашивается сертификат, поэтому клиент не отправляет его для аутентификации клиентского сертификата.
См. обсуждение Соображения по безопасности ниже.
-
ssl.CERT_OPTIONAL -
Возможные значения для
SSLContext.verify_modeили параметраcert_reqsдляwrap_socket(). В клиентском режимеCERT_OPTIONALимеет то же значение, что иCERT_REQUIRED. Рекомендуется использоватьCERT_REQUIREDдля клиентских сокетов вместо этого.В режиме сервера клиенту отправляется запрос на предоставление клиентского сертификата. Клиент может проигнорировать запрос или предоставить сертификат для выполнения аутентификации клиентского сертификата TLS. Если клиент предоставляет сертификат, он проверяется. Любая ошибка проверки сразу прерывает рукопожатие TLS.
Для использования этого параметра необходимо передать действительный набор сертификатов CA, либо в
SSLContext.load_verify_locations(), либо как значение параметраca_certsдляwrap_socket().
-
ssl.CERT_REQUIRED -
Возможные значения для
SSLContext.verify_modeили параметраcert_reqsдляwrap_socket(). В этом режиме сертификаты требуются от другой стороны соединения сокета; если сертификат не предоставлен или его проверка завершается неудачей, будет возбуждено исключениеSSLError. Этот режим не является достаточным для проверки сертификата в клиентском режиме, так как он не соответствует именам хостов.check_hostnameтакже должен быть включен для проверки подлинности сертификата.PROTOCOL_TLS_CLIENTиспользуетCERT_REQUIREDи включаетcheck_hostnameпо умолчанию.В случае сокета сервера этот режим обеспечивает обязательную аутентификацию клиентского сертификата TLS. Клиенту отправляется запрос на предоставление клиентского сертификата, и клиент должен предоставить действительный и доверенный сертификат.
Для использования этого параметра необходимо передать действительный набор сертификатов CA, либо в
SSLContext.load_verify_locations(), либо как значение параметраca_certsдляwrap_socket().
-
class ssl.VerifyMode -
Коллекция констант CERT_* из
enum.IntEnum.Новое в версии 3.6.
-
ssl.VERIFY_DEFAULT -
Возможные значения для
SSLContext.verify_flags. В этом режиме списки отозывов сертификатов (CRL) не проверяются. По умолчанию OpenSSL не требует и не проверяет CRL.Новое в версии 3.4.
-
ssl.VERIFY_CRL_CHECK_LEAF -
Возможные значения для
SSLContext.verify_flags. В этом режиме проверяется только сертификат узла, но не промежуточные сертификаты CA. Для этого режима требуется действительный CRL, подписанный издателем сертификата узла (его непосредственным предком CA). Если с помощьюSSLContext.load_verify_locationsне загружен соответствующий CRL, проверка завершится неудачей.Новое в версии 3.4.
-
ssl.VERIFY_CRL_CHECK_CHAIN -
Возможные значения для
SSLContext.verify_flags. В этом режиме проверяются CRL всех сертификатов в цепочке сертификатов узла.Новое в версии 3.4.
-
ssl.VERIFY_X509_STRICT -
Возможные значения для
SSLContext.verify_flagsдля отключения решений для поврежденных сертификатов X.509.Новое в версии 3.4.
-
ssl.VERIFY_ALLOW_PROXY_CERTS -
Возможные значения для
SSLContext.verify_flagsдля включения проверки сертификатов прокси.Новое в версии 3.10.
-
ssl.VERIFY_X509_TRUSTED_FIRST -
Возможные значения для
SSLContext.verify_flags. Оно указывает OpenSSL предпочитать доверенные сертификаты при построении цепочки доверия для проверки сертификата. Этот флаг включен по умолчанию.Новое в версии 3.4.4.
-
ssl.VERIFY_X509_PARTIAL_CHAIN -
Возможные значения для
SSLContext.verify_flags. Оно указывает OpenSSL принимать промежуточные CA в хранилище доверия как анкеры доверия, так же как самоподписанные корневые сертификаты CA. Это позволяет доверять сертификатам, выпущенным промежуточным CA, без доверия к их корневому предку CA.Новое в версии 3.10.
-
class ssl.VerifyFlags -
Коллекция констант VERIFY_* из
enum.IntFlag.Новое в версии 3.6.
-
ssl.PROTOCOL_TLS -
Выбирает самую высокую версию протокола, поддерживаемую как клиентом, так и сервером. Несмотря на название, этот параметр может выбрать как протоколы «SSL», так и «TLS».
Новое в версии 3.6.
Устарело начиная с версии 3.10: Клиенты и серверы TLS требуют различных параметров по умолчанию для безопасного взаимодействия. Общая константа протокола TLS устарела в пользу
PROTOCOL_TLS_CLIENTиPROTOCOL_TLS_SERVER.
-
ssl.PROTOCOL_TLS_CLIENT -
Автоматически переключается на самую высокую версию протокола, поддерживаемую как клиентом, так и сервером, и настраивает контекст для клиентских соединений. Протокол включает
CERT_REQUIREDиcheck_hostnameпо умолчанию.Новое в версии 3.6.
-
ssl.PROTOCOL_TLS_SERVER -
Автоматически переключается на самую высокую версию протокола, поддерживаемую как клиентом, так и сервером, и настраивает контекст для серверных соединений.
Новое в версии 3.6.
-
ssl.PROTOCOL_SSLv23 -
Псевдоним для
PROTOCOL_TLS.Устарело начиная с версии 3.6: Используйте
PROTOCOL_TLSвместо этого.
-
ssl.PROTOCOL_SSLv2 -
Выбирает протокол шифрования канала SSL версии 2.
Этот протокол недоступен, если OpenSSL скомпилирован с опцией
no-ssl2.Предупреждение
SSL версия 2 небезопасна. Её использование крайне не рекомендуется.
Устарело начиная с версии 3.6: Поддержка SSLv2 удалена из OpenSSL.
-
ssl.PROTOCOL_SSLv3 -
Выбирает протокол шифрования канала SSL версии 3.
Этот протокол недоступен, если OpenSSL скомпилирован с опцией
no-ssl3.Предупреждение
SSL версия 3 небезопасна. Её использование крайне не рекомендуется.
Устарело начиная с версии 3.6: OpenSSL устарел все протоколы, специфичные к версии. Используйте вместо этого стандартный протокол
PROTOCOL_TLS_SERVERилиPROTOCOL_TLS_CLIENTсSSLContext.minimum_versionиSSLContext.maximum_version.
-
ssl.PROTOCOL_TLSv1 -
Выбирает протокол шифрования канала TLS версии 1.0.
Устарело начиная с версии 3.6: OpenSSL устарел все протоколы, специфичные к версии.
-
ssl.PROTOCOL_TLSv1_1 -
Выбирает протокол шифрования канала TLS версии 1.1. Доступен только с версией OpenSSL 1.0.1+.
Новое в версии 3.4.
Устарело начиная с версии 3.6: OpenSSL устарел все протоколы, специфичные к версии.
-
ssl.PROTOCOL_TLSv1_2 -
Выбирает протокол шифрования канала TLS версии 1.2. Доступен только с версией OpenSSL 1.0.1+.
Новое в версии 3.4.
Устарело начиная с версии 3.6: OpenSSL устарел все протоколы, специфичные к версии.
-
ssl.OP_ALL -
Включает обходные пути для различных ошибок, присутствующих в других реализациях SSL. Эта опция включена по умолчанию. Она не обязательно устанавливает те же флаги, что и константа OpenSSL
SSL_OP_ALL.Новое в версии 3.2.
-
ssl.OP_NO_SSLv2 -
Запрещает подключение SSLv2. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору SSLv2 в качестве версии протокола удалёнными узлами.Новое в версии 3.2.
Устарело начиная с версии 3.6: SSLv2 устарел
-
ssl.OP_NO_SSLv3 -
Запрещает подключение SSLv3. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору SSLv3 в качестве версии протокола удалёнными узлами.Новое в версии 3.2.
Устарело начиная с версии 3.6: SSLv3 устарел
-
ssl.OP_NO_TLSv1 -
Запрещает подключение TLSv1. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору TLSv1 в качестве версии протокола удалёнными узлами.Новое в версии 3.2.
Устарело начиная с версии 3.7: Опция устарела с OpenSSL 1.1.0, используйте новые
SSLContext.minimum_versionиSSLContext.maximum_versionвместо неё.
-
ssl.OP_NO_TLSv1_1 -
Запрещает подключение TLSv1.1. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору TLSv1.1 в качестве версии протокола удалёнными узлами. Доступен только с версией OpenSSL 1.0.1+.Новое в версии 3.4.
Устарело начиная с версии 3.7: Опция устарела с OpenSSL 1.1.0.
-
ssl.OP_NO_TLSv1_2 -
Запрещает подключение TLSv1.2. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору TLSv1.2 в качестве версии протокола удалёнными узлами. Доступен только с версией OpenSSL 1.0.1+.Новое в версии 3.4.
Устарело начиная с версии 3.7: Опция устарела с OpenSSL 1.1.0.
-
ssl.OP_NO_TLSv1_3 -
Запрещает подключение TLSv1.3. Эта опция применима только совместно с
PROTOCOL_TLS. Она препятствует выбору TLSv1.3 в качестве версии протокола удалёнными узлами. TLS 1.3 доступен с OpenSSL 1.1.1 или новее. Если Python был скомпилирован с более старой версией OpenSSL, флаг по умолчанию равен 0.Новое в версии 3.7.
Устарело начиная с версии 3.7: Опция устарела с OpenSSL 1.1.0. Она была добавлена в 2.7.15, 3.6.3 и 3.7.0 для обратной совместимости с OpenSSL 1.0.2.
-
ssl.OP_NO_RENEGOTIATION -
Отключает все переподключения в TLSv1.2 и ранее. Не отправлять сообщения HelloRequest и игнорировать запросы на переподключение через ClientHello.
Эта опция доступна только с OpenSSL 1.1.0h и новее.
Новое в версии 3.7.
-
ssl.OP_CIPHER_SERVER_PREFERENCE -
Использовать предпочтения порядка шифров сервера, а не клиента. Эта опция не имеет эффекта для клиентских сокетов и серверных сокетов SSLv2.
Новое в версии 3.3.
-
ssl.OP_SINGLE_DH_USE -
Запрещает повторное использование того же ключа DH для разных сессий SSL. Это улучшает секретность вперёд, но требует больше вычислительных ресурсов. Эта опция применяется только к серверным сокетам.
Новое в версии 3.3.
-
ssl.OP_SINGLE_ECDH_USE -
Запрещает повторное использование того же ключа ECDH для разных сессий SSL. Это улучшает секретность вперёд, но требует больше вычислительных ресурсов. Эта опция применяется только к серверным сокетам.
Новое в версии 3.3.
-
ssl.OP_ENABLE_MIDDLEBOX_COMPAT -
Отправлять фиктивные сообщения Change Cipher Spec (CCS) в рукопожатии TLS 1.3, чтобы подключение TLS 1.3 выглядело более похожим на подключение TLS 1.2.
Эта опция доступна только с OpenSSL 1.1.1 и новее.
Новое в версии 3.8.
-
ssl.OP_NO_COMPRESSION -
Отключает сжатие в канале SSL. Это полезно, если протокол приложения поддерживает свою собственную схему сжатия.
Новое в версии 3.3.
-
class ssl.Options -
Коллекция констант OP_*.
enum.IntFlag
-
ssl.OP_NO_TICKET -
Запрещает клиенту запрашивать билет сессии.
Новое в версии 3.6.
-
ssl.OP_IGNORE_UNEXPECTED_EOF -
Игнорировать неожиданное завершение подключения TLS.
Эта опция доступна только с OpenSSL 3.0.0 и новее.
Новое в версии 3.10.
-
ssl.HAS_ALPN -
Наличие в библиотеке OpenSSL встроенной поддержки расширения TLS Application-Layer Protocol Negotiation, как описано в RFC 7301.
Новое в версии 3.5.
-
ssl.HAS_NEVER_CHECK_COMMON_NAME -
Наличие в библиотеке OpenSSL встроенной поддержки отключения проверки имени субъекта и
SSLContext.hostname_checks_common_nameявляется изменяемым.Добавлена в версии 3.7.
-
ssl.HAS_ECDH -
Наличие в библиотеке OpenSSL встроенной поддержки обмена ключами Диффи-Хеллмана на основе эллиптических кривых. Это значение должно быть истинным, если функция не была явно отключена дистрибутором.
Добавлена в версии 3.3.
-
ssl.HAS_SNI -
Наличие в библиотеке OpenSSL встроенной поддержки расширения Server Name Indication (как определено в RFC 6066).
Добавлена в версии 3.2.
-
ssl.HAS_NPN -
Наличие в библиотеке OpenSSL встроенной поддержки Next Protocol Negotiation, как описано в Application Layer Protocol Negotiation. При истинном значении вы можете использовать метод
SSLContext.set_npn_protocols()для указания поддерживаемых протоколов.Добавлена в версии 3.3.
-
ssl.HAS_SSLv2 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола SSL 2.0.
Добавлена в версии 3.7.
-
ssl.HAS_SSLv3 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола SSL 3.0.
Добавлена в версии 3.7.
-
ssl.HAS_TLSv1 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола TLS 1.0.
Добавлена в версии 3.7.
-
ssl.HAS_TLSv1_1 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола TLS 1.1.
Добавлена в версии 3.7.
-
ssl.HAS_TLSv1_2 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола TLS 1.2.
Добавлена в версии 3.7.
-
ssl.HAS_TLSv1_3 -
Наличие в библиотеке OpenSSL встроенной поддержки протокола TLS 1.3.
Добавлена в версии 3.7.
-
ssl.CHANNEL_BINDING_TYPES -
Список поддерживаемых типов привязки каналов TLS. Строки в этом списке могут использоваться в качестве аргументов для
SSLSocket.get_channel_binding().Добавлена в версии 3.3.
-
ssl.OPENSSL_VERSION -
Строка версии загруженной интерпретатором библиотеки OpenSSL:
>>> ssl.OPENSSL_VERSION 'OpenSSL 1.0.2k 26 Jan 2017'
Добавлена в версии 3.2.
-
ssl.OPENSSL_VERSION_INFO -
Кортеж из пяти целых чисел, представляющих информацию о версии библиотеки OpenSSL:
>>> ssl.OPENSSL_VERSION_INFO (1, 0, 2, 11, 15)
Добавлена в версии 3.2.
-
ssl.OPENSSL_VERSION_NUMBER -
Исходное число версии библиотеки OpenSSL в виде одного целого числа:
>>> ssl.OPENSSL_VERSION_NUMBER 268443839 >>> hex(ssl.OPENSSL_VERSION_NUMBER) '0x100020bf'
Добавлена в версии 3.2.
-
ssl.ALERT_DESCRIPTION_HANDSHAKE_FAILURE -
ssl.ALERT_DESCRIPTION_INTERNAL_ERROR -
ALERT_DESCRIPTION_* -
Описание предупреждений из RFC 5246 и других источников. Реестр предупреждений TLS IANA содержит этот список и ссылки на RFC, где определено их значение.
Используется в качестве возвращаемого значения функции обратного вызова в
SSLContext.set_servername_callback().Добавлена в версии 3.4.
-
class ssl.AlertDescription -
Коллекция констант ALERT_DESCRIPTION_* из
enum.IntEnum.Добавлена в версии 3.6.
-
Purpose.SERVER_AUTH -
Вариант для
create_default_context()иSSLContext.load_default_certs(). Это значение указывает, что контекст может использоваться для аутентификации веб-серверов (следовательно, он будет использоваться для создания сокетов клиента).Добавлена в версии 3.4.
-
Purpose.CLIENT_AUTH -
Вариант для
create_default_context()иSSLContext.load_default_certs(). Это значение указывает, что контекст может использоваться для аутентификации веб-клиентов (следовательно, он будет использоваться для создания сокетов сервера).Добавлена в версии 3.4.
-
class ssl.SSLErrorNumber -
Коллекция констант SSL_ERROR_* из
enum.IntEnum.Добавлена в версии 3.6.
-
class ssl.TLSVersion -
Коллекция версий SSL и TLS для
SSLContext.maximum_versionиSSLContext.minimum_versionизenum.IntEnum.Добавлена в версии 3.7.
-
TLSVersion.MINIMUM_SUPPORTED
-
TLSVersion.MAXIMUM_SUPPORTED -
Минимальная или максимальная поддерживаемая версия SSL или TLS. Это магические константы. Их значения не отражают наименьшую и наибольшую доступные версии TLS/SSL.
-
TLSVersion.SSLv3
-
TLSVersion.TLSv1
-
TLSVersion.TLSv1_1
-
TLSVersion.TLSv1_2
-
TLSVersion.TLSv1_3 -
От SSL 3.0 до TLS 1.3.
Устарело начиная с версии 3.10: Все члены
TLSVersion, кромеTLSVersion.TLSv1_2иTLSVersion.TLSv1_3устарели.
SSL-сокеты
-
class ssl.SSLSocket(socket.socket) -
SSL-сокеты предоставляют следующие методы объектов сокета:
accept()bind()close()connect()detach()fileno()-
getpeername(),getsockname() -
getsockopt(),setsockopt() -
gettimeout(),settimeout(),setblocking() listen()makefile()-
recv(),recv_into()(но передача аргументаflagsотличного от нуля не допускается) -
send(),sendall()(с тем же ограничением) -
sendfile()(ноos.sendfileбудет использоваться только для текстовых сокетов, в противном случае будет использоватьсяsend()) shutdown()
Однако, поскольку протокол SSL (и TLS) имеет свою собственную структуру поверх TCP, абстракция SSL-сокетов в определенных аспектах может отличаться от спецификации обычных сокетов на уровне операционной системы. Обратите особое внимание на примечания о неблокирующих сокетах.
Экземпляры
SSLSocketдолжны создаваться с помощью методаSSLContext.wrap_socket().Изменено в версии 3.5: Метод
sendfile()был добавлен.Изменено в версии 3.5:
shutdown()больше не сбрасывает таймаут сокета каждый раз, когда получаются или отправляются байты. Таймаут сокета теперь является максимальной общей продолжительностью закрытия.Устарело начиная с версии 3.6: Не рекомендуется создавать экземпляр
SSLSocketнапрямую, используйтеSSLContext.wrap_socket()для обертывания сокета.Изменено в версии 3.7: Экземпляры
SSLSocketдолжны создаваться с помощьюwrap_socket(). В предыдущих версиях их можно было создавать напрямую. Это никогда не документировалось и не поддерживалось официально.Изменено в версии 3.10: Python теперь использует
SSL_read_exиSSL_write_exвнутри. Функции поддерживают чтение и запись данных, больших, чем 2 ГБ. Запись данных нулевой длины больше не приводит к ошибке нарушения протокола.
SSL-сокеты также имеют следующие дополнительные методы и атрибуты:
-
SSLSocket.read(len=1024, buffer=None) -
Прочитайте до len байт данных из SSL-сокета и верните результат в виде экземпляра
bytes. Если указан buffer, то читайте в буфер вместо этого и верните количество прочитанных байт.Вызовите
SSLWantReadErrorилиSSLWantWriteError, если сокет неблокирующий и чтение заблокирует поток.Так как в любое время возможна повторная настройка, вызов
read()может также вызвать операции записи.Изменено в версии 3.5: Таймаут сокета больше не сбрасывается каждый раз, когда получаются или отправляются байты. Таймаут сокета теперь является максимальной общей продолжительностью чтения до len байт.
Устарело начиная с версии 3.6: Используйте
recv()вместоread().
-
SSLSocket.write(buf) -
Запишите buf в SSL-сокет и верните количество записанных байт. Аргумент buf должен быть объектом, поддерживающим интерфейс буфера.
Вызовите
SSLWantReadErrorилиSSLWantWriteError, если сокет неблокирующий и запись заблокирует поток.Так как в любое время возможна повторная настройка, вызов
write()может также вызвать операции чтения.Изменено в версии 3.5: Таймаут сокета больше не сбрасывается каждый раз, когда получаются или отправляются байты. Таймаут сокета теперь является максимальной общей продолжительностью записи buf.
Устарело начиная с версии 3.6: Используйте
send()вместоwrite().
Примечание
Методы read() и write() — это низкоуровневые методы, которые считывают и записывают незашифрованные данные приложения и дешифруют/шифруют их в зашифрованные данные на уровне проводов. Эти методы требуют активного SSL-соединения, т. е. рукопожатие было завершено и SSLSocket.unwrap() не был вызван.
Обычно следует использовать методы API сокетов, такие как recv() и send(), вместо этих методов.
-
SSLSocket.do_handshake() -
Выполните рукопожатие SSL.
Изменено в версии 3.4: Метод рукопожатия также выполняет
match_hostname(), когда атрибутcheck_hostnameсокетаcontextравен true.Изменено в версии 3.5: Таймаут сокета больше не сбрасывается каждый раз, когда получаются или отправляются байты. Таймаут сокета теперь является максимальной общей продолжительностью рукопожатия.
Изменено в версии 3.7: Проверка имени хоста или IP-адреса выполняется OpenSSL во время рукопожатия. Функция
match_hostname()больше не используется. В случае отказа OpenSSL от имени хоста или IP-адреса рукопожатие прерывается, и в пару отправляется сообщение TLS-сигнала.
-
SSLSocket.getpeercert(binary_form=False) -
Если для узла на другом конце соединения нет сертификата, возвращается
None. Если рукопожатие SSL ещё не выполнено, генерируется исключениеValueError.Если параметр
binary_formравенFalse, и сертификат был получен от узла, этот метод возвращает экземплярdict. Если сертификат не был проверен, возвращается пустой словарь. Если сертификат был проверен, возвращается словарь с несколькими ключами, среди которыхsubject(сущность, для которой выдан сертификат) иissuer(сущность, выдавшая сертификат). Если сертификат содержит экземпляр расширения Subject Alternative Name (см. RFC 3280), в словаре также будет ключsubjectAltName.Поля
subjectиissuerявляются кортежами, содержащими последовательность относительных различительных имён (RDN), указанных в структуре данных сертификата для соответствующих полей, и каждое RDN является последовательностью пар имя-значение. Вот пример из реальной жизни:{'issuer': ((('countryName', 'IL'),), (('organizationName', 'StartCom Ltd.'),), (('organizationalUnitName', 'Secure Digital Certificate Signing'),), (('commonName', 'StartCom Class 2 Primary Intermediate Server CA'),)), 'notAfter': 'Nov 22 08:15:19 2013 GMT', 'notBefore': 'Nov 21 03:09:52 2011 GMT', 'serialNumber': '95F0', 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),), (('countryName', 'US'),), (('stateOrProvinceName', 'California'),), (('localityName', 'San Francisco'),), (('organizationName', 'Electronic Frontier Foundation, Inc.'),), (('commonName', '*.eff.org'),), (('emailAddress', 'hostmaster@eff.org'),)), 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')), 'version': 3}Примечание
Для проверки сертификата для определённой службы можно использовать функцию
match_hostname().Если параметр
binary_formравенTrue, и сертификат был предоставлен, этот метод возвращает DER-кодированную форму всего сертификата в виде последовательности байтов илиNone, если узел не предоставил сертификат. Предоставление сертификата узлом зависит от роли сокета SSL:- для сокета SSL клиента сервер всегда предоставляет сертификат, независимо от того, требовалась ли проверка;
- для сокета SSL сервера клиент предоставляет сертификат только по запросу сервера; поэтому
getpeercert()вернётNone, если вы использовалиCERT_NONE(а неCERT_OPTIONALилиCERT_REQUIRED).
Изменено в версии 3.2: Возвращаемый словарь включает дополнительные элементы, такие как
issuerиnotBefore.Изменено в версии 3.4: Исключение
ValueErrorгенерируется, когда рукопожатие не выполнено. Возвращаемый словарь включает дополнительные элементы расширения X509v3, такие какcrlDistributionPoints,caIssuersиOCSPURI.Изменено в версии 3.9: Строки адресов IPv6 больше не содержат символа новой строки в конце.
-
SSLSocket.cipher() -
Возвращает кортеж из трёх значений: имя используемого шифра, версия протокола SSL, определяющего его использование, и количество используемых секретных битов. Если соединение не установлено, возвращает
None.
-
Возвращает список доступных шифров как для клиента, так и для сервера. Каждый элемент возвращаемого списка — кортеж из трёх значений: имя шифра, версия протокола SSL, определяющего его использование, и количество используемых секретных битов.
shared_ciphers()возвращаетNoneесли соединение не установлено или сокет является сокетом клиента.Добавлена в версии 3.5.
-
SSLSocket.compression() -
Возвращает используемый алгоритм сжатия в виде строки или
Noneесли сжатие не используется.Если протокол более высокого уровня поддерживает свой собственный механизм сжатия, вы можете использовать
OP_NO_COMPRESSIONдля отключения сжатия на уровне SSL.Добавлена в версии 3.3.
-
SSLSocket.get_channel_binding(cb_type='tls-unique') -
Получает данные канальной привязки для текущего соединения в виде объекта bytes. Возвращает
Noneесли соединение не установлено или рукопожатие ещё не завершено.Параметр cb_type позволяет выбрать требуемый тип канальной привязки. Допустимые типы канальной привязки перечислены в списке
CHANNEL_BINDING_TYPES. В настоящее время поддерживается только тип канальной привязки «tls-unique», определённый в RFC 5929. Если запрошен недопустимый тип канальной привязки, генерируется исключениеValueError.Добавлена в версии 3.3.
-
SSLSocket.selected_alpn_protocol() -
Возвращает протокол, выбранный во время рукопожатия TLS. Если
SSLContext.set_alpn_protocols()не вызывался, если другая сторона не поддерживает ALPN, если этот сокет не поддерживает ни один из предложенных клиентом протоколов или если рукопожатие ещё не произошло, возвращаетсяNone.Добавлена в версии 3.5.
-
SSLSocket.selected_npn_protocol() -
Возвращает протокол более высокого уровня, выбранный во время рукопожатия TLS/SSL. Если
SSLContext.set_npn_protocols()не вызывался, или другая сторона не поддерживает NPN, или рукопожатие ещё не произошло, возвращаетсяNone.Добавлена в версии 3.3.
Устарело начиная с версии 3.10: NPN был заменён на ALPN
-
SSLSocket.unwrap() -
Выполняет завершающее рукопожатие SSL, удаляя слой TLS из базового сокета и возвращая базовый объект сокета. Это может быть использовано для перехода от защищённого соединения к незащищённому. Возвращённый сокет всегда должен использоваться для дальнейшего общения с другой стороной соединения, а не исходный сокет.
-
SSLSocket.verify_client_post_handshake() -
Запрашивает аутентификацию после рукопожатия (PHA) у клиента TLS 1.3. PHA может быть инициирована только для соединения TLS 1.3 со стороны сервера после начального рукопожатия TLS и с включённой PHA с обеих сторон, см.
SSLContext.post_handshake_auth.Метод не выполняет обмен сертификатами немедленно. Сервер отправляет CertificateRequest в следующем событии записи и ожидает ответа клиента с сертификатом в следующем событии чтения.
Если не выполнено какое-либо предварительное условие (например, не TLS 1.3, PHA не включена), генерируется исключение
SSLError.Примечание
Доступно только с OpenSSL 1.1.1 и включённым TLS 1.3. Без поддержки TLS 1.3 метод генерирует исключение
NotImplementedError.Добавлена в версии 3.8.
-
SSLSocket.version() -
Возвращает фактическую версию протокола SSL, согласованную соединением в виде строки, или
Noneесли безопасное соединение не установлено. На данный момент возможные значения включают"SSLv2","SSLv3","TLSv1","TLSv1.1"и"TLSv1.2". Новые версии OpenSSL могут определять больше значений.Добавлена в версии 3.5.
-
SSLSocket.pending() -
Возвращает количество уже расшифрованных байтов, доступных для чтения, ожидающих обработки соединением.
-
SSLSocket.context -
Объект
SSLContext, к которому привязан этот сокет SSL. Если сокет SSL был создан с помощью устаревшей функцииwrap_socket()(а неSSLContext.wrap_socket()), это пользовательский объект контекста, созданный для этого сокета SSL.Добавлена в версии 3.2.
-
SSLSocket.server_side -
Логическое значение, равное
Trueдля сокетов сервера иFalseдля сокетов клиента.Добавлена в версии 3.2.
-
SSLSocket.server_hostname -
Имя хоста сервера: тип
str, илиNoneдля сокета на стороне сервера, или если имя хоста не было указано в конструкторе.Новое в версии 3.2.
Изменено в версии 3.7: Атрибут теперь всегда является текстом ASCII. Когда
server_hostnameявляется доменным именем с международной транскрипцией (IDN), этот атрибут теперь хранит форму A-метки ("xn--pythn-mua.org"), а не форму U-метки ("pythön.org").
-
SSLSocket.session -
Объект
SSLSessionдля этого SSL-соединения. Сессия доступна для сокетов клиента и сервера после выполнения рукопожатия TLS. Для сокетов клиента сессия может быть установлена перед вызовомdo_handshake()для повторного использования сессии.Новое в версии 3.6.
-
SSLSocket.session_reused -
Новое в версии 3.6.
SSL-контексты
Новая версия 3.2.
SSL-контекст хранит различные данные, имеющие больший жизненный цикл, чем отдельные SSL-соединения, такие как параметры конфигурации SSL, сертификаты и закрытые ключи. Он также управляет кэшем SSL-сессий для сокетов на стороне сервера, чтобы ускорить повторные подключения от одних и тех же клиентов.
-
class ssl.SSLContext(protocol=None) -
Создайте новый SSL-контекст. Вы можете передать protocol, который должен быть одним из
PROTOCOL_*констант, определённых в этом модуле. Параметр определяет, какую версию протокола SSL использовать. Обычно сервер выбирает определённую версию протокола, а клиент должен адаптироваться к выбору сервера. Большинство версий несовместимы с другими версиями. Если не указано иное, значение по умолчанию —PROTOCOL_TLS; он обеспечивает наибольшую совместимость с другими версиями.Вот таблица, показывающая, какие версии клиента (по горизонтали) могут подключаться к каким версиям сервера (по вертикали):
клиент / сервер
SSLv2
SSLv3
TLS 3
TLSv1
TLSv1.1
TLSv1.2
SSLv2
да
нет
нет 1
нет
нет
нет
SSLv3
нет
да
нет 2
нет
нет
нет
TLS (SSLv23) 3
нет 1
нет 2
да
да
да
да
TLSv1
нет
нет
да
да
нет
нет
TLSv1.1
нет
нет
да
нет
да
нет
TLSv1.2
нет
нет
да
нет
нет
да
Примечания
-
1(1,2) -
SSLContextотключает SSLv2 по умолчанию с помощьюOP_NO_SSLv2. -
2(1,2) -
SSLContextотключает SSLv3 по умолчанию с помощьюOP_NO_SSLv3. -
3(1,2) -
Протокол TLS 1.3 будет доступен с
PROTOCOL_TLSв OpenSSL >= 1.1.1. Нет отдельной константы PROTOCOL только для TLS 1.3.
См. также
create_default_context()позволяет модулюsslвыбирать настройки безопасности для заданной цели.Изменено в версии 3.6: Контекст создаётся с безопасными значениями по умолчанию. Параметры
OP_NO_COMPRESSION,OP_CIPHER_SERVER_PREFERENCE,OP_SINGLE_DH_USE,OP_SINGLE_ECDH_USE,OP_NO_SSLv2(кромеPROTOCOL_SSLv2), иOP_NO_SSLv3(кромеPROTOCOL_SSLv3) установлены по умолчанию. Исходный список наборов шифров содержит толькоHIGHшифры, не содержитNULLшифров иMD5шифров (кромеPROTOCOL_SSLv2).Устарело начиная с версии 3.10:
SSLContextбез аргумента protocol устарело. В будущем класс контекста будет требовать протоколPROTOCOL_TLS_CLIENTилиPROTOCOL_TLS_SERVER.Изменено в версии 3.10: Наборы шифров по умолчанию теперь включают только безопасные шифры AES и ChaCha20 с защитой от раскрытия ключей и уровнем безопасности 2. RSA и DH-ключи с размером меньше 2048 бит и ECC-ключи с размером меньше 224 бит запрещены.
PROTOCOL_TLS,PROTOCOL_TLS_CLIENTиPROTOCOL_TLS_SERVERиспользуют TLS 1.2 как минимальную версию TLS. -
Объекты SSLContext имеют следующие методы и атрибуты:
-
SSLContext.cert_store_stats() -
Получение статистики о количестве загруженных сертификатов X.509, количества сертификатов X.509, помеченных как сертификаты CA, и списков отзыва сертификатов в виде словаря.
Пример для контекста с одним сертификатом CA и одним другим сертификатом:
>>> context.cert_store_stats() {'crl': 0, 'x509_ca': 1, 'x509': 2}Новая версия 3.4.
-
SSLContext.load_cert_chain(certfile, keyfile=None, password=None) -
Загрузка закрытого ключа и соответствующего сертификата. Строка certfile должна содержать путь к одному файлу в формате PEM, содержащему сертификат, а также любое количество сертификатов CA, необходимых для проверки подлинности сертификата. Строка keyfile, если присутствует, должна указывать на файл, содержащий закрытый ключ. В противном случае закрытый ключ будет взят из certfile. См. обсуждение Сертификаты для получения дополнительной информации о том, как сертификат хранится в certfile.
Аргумент password может быть функцией, вызываемой для получения пароля для дешифрования закрытого ключа. Он будет вызван только в том случае, если закрытый ключ зашифрован и необходим пароль. Он будет вызван без аргументов и должен возвращать строку, байты или массив байтов. Если возвращаемое значение является строкой, оно будет закодировано в UTF-8 перед использованием для дешифрования ключа. В качестве альтернативы, можно напрямую передать строку, байты или массив байтов в качестве аргумента password. Он будет игнорироваться, если закрытый ключ не зашифрован и пароль не нужен.
Если аргумент password не указан и требуется пароль, будет использоваться встроенный механизм запроса пароля OpenSSL, чтобы интерактивно запросить пароль у пользователя.
Если закрытый ключ не соответствует сертификату, будет поднята ошибка
SSLError.Изменено в версии 3.3: Новый необязательный аргумент password.
-
SSLContext.load_default_certs(purpose=Purpose.SERVER_AUTH) -
Загрузка набора сертификатов «уполномоченных центров сертификации» (CA) из стандартных расположений. В Windows загружаются сертификаты CA из системных хранилищ
CAиROOT. На всех системах вызываетсяSSLContext.set_default_verify_paths(). В будущем метод может загружать сертификаты CA и из других расположений.Флаг purpose определяет, какие сертификаты CA загружаются. По умолчанию настройка
Purpose.SERVER_AUTHзагружает сертификаты, помеченные и доверенные для проверки подлинности TLS веб-сервера (сокеты клиента).Purpose.CLIENT_AUTHзагружает сертификаты CA для проверки сертификатов клиента на стороне сервера.Новая версия 3.4.
-
SSLContext.load_verify_locations(cafile=None, capath=None, cadata=None) -
Загрузка набора сертификатов «центра сертификации» (CA), используемых для проверки сертификатов других узлов, когда
verify_modeотличается отCERT_NONE. Необходимо указать хотя бы один из параметров cafile или capath.Этот метод также может загружать списки отозванных сертификатов (CRL) в формате PEM или DER. Для использования CRL необходимо правильно настроить
SSLContext.verify_flags.Строка cafile, если указана, представляет путь к файлу, содержащему объединённые сертификаты CA в формате PEM. Подробнее о том, как организовать сертификаты в этом файле, см. обсуждение в разделе Сертификаты.
Строка capath, если указана, представляет путь к каталогу, содержащему несколько сертификатов CA в формате PEM, следуя специфической структуре OpenSSL.
Объект cadata, если указан, представляет собой либо строку ASCII, содержащую один или несколько PEM-кодированных сертификатов, либо объект типа байт с DER-кодированными сертификатами. Как и в случае с capath, дополнительные строки вокруг PEM-кодированных сертификатов игнорируются, но должен быть указан как минимум один сертификат.
Изменено в версии 3.4: Добавлен необязательный аргумент cadata
-
SSLContext.get_ca_certs(binary_form=False) -
Получить список загруженных сертификатов «центра сертификации» (CA). Если параметр
binary_formравенFalse, каждый элемент списка представляет собой словарь, аналогичный выводуSSLSocket.getpeercert(). В противном случае метод возвращает список DER-кодированных сертификатов. Возвращаемый список не содержит сертификаты из capath, если сертификат не запрашивался и не загружался подключением SSL.Примечание
Сертификаты в каталоге capath не загружаются, пока не будут использованы хотя бы один раз.
Добавлен в версии 3.4.
-
SSLContext.get_ciphers() -
Получить список включённых шифров. Список отсортирован по приоритету шифра. См.
SSLContext.set_ciphers().Пример:
>>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) >>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA') >>> ctx.get_ciphers() [{'aead': True, 'alg_bits': 256, 'auth': 'auth-rsa', 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(256) Mac=AEAD', 'digest': None, 'id': 50380848, 'kea': 'kx-ecdhe', 'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'protocol': 'TLSv1.2', 'strength_bits': 256, 'symmetric': 'aes-256-gcm'}, {'aead': True, 'alg_bits': 128, 'auth': 'auth-rsa', 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(128) Mac=AEAD', 'digest': None, 'id': 50380847, 'kea': 'kx-ecdhe', 'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'protocol': 'TLSv1.2', 'strength_bits': 128, 'symmetric': 'aes-128-gcm'}]Добавлен в версии 3.6.
-
SSLContext.set_default_verify_paths() -
Загрузка набора сертификатов «центра сертификации» (CA) по умолчанию из пути к файловой системе, определённого при построении библиотеки OpenSSL. К сожалению, нет простого способа узнать, успешна ли эта операция: ошибка не возвращается, если сертификаты не найдены. Однако, если библиотека OpenSSL предоставляется в составе операционной системы, она, скорее всего, настроена должным образом.
-
SSLContext.set_ciphers(ciphers) -
Установить доступные шифры для сокетов, созданных с помощью данного контекста. Это должна быть строка в формате списка шифров OpenSSL. Если ни один шифр не может быть выбран (потому что параметры компиляции или другая конфигурация запрещают использование всех указанных шифров), будет поднято исключение
SSLError.Примечание
при подключении метод
SSLSocket.cipher()сокетов SSL вернёт текущий выбранный шифр.Шифры TLS 1.3 не могут быть отключены с помощью
set_ciphers().
-
SSLContext.set_alpn_protocols(protocols) -
Указать протоколы, которые должен рекламировать сокет во время рукопожатия SSL/TLS. Это должен быть список строк ASCII, например,
['http/1.1', 'spdy/2'], отсортированный по предпочтению. Выбор протокола происходит во время рукопожатия и выполняется в соответствии с RFC 7301. После успешного рукопожатия методSSLSocket.selected_alpn_protocol()вернёт согласованный протокол.Этот метод вызовет
NotImplementedError, еслиHAS_ALPNравноFalse.Добавлен в версии 3.5.
-
SSLContext.set_npn_protocols(protocols) -
Указать протоколы, которые должен рекламировать сокет во время рукопожатия SSL/TLS. Это должен быть список строк, например,
['http/1.1', 'spdy/2'], отсортированный по предпочтению. Выбор протокола происходит во время рукопожатия в соответствии с переговором протоколов прикладного уровня. После успешного рукопожатия методSSLSocket.selected_npn_protocol()вернёт согласованный протокол.Этот метод вызовет
NotImplementedError, еслиHAS_NPNравноFalse.Устарело начиная с версии 3.10: NPN был заменён ALPN
-
SSLContext.sni_callback -
Регистрация обратного вызова, который будет вызван после того, как сообщение рукопожатия TLS Client Hello будет получено сервером SSL/TLS, когда клиент TLS указывает указание имени сервера. Механизм указания имени сервера определён в RFC 6066 разделе 3 - указание имени сервера.
Только один обратный вызов может быть установлен для
SSLContext. Если sni_callback установлен наNone, то обратный вызов отключён. Следующее вызов этой функции отключит ранее зарегистрированный обратный вызов.Функция обратного вызова будет вызвана с тремя аргументами: первый —
ssl.SSLSocket, второй — строка, представляющая имя сервера, с которым клиент намеревается взаимодействовать (илиNone, если TLS Client Hello не содержит имя сервера), и третий — исходныйSSLContext. Аргумент имени сервера — текстовый. Для международных доменных имён имя сервера является меткой IDN A ("xn--pythn-mua.org").Типичное использование этого обратного вызова — изменение атрибута
ssl.SSLSocket’sSSLSocket.contextна новый объект типаSSLContext, представляющий цепочку сертификатов, соответствующую имени сервера.Из-за ранней фазы согласования TLS, доступны только ограниченные методы и атрибуты, такие как
SSLSocket.selected_alpn_protocol()иSSLSocket.context. МетодыSSLSocket.getpeercert(),SSLSocket.cipher()иSSLSocket.compression()требуют, чтобы соединение TLS продвинулось за пределы TLS Client Hello, поэтому они не вернут осмысленные значения и не могут быть безопасно вызваны.Функция sni_callback должна возвращать
None, чтобы продолжить переговоры TLS. Если требуется ошибка TLS, можно вернуть константуALERT_DESCRIPTION_*. Другие возвращаемые значения приведут к ошибке TLS с кодомALERT_DESCRIPTION_INTERNAL_ERROR.Если в функции sni_callback произойдёт исключение, соединение TLS завершится с сообщением об ошибке TLS
ALERT_DESCRIPTION_HANDSHAKE_FAILURE.Этот метод вызовет
NotImplementedError, если при построении библиотеки OpenSSL был определён OPENSSL_NO_TLSEXT.Добавлен в версии 3.7.
-
SSLContext.set_servername_callback(server_name_callback) -
Это устаревший API, сохранённый для обратной совместимости. В случае возможности, следует использовать
sni_callbackвместо него. Предоставленный server_name_callback аналогичен sni_callback, за исключением того, что при использовании имени сервера в формате международного доменного имени (IDN) server_name_callback получает декодированное U-метка ("pythön.org").Если при декодировании имени сервера произойдёт ошибка, соединение TLS завершится с фатальным предупреждением TLS
ALERT_DESCRIPTION_INTERNAL_ERRORдля клиента.Новое в версии 3.4.
-
SSLContext.load_dh_params(dhfile) -
Загрузка параметров генерации ключей для обмена ключами Диффи-Хеллмана (DH). Использование обмена ключами DH улучшает сквозную секретность за счёт вычислительных ресурсов (как на сервере, так и на клиенте). Параметр dhfile должен содержать путь к файлу с параметрами DH в формате PEM.
Это настройка не применяется к сокетам клиентов. Также можно использовать опцию
OP_SINGLE_DH_USEдля дальнейшего повышения безопасности.Новое в версии 3.3.
-
SSLContext.set_ecdh_curve(curve_name) -
Устанавливает имя кривой для обмена ключами Диффи-Хеллмана на основе эллиптических кривых (ECDH). ECDH значительно быстрее, чем обычный DH, при сохранении, как считается, аналогичной безопасности. Параметр curve_name должен быть строкой, описывающей известную эллиптическую кривую, например,
prime256v1для широко поддерживаемой кривой.Это настройка не применяется к сокетам клиентов. Также можно использовать опцию
OP_SINGLE_ECDH_USEдля дальнейшего повышения безопасности.Этот метод недоступен, если
HAS_ECDHравенFalse.Новое в версии 3.3.
См. также
- SSL/TLS & Perfect Forward Secrecy
-
Винсент Бернат.
-
SSLContext.wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None) -
Обёртка существующего сокета Python sock и возвращает экземпляр
SSLContext.sslsocket_class(по умолчаниюSSLSocket). Возвращённый SSL-сокет привязан к контексту, его настройкам и сертификатам. sock должен быть сокетомSOCK_STREAM; другие типы сокетов не поддерживаются.Параметр
server_side— булево значение, определяющее, нужно ли использовать поведение сервера или клиента для этого сокета.Для клиентских сокетов создание контекста откладывается; если подлежащий сокет ещё не подключён, создание контекста будет выполнено после вызова
connect()для сокета. Для сокетов сервера, если у сокета нет удалённого узла, предполагается, что это сокет прослушивания, и обёртка SSL для сервера автоматически выполняется при подключении клиентов через методaccept(). Метод может вызватьSSLError.Для клиентских соединений необязательный параметр server_hostname указывает имя хоста сервиса, к которому мы подключаемся. Это позволяет одному серверу размещать несколько служб на основе SSL с различными сертификатами, аналогично виртуальным хостам HTTP. Указание server_hostname вызовет
ValueError, если server_side имеет значение true.Параметр
do_handshake_on_connectуказывает, следует ли автоматически выполнять рукопожатие SSL послеsocket.connect(), или приложение должно его вызвать явно, вызвав методSSLSocket.do_handshake(). Явное вызовSSLSocket.do_handshake()даёт программе контроль над блокирующим поведением ввода-вывода сокета, участвующего в рукопожатии.Параметр
suppress_ragged_eofsопределяет, как методSSLSocket.recv()должен обрабатывать неожиданное завершение потока данных (EOF) от другого конца соединения. Если он указан какTrue(по умолчанию), он возвращает обычный EOF (пустой байтовый объект) в ответ на неожиданные ошибки EOF, поднятые от основного сокета; еслиFalse, он перенаправит исключения обратно вызывающему коду.session, см.
session.Изменено в версии 3.5: Всегда разрешает передачу параметра server_hostname, даже если в OpenSSL нет SNI.
Изменено в версии 3.6: Добавлен аргумент session.
Изменено в версии 3.7: Метод возвращает экземпляр
SSLContext.sslsocket_classвместо жёстко заданногоSSLSocket.
-
SSLContext.sslsocket_class -
Тип возвращаемого значения
SSLContext.wrap_socket(), по умолчаниюSSLSocket. Атрибут можно переопределить для экземпляра класса, чтобы вернуть настраиваемый подклассSSLSocket.Новое в версии 3.7.
-
SSLContext.wrap_bio(incoming, outgoing, server_side=False, server_hostname=None, session=None) -
Обёртка объектов BIO incoming и outgoing и возвращает экземпляр
SSLContext.sslobject_class(по умолчаниюSSLObject). SSL-процедуры будут считывать входные данные из входящего BIO и записывать данные в исходящий BIO.Параметры server_side, server_hostname и session имеют то же значение, что и в
SSLContext.wrap_socket().Изменено в версии 3.6: Добавлен аргумент session.
Изменено в версии 3.7: Метод возвращает экземпляр
SSLContext.sslobject_classвместо жёстко заданногоSSLObject.
-
SSLContext.sslobject_class -
Тип возвращаемого значения
SSLContext.wrap_bio(), по умолчаниюSSLObject. Атрибут можно переопределить для экземпляра класса, чтобы вернуть настраиваемый подклассSSLObject.Новое в версии 3.7.
-
SSLContext.session_stats() -
Получение статистики о созданных или управляемых этим контекстом SSL-сеансах. Возвращается словарь, сопоставляющий имена каждого элемента информации с их числовыми значениями. Например, вот общее количество попаданий и промахов в кэше сеансов с момента создания контекста:
>>> stats = context.session_stats() >>> stats['hits'], stats['misses'] (0, 0)
-
SSLContext.check_hostname -
Указывает, нужно ли проверять имя хоста сертификата удалённого узла в
SSLSocket.do_handshake(). Параметр контекстаverify_modeдолжен быть установлен вCERT_OPTIONALилиCERT_REQUIRED, а вы должны передать server_hostname вwrap_socket()для проверки имени хоста. Включение проверки имени хоста автоматически устанавливаетverify_modeсо значенияCERT_NONEнаCERT_REQUIRED. Его нельзя вернуть к значениюCERT_NONE, пока включена проверка имени хоста. ПротоколPROTOCOL_TLS_CLIENTпо умолчанию включает проверку имени хоста. Для других протоколов проверка имени хоста должна быть включена явно.Пример:
import socket, ssl context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) context.verify_mode = ssl.CERT_REQUIRED context.check_hostname = True context.load_default_certs() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com') ssl_sock.connect(('www.verisign.com', 443))Новое в версии 3.4.
Изменено в версии 3.7:
verify_modeтеперь автоматически изменяется наCERT_REQUIRED, когда включена проверка имени хоста иverify_modeимеет значениеCERT_NONE. Ранее та же операция завершалась ошибкойValueError.
-
SSLContext.keylog_filename -
Записывает ключи TLS в файл keylog, каждый раз при генерации или получении материала ключа. Файл keylog предназначен только для отладки. Формат файла определяется NSS и используется многими анализаторами трафика, такими как Wireshark. Файл журнала открывается в режиме добавления. Записи синхронизированы между потоками, но не между процессами.
Новое в версии 3.8.
-
SSLContext.maximum_version -
Член перечисления
TLSVersion, представляющий самую высокую поддерживаемую версию TLS. Значение по умолчанию —TLSVersion.MAXIMUM_SUPPORTED. Атрибут является только для чтения для протоколов, отличных отPROTOCOL_TLS,PROTOCOL_TLS_CLIENTиPROTOCOL_TLS_SERVER.Атрибуты
maximum_version,minimum_versionиSSLContext.optionsвсе влияют на поддерживаемые версии SSL и TLS контекста. Реализация не предотвращает некорректные комбинации. Например, контекст сOP_NO_TLSv1_2вoptionsиmaximum_version, установленным вTLSVersion.TLSv1_2, не сможет установить соединение TLS 1.2.Новое в версии 3.7.
-
SSLContext.minimum_version -
Аналогично
SSLContext.maximum_version, но это самая низкая поддерживаемая версия илиTLSVersion.MINIMUM_SUPPORTED.Новое в версии 3.7.
-
SSLContext.num_tickets -
Управляет количеством билетов сеанса TLS 1.3 для контекста
PROTOCOL_TLS_SERVER. Настройка не влияет на соединения TLS 1.0–1.2.Новое в версии 3.8.
-
SSLContext.options -
Целое число, представляющее набор опций SSL, включённых в этот контекст. Значение по умолчанию —
OP_ALL, но вы можете указать другие опции, такие какOP_NO_SSLv2, объединив их с операцией OR.Изменено в версии 3.6:
SSLContext.optionsвозвращает флагиOptions:>>> ssl.create_default_context().options <Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
Устарело начиная с версии 3.7: Все опции
OP_NO_SSL*иOP_NO_TLS*устарели начиная с Python 3.7. ИспользуйтеSSLContext.minimum_versionиSSLContext.maximum_versionвместо них.
-
SSLContext.post_handshake_auth -
Включает проверку подлинности клиента TLS 1.3 после рукопожатия. Проверка подлинности после рукопожатия отключена по умолчанию, и сервер может запросить сертификат клиента TLS только во время начального рукопожатия. При включении сервер может запросить сертификат клиента TLS в любое время после рукопожатия.
При включении на стороне сокетов клиента клиент сообщает серверу, что он поддерживает проверку подлинности после рукопожатия.
При включении на стороне сокетов сервера,
SSLContext.verify_modeтакже должен быть установлен вCERT_OPTIONALилиCERT_REQUIRED. Фактический обмен сертификатом клиента отложен до вызоваSSLSocket.verify_client_post_handshake()и выполнения некоторых операций ввода-вывода.Новое в версии 3.8.
-
SSLContext.protocol -
Выбранная версия протокола при построении контекста. Этот атрибут является только для чтения.
-
SSLContext.hostname_checks_common_name -
Указывает, следует ли
check_hostnameпроверять общее имя субъекта сертификата при отсутствии расширения альтернативных имён субъекта (по умолчанию: true).Новое в версии 3.7.
Изменено в версии 3.10: Флаг не действовал с OpenSSL до версии 1.1.1k. Python 3.8.9, 3.9.3 и 3.10 включают обходные пути для предыдущих версий.
-
SSLContext.security_level -
Целое число, представляющее уровень безопасности уровня безопасности для контекста. Этот атрибут является только для чтения.
Новое в версии 3.10.
-
SSLContext.verify_flags -
Флаги для операций проверки сертификатов. Вы можете установить флаги, такие как
VERIFY_CRL_CHECK_LEAF, объединив их с операцией OR. По умолчанию OpenSSL не требует и не проверяет списки отзыва сертификатов (CRL).Новое в версии 3.4.
Изменено в версии 3.6:
SSLContext.verify_flagsвозвращает флагиVerifyFlags:>>> ssl.create_default_context().verify_flags <VerifyFlags.VERIFY_X509_TRUSTED_FIRST: 32768>
-
SSLContext.verify_mode -
Определяет, нужно ли проверять сертификаты других участников и как вести себя при ошибке проверки. Это свойство должно быть одним из
CERT_NONE,CERT_OPTIONALилиCERT_REQUIRED.Изменено в версии 3.6:
SSLContext.verify_modeвозвращает перечислениеVerifyMode:>>> ssl.create_default_context().verify_mode <VerifyMode.CERT_REQUIRED: 2>
Сертификаты
Сертификаты в общем случае являются частью системы с открытым и закрытым ключами. В этой системе каждому субъекту (это может быть компьютер, человек или организация) присваивается уникальный двухкомпонентный криптографический ключ. Одна часть ключа является открытой, и называется открытым ключом; другая часть хранится в секрете, и называется закрытым ключом. Эти две части связаны таким образом, что если вы зашифруете сообщение с помощью одной из них, вы сможете расшифровать его только с помощью другой части.
Сертификат содержит информацию о двух субъектах. Он содержит имя субъекта и открытый ключ субъекта. Он также содержит утверждение от второго субъекта, издателя, о том, что субъект является тем, за кого себя выдает, и что это действительно открытый ключ субъекта. Утверждение издателя подписывается закрытым ключом издателя, который известен только издателю. Однако любой может проверить утверждение издателя, найдя открытый ключ издателя, расшифровав утверждение с его помощью и сравнив его с другой информацией в сертификате. Сертификат также содержит информацию о периоде действия сертификата. Это выражается в двух полях, называемых «notBefore» и «notAfter».
В Python, клиент или сервер может использовать сертификат для подтверждения своей личности. Также может потребоваться, чтобы другая сторона сетевого соединения предоставила сертификат, и этот сертификат может быть проверен клиентом или сервером, который требует такой проверки. Запрос соединения может быть настроен так, чтобы выбрасывать исключение, если проверка не удастся. Проверка выполняется автоматически, основой подсистемы OpenSSL; приложение не должно заботиться об ее механизмах. Однако приложение обычно должно предоставлять наборы сертификатов, чтобы этот процесс мог состояться.
Python использует файлы для хранения сертификатов. Они должны быть отформатированы в формате «PEM» (см. RFC 1422), который представляет собой базу 64 кодированную форму, обернутую в строку заголовка и строку подвала:
-----BEGIN CERTIFICATE----- ... (certificate in base64 PEM encoding) ... -----END CERTIFICATE-----
Цепочки сертификатов
Файлы Python, содержащие сертификаты, могут содержать последовательность сертификатов, иногда называемых цепочкой сертификатов. Эта цепочка должна начинаться с конкретного сертификата для субъекта, являющегося клиентом или сервером, затем с сертификата издателя этого сертификата, а затем с сертификата издателя этого сертификата и так далее по цепочке до тех пор, пока вы не дойдете до сертификата, который самоподписанный, то есть сертификат, у которого субъект и издатель совпадают, иногда называемый корневым сертификатом. Сертификаты должны быть просто конкатенированы в файле сертификата. Например, предположим, что у нас есть цепочка из трех сертификатов, от сертификата сервера до сертификата центра сертификации, который подписал наш сертификат сервера, и до корневого сертификата организации, выпустившей сертификат центра сертификации:
-----BEGIN CERTIFICATE----- ... (certificate for your server)... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... (the certificate for the CA)... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... (the root certificate for the CA's issuer)... -----END CERTIFICATE-----
Сертификаты ЦС
Если вам нужно проверить сертификат другой стороны соединения, вам необходимо предоставить файл «CA certs», заполненный цепочками сертификатов для каждого издателя, которому вы доверяете. Опять же, этот файл просто содержит эти цепочки, конкатенированные вместе. Для проверки Python будет использовать первую цепочку, найденную в файле, которая соответствует. Файл сертификатов платформы можно использовать, вызвав SSLContext.load_default_certs(), это делается автоматически с create_default_context().
Объединённый ключ и сертификат
Часто закрытый ключ хранится в том же файле, что и сертификат; в этом случае требуется передать только параметр certfile методу SSLContext.load_cert_chain() и wrap_socket(). Если закрытый ключ хранится вместе с сертификатом, он должен предшествовать первому сертификату в цепочке сертификатов:
-----BEGIN RSA PRIVATE KEY----- ... (private key in base64 encoding) ... -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- ... (certificate in base64 PEM encoding) ... -----END CERTIFICATE-----
Самоподписанные сертификаты
Если вы собираетесь создать сервер, предоставляющий услуги SSL-шифрованного соединения, вам необходимо получить сертификат для этой службы. Есть много способов получения подходящих сертификатов, например, приобретение их у центра сертификации. Другой распространённой практикой является генерация самоподписанного сертификата. Самый простой способ сделать это с помощью пакета OpenSSL, используя что-то вроде следующего:
% openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem Generating a 1024 bit RSA private key .......++++++ .............................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:MyState Locality Name (eg, city) []:Some City Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc. Organizational Unit Name (eg, section) []:My Group Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com Email Address []:ops@myserver.mygroup.myorganization.com %
Недостатком самоподписанного сертификата является то, что он является своим собственным корневым сертификатом, и никто другой не будет иметь его в своём кэше известных (и надёжных) корневых сертификатов.
Примеры
Проверка поддержки SSL
Для проверки наличия поддержки SSL в установке Python код пользователя должен использовать следующий приём:
try:
import ssl
except ImportError:
pass
else:
... # do something that requires SSL support
Операции со стороны клиента
В этом примере создаётся контекст SSL с рекомендуемыми настройками безопасности для сокетов клиента, включая автоматическую проверку сертификатов:
>>> context = ssl.create_default_context()
Если вы предпочитаете самостоятельно настроить параметры безопасности, вы можете создать контекст с нуля (но будьте осторожны, что вы можете не угадать все настройки):
>>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
>>> context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
(этот фрагмент предполагает, что ваша операционная система помещает сборник всех сертификатов CA в /etc/ssl/certs/ca-bundle.crt; в противном случае вы получите ошибку и должны будете скорректировать расположение)
Протокол PROTOCOL_TLS_CLIENT настраивает контекст для проверки сертификатов и проверки имени хоста. verify_mode устанавливается в CERT_REQUIRED, а check_hostname устанавливается в True. Все остальные протоколы создают контексты SSL с небезопасными значениями по умолчанию.
При использовании контекста для подключения к серверу, CERT_REQUIRED и check_hostname проверяют сертификат сервера: проверяется, что сертификат сервера был подписан одним из сертификатов ЦС, проверяется правильность подписи и проверяются другие свойства, такие как срок действия и идентичность имени хоста:
>>> conn = context.wrap_socket(socket.socket(socket.AF_INET),
... server_hostname="www.python.org")
>>> conn.connect(("www.python.org", 443))
Затем вы можете получить сертификат:
>>> cert = conn.getpeercert()
Визуальный осмотр показывает, что сертификат идентифицирует необходимую службу (то есть хост HTTPS www.python.org):
>>> pprint.pprint(cert)
{'OCSP': ('http://ocsp.digicert.com',),
'caIssuers': ('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt',),
'crlDistributionPoints': ('http://crl3.digicert.com/sha2-ev-server-g1.crl',
'http://crl4.digicert.com/sha2-ev-server-g1.crl'),
'issuer': ((('countryName', 'US'),),
(('organizationName', 'DigiCert Inc'),),
(('organizationalUnitName', 'www.digicert.com'),),
(('commonName', 'DigiCert SHA2 Extended Validation Server CA'),)),
'notAfter': 'Sep 9 12:00:00 2016 GMT',
'notBefore': 'Sep 5 00:00:00 2014 GMT',
'serialNumber': '01BB6F00122B177F36CAB49CEA8B6B26',
'subject': ((('businessCategory', 'Private Organization'),),
(('1.3.6.1.4.1.311.60.2.1.3', 'US'),),
(('1.3.6.1.4.1.311.60.2.1.2', 'Delaware'),),
(('serialNumber', '3359300'),),
(('streetAddress', '16 Allen Rd'),),
(('postalCode', '03894-4801'),),
(('countryName', 'US'),),
(('stateOrProvinceName', 'NH'),),
(('localityName', 'Wolfeboro'),),
(('organizationName', 'Python Software Foundation'),),
(('commonName', 'www.python.org'),)),
'subjectAltName': (('DNS', 'www.python.org'),
('DNS', 'python.org'),
('DNS', 'pypi.org'),
('DNS', 'docs.python.org'),
('DNS', 'testpypi.org'),
('DNS', 'bugs.python.org'),
('DNS', 'wiki.python.org'),
('DNS', 'hg.python.org'),
('DNS', 'mail.python.org'),
('DNS', 'packaging.python.org'),
('DNS', 'pythonhosted.org'),
('DNS', 'www.pythonhosted.org'),
('DNS', 'test.pythonhosted.org'),
('DNS', 'us.pycon.org'),
('DNS', 'id.python.org')),
'version': 3}
Теперь SSL-канал установлен, и сертификат проверен, вы можете продолжить взаимодействие с сервером:
>>> conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n") >>> pprint.pprint(conn.recv(1024).split(b"\r\n")) [b'HTTP/1.1 200 OK', b'Date: Sat, 18 Oct 2014 18:27:20 GMT', b'Server: nginx', b'Content-Type: text/html; charset=utf-8', b'X-Frame-Options: SAMEORIGIN', b'Content-Length: 45679', b'Accept-Ranges: bytes', b'Via: 1.1 varnish', b'Age: 2188', b'X-Served-By: cache-lcy1134-LCY', b'X-Cache: HIT', b'X-Cache-Hits: 11', b'Vary: Cookie', b'Strict-Transport-Security: max-age=63072000; includeSubDomains', b'Connection: close', b'', b'']
См. обсуждение Соображения по безопасности ниже.
Операции со стороны сервера
Для работы сервера обычно требуется сертификат сервера и закрытый ключ, каждый в отдельном файле. Сначала вы создадите контекст, содержащий ключ и сертификат, чтобы клиенты могли проверить вашу подлинность. Затем вы откроете сокет, привяжете его к порту, вызовете listen() на нём и начнёте ожидать подключения клиентов:
import socket, ssl
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile")
bindsocket = socket.socket()
bindsocket.bind(('myaddr.example.com', 10023))
bindsocket.listen(5)
Когда клиент подключится, вы вызовете accept() на сокете, чтобы получить новый сокет с другой стороны, и используйте метод SSLContext.wrap_socket() контекста для создания серверного SSL-сокета для соединения:
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = context.wrap_socket(newsocket, server_side=True)
try:
deal_with_client(connstream)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
Затем вы будете читать данные из connstream и делать что-то с ними, пока не закончите с клиентом (или клиент не закончит с вами):
def deal_with_client(connstream):
data = connstream.recv(1024)
# empty data means the client is finished with us
while data:
if not do_something(connstream, data):
# we'll assume do_something returns False
# when we're finished with client
break
data = connstream.recv(1024)
# finished with client
И вернитесь к прослушиванию новых подключений клиентов (конечно, реальный сервер, вероятно, будет обрабатывать каждое подключение клиента в отдельной потоке, или поместит сокеты в режим без блокировки и будет использовать цикл событий).
Примечания по неблокирующим сокетам
Сокеты SSL ведут себя немного иначе, чем обычные сокеты в неблокирующем режиме. При работе с неблокирующими сокетами необходимо учитывать несколько моментов:
-
Большинство методов
SSLSocketбудут генерировать либоSSLWantWriteError, либоSSLWantReadErrorвместоBlockingIOError, если операция ввода-вывода заблокируется.SSLWantReadErrorбудет сгенерирована, если необходима операция чтения из базового сокета, аSSLWantWriteError— для записи в базовый сокет. Обратите внимание, что попытки записать в сокет SSL могут потребовать чтения из базового сокета предварительно, а попытки читать из сокета SSL могут потребовать предварительной записи в базовый сокет.Изменено в версии 3.5: В более ранних версиях Python метод
SSLSocket.send()возвращал ноль вместо генерацииSSLWantWriteErrorилиSSLWantReadError. - Вызов
select()указывает, что сокет на уровне ОС можно читать (или записывать в него), но это не подразумевает, что на уровне верхнего слоя SSL достаточно данных. Например, может прийти только часть кадра SSL. Поэтому необходимо быть готовым обрабатыватьSSLSocket.recv()иSSLSocket.send()ошибки и повторить попытку после следующего вызоваselect(). -
И наоборот, так как у слоя SSL есть своя собственная структура данных, в сокете SSL может быть доступны данные для чтения, даже если
select()этого не осознаёт. Поэтому следует сначала вызватьSSLSocket.recv()для слива любых потенциально доступных данных, а затем блокировать вызовselect()только в случае необходимости.(разумеется, аналогичные меры применяются при использовании других примитивов, таких как
poll(), или тех, что в модулеselectors) -
Сам SSL-handshake будет неблокирующим: метод
SSLSocket.do_handshake()должен повторно вызываться, пока не вернётся успешно. Вот синопсис использованияselect()для ожидания готовности сокета:while True: try: sock.do_handshake() break except ssl.SSLWantReadError: select.select([sock], [], []) except ssl.SSLWantWriteError: select.select([], [sock], [])
См. также
Модуль asyncio поддерживает неблокирующие сокеты SSL и предоставляет API более высокого уровня. Он выполняет опрос событий, используя модуль selectors, и обрабатывает исключения SSLWantWriteError, SSLWantReadError и BlockingIOError. Он также выполняет SSL-handshake асинхронно.
Поддержка BIO для памяти
Новая в версии 3.5.
С момента введения модуля SSL в Python 2.6, класс SSLSocket предоставляет две взаимосвязанные, но различные области функциональности:
- Обработка протокола SSL
- Сетевой ввод/вывод
API сетевого ввода/вывода идентичен API, предоставляемому классом socket.socket, от которого класс SSLSocket также наследуется. Это позволяет использовать сокет SSL как прямую замену обычного сокета, что значительно упрощает добавление поддержки SSL в существующее приложение.
Сочетание обработки протокола SSL и сетевого ввода/вывода обычно работает хорошо, но есть случаи, когда это не так. Примером являются фреймворки асинхронного ввода/вывода, которые хотят использовать другую модель множественного доступа к вводу/выводу, отличную от модели «select/poll на дескрипторе файла» (основанной на готовности), которая предполагается классом socket.socket и внутренними процедурами ввода/вывода сокета OpenSSL. Это особенно актуально для платформ, таких как Windows, где эта модель не является эффективной. Для этой цели предоставляется вариант с ограниченным функционалом класса SSLSocket, называемый SSLObject.
-
class ssl.SSLObject Вариант с ограниченным функционалом класса
SSLSocket, представляющий собой экземпляр протокола SSL, не содержащий методов сетевого ввода/вывода. Этот класс обычно используется авторами фреймворков, которые хотят реализовать асинхронный ввод/вывод для SSL с помощью буферов памяти.Этот класс реализует интерфейс поверх низкоуровневого объекта SSL, реализованного OpenSSL. Этот объект фиксирует состояние SSL-соединения, но сам не предоставляет сетевой ввод/вывод. Ввод/вывод должен выполняться с помощью отдельных объектов «BIO», которые являются уровнем абстракции ввода/вывода OpenSSL.
У этого класса нет публичного конструктора. Экземпляр класса
SSLObjectдолжен быть создан с использованием методаwrap_bio(). Этот метод создаст экземплярSSLObjectи свяжет его с парой BIO. BIO входящий используется для передачи данных из Python в экземпляр протокола SSL, а BIO исходящий — для передачи данных в обратном направлении.Доступны следующие методы:
contextserver_sideserver_hostnamesessionsession_reusedread()write()getpeercert()selected_alpn_protocol()selected_npn_protocol()cipher()shared_ciphers()compression()pending()do_handshake()verify_client_post_handshake()unwrap()get_channel_binding()version()
По сравнению с
SSLSocket, этому объекту не хватает следующих функций:- Любой формы сетевого ввода/вывода;
recv()иsend()читают и записывают только в подлежащие буферыMemoryBIO. - Нет механизма do_handshake_on_connect. Вы должны всегда вручную вызывать
do_handshake()для начала рукопожатия. - Нет обработки suppress_ragged_eofs. Все условия конца файла, нарушающие протокол, сообщаются посредством исключения
SSLEOFError. - Вызов метода
unwrap()ничего не возвращает, в отличие от сокета SSL, где он возвращает подлежащий сокет. - Обратный вызов server_name_callback, переданный методу
SSLContext.set_servername_callback(), получит экземплярSSLObjectвместо экземпляраSSLSocketв качестве своего первого параметра.
Некоторые замечания, связанные с использованием
SSLObject:- Все операции ввода/вывода с
SSLObjectявляются неблокирующими. Это означает, что, например,read()вызовет исключениеSSLWantReadError, если ему потребуется больше данных, чем доступно в входящем BIO. - Нет вызова на уровне модуля
wrap_bio()как дляwrap_socket(). ЭкземплярSSLObjectвсегда создается черезSSLContext.
Изменено в версии 3.7:
SSLObjectэкземпляры должны быть созданы с помощьюwrap_bio(). В более ранних версиях было возможно создавать экземпляры напрямую. Это никогда не документировалось и не поддерживалось официально.
Объект SSLObject взаимодействует с внешним миром с помощью буферов памяти. Класс MemoryBIO предоставляет буфер памяти, который можно использовать для этой цели. Он оборачивает объект памяти OpenSSL BIO (Basic IO):
-
class ssl.MemoryBIO Буфер памяти, который можно использовать для передачи данных между Python и экземпляром протокола SSL.
-
pending Возвращает количество байтов, в настоящее время находящихся в буфере памяти.
-
eof Булево значение, указывающее, находится ли память BIO в позиции конца файла.
-
read(n=- 1) Считывает до n байтов из буфера памяти. Если n не указано или отрицательно, возвращаются все байты.
-
write(buf) Записывает байты из buf в память BIO. Аргумент buf должен быть объектом, поддерживающим протокол буферов.
Возвращаемое значение — количество записанных байтов, которое всегда равно длине buf.
-
Сессия SSL
Новая в версии 3.6.
-
class ssl.SSLSession -
Объект сессии, используемый
session.-
id
-
time
-
timeout
-
ticket_lifetime_hint
-
has_ticket
-
Рекомендации по безопасности
Лучшие значения по умолчанию
Для использования в качестве клиента, если у вас нет особых требований к политике безопасности, настоятельно рекомендуется использовать функцию create_default_context() для создания контекста SSL. Она загрузит доверенные сертификаты CA системы, включит проверку сертификатов и имени хоста и попытается выбрать разумно безопасные настройки протокола и шифров.
Например, вот как вы можете использовать класс smtplib.SMTP для создания надёжного защищённого соединения с SMTP-сервером:
>>> import ssl, smtplib
>>> smtp = smtplib.SMTP("mail.python.org", port=587)
>>> context = ssl.create_default_context()
>>> smtp.starttls(context=context)
(220, b'2.0.0 Ready to start TLS')
Если для соединения требуется сертификат клиента, его можно добавить с помощью SSLContext.load_cert_chain().
В отличие от этого, если вы создаёте контекст SSL, вызывая конструктор SSLContext самостоятельно, он не будет иметь включённой проверки сертификатов и имени хоста по умолчанию. Если вы сделаете это, пожалуйста, прочитайте следующие параграфы, чтобы достичь хорошего уровня безопасности.
Настройки вручную
Проверка сертификатов
При прямом вызове конструктора SSLContext, значение CERT_NONE является значением по умолчанию. Поскольку он не аутентифицирует другой узел, это может быть небезопасно, особенно в режиме клиента, где в большинстве случаев вы хотите убедиться в подлинности сервера, с которым вы общаетесь. Поэтому, в режиме клиента, настоятельно рекомендуется использовать CERT_REQUIRED. Однако этого недостаточно; вы также должны проверить, что сертификат сервера, который можно получить, вызвав SSLSocket.getpeercert(), соответствует требуемому сервису. Для многих протоколов и приложений сервис можно идентифицировать по имени хоста; в этом случае можно использовать функцию match_hostname(). Эта общая проверка выполняется автоматически, когда SSLContext.check_hostname включён.
Изменено в версии 3.7: Сопоставление имён хостов теперь выполняется OpenSSL. Python больше не использует match_hostname().
В режиме сервера, если вы хотите аутентифицировать своих клиентов с помощью слоя SSL (вместо использования механизма аутентификации более высокого уровня), вам также необходимо указать CERT_REQUIRED и аналогичным образом проверить сертификат клиента.
Версии протокола
SSL версии 2 и 3 считаются небезопасными и, следовательно, их использование опасно. Если вы хотите максимальную совместимость между клиентами и серверами, рекомендуется использовать PROTOCOL_TLS_CLIENT или PROTOCOL_TLS_SERVER в качестве версии протокола. SSLv2 и SSLv3 отключены по умолчанию.
>>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) >>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3 >>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3
Созданный выше контекст SSL будет допускать только соединения TLSv1.3 и более поздних версий (если они поддерживаются вашей системой) с сервером. PROTOCOL_TLS_CLIENT по умолчанию подразумевает проверку сертификатов и имени хоста. Вам нужно загрузить сертификаты в контекст.
Выбор шифра
Если у вас есть расширенные требования к безопасности, то можно выполнить тонкую настройку шифров, используемых при согласовании сессии SSL, через метод SSLContext.set_ciphers(). Начиная с Python 3.2.3, модуль ssl по умолчанию отключает некоторые слабые шифры, но вы можете дополнительно ограничить выбор шифра. Убедитесь, что вы прочитали документацию OpenSSL по формату списка шифров. Если вы хотите проверить, какие шифры включены в заданном списке шифров, используйте SSLContext.get_ciphers() или команду openssl ciphers на вашей системе.
Многопоточность
Если вы используете этот модуль в многопоточной программе (например, используя модули multiprocessing или concurrent.futures), имейте в виду, что внутренний генератор случайных чисел OpenSSL не обрабатывает вилки процессов должным образом. Приложения должны изменить состояние ПГС родительского процесса, если они используют какие-либо функции SSL с os.fork(). Любой успешный вызов RAND_add(), RAND_bytes() или RAND_pseudo_bytes() будет достаточным.
TLS 1.3
Новая в версии 3.7.
Протокол TLS 1.3 немного отличается от предыдущих версий TLS/SSL. Некоторые новые возможности TLS 1.3 ещё недоступны.
- TLS 1.3 использует отдельный набор наборов шифров. Все наборы шифров AES-GCM и ChaCha20 включены по умолчанию. Метод
SSLContext.set_ciphers()пока не может включать или отключать какие-либо шифры TLS 1.3, ноSSLContext.get_ciphers()возвращает их. - Билеты сеанса больше не передаются как часть первоначального рукопожатия и обрабатываются по-другому.
SSLSocket.sessionиSSLSessionнесовместимы с TLS 1.3. - Сертификаты клиента на стороне клиента также больше не проверяются во время первоначального рукопожатия. Сервер может запросить сертификат в любой момент. Клиенты обрабатывают запросы на сертификаты, пока отправляют или принимают данные приложения от сервера.
- Функции TLS 1.3, такие как ранние данные, отложенный запрос TLS-сертификата клиента, настройка алгоритмов подписи и повторное ключевание, пока не поддерживаются.
См. также
-
Classsocket.socket -
Документация базового класса
socket - SSL/TLS Strong Encryption: An Introduction
-
Вступление из документации Apache HTTP Server
- RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management
-
Стив Кент
- RFC 4086: Требования к случайности для безопасности
-
Дональд Э., Джеффри Шиллер
- RFC 5280: Профиль сертификата и списка отзыва сертификатов (CRL) для публичной инфраструктуры открытых ключей в Интернете X.509
-
Д. Купер
- RFC 5246: Протокол безопасности транспортного уровня (TLS) версии 1.2
-
Т. Диркс и др.
- RFC 6066: Расширения безопасности транспортного уровня (TLS)
-
Д. Истлейк
- IANA TLS: Параметры безопасности транспортного уровня (TLS)
-
IANA
- RFC 7525: Рекомендации по безопасному использованию безопасности транспортного уровня (TLS) и безопасности транспортного уровня для датаграмм (DTLS)
-
IETF
- Рекомендации Mozilla по TLS на стороне сервера
-
Mozilla
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/ssl.html