ssl — Обёртка TLS/SSL для сокетов
Исходный код: Lib/ssl.py
Этот модуль предоставляет доступ к средствам шифрования Transport Layer Security (часто известным как «Secure Sockets Layer») и аутентификации участников для сетевых сокетов, как для клиента, так и для сервера. Этот модуль использует библиотеку OpenSSL. Он доступен на всех современных Unix-системах, Windows, macOS и, вероятно, на дополнительных платформах, если на данной платформе установлена OpenSSL.
Примечание
Некоторые особенности могут зависеть от платформы, так как вызовы выполняются к системным API сокетов. Установленная версия OpenSSL также может влиять на поведение. Например, TLSv1.1 и TLSv1.2 поставляются с openssl версии 1.0.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.
Функции, константы и исключения
Создание сокета
Начиная с Python 3.2 и 2.7.9, рекомендуется использовать метод SSLContext.wrap_socket() экземпляра SSLContext для обертывания сокетов в объекты SSLSocket. Вспомогательная функция create_default_context() возвращает новый контекст с безопасными настройками по умолчанию. Старая функция wrap_socket() устарела, так как она неэффективна и не поддерживает указание имени сервера (SNI) и сопоставление имён хостов.
Пример сокета клиента с контекстом по умолчанию и IPv4/IPv6 двойным стеком:
import socket
import ssl
hostname = 'www.python.org'
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Пример сокета клиента с настраиваемым контекстом и IPv4:
hostname = 'www.python.org'
# PROTOCOL_TLS_CLIENT requires valid cert chain and hostname
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('path/to/cabundle.pem')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
Пример сокета сервера, прослушивающего на localhost IPv4:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
sock.bind(('127.0.0.1', 8443))
sock.listen(5)
with context.wrap_socket(sock, server_side=True) as ssock:
conn, addr = ssock.accept()
...
Создание контекста
Вспомогательная функция помогает создавать объекты SSLContext для общих целей.
-
ssl.create_default_context(purpose=Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None) -
Возвращает новый объект
SSLContextс настройками по умолчанию для заданного purpose. Настройки выбираются модулемsslи обычно представляют собой более высокий уровень безопасности, чем при прямом вызове конструктораSSLContext.cafile, capath, cadata представляют собой необязательные сертификаты CA, которым необходимо доверять для проверки сертификатов, как в
SSLContext.load_verify_locations(). Если все три равныNone, эта функция может выбрать доверие системным сертификатам CA по умолчанию.Настройки:
PROTOCOL_TLS,OP_NO_SSLv2иOP_NO_SSLv3с надёжными шифрами без RC4 и без неаутентифицированных шифров. ПередачаSERVER_AUTHв качестве purpose устанавливаетverify_modeвCERT_REQUIREDи либо загружает сертификаты CA (если хотя бы один из cafile, capath или cadata задан), либо используетSSLContext.load_default_certs()для загрузки сертификатов CA по умолчанию.Когда
keylog_filenameподдерживается и переменная средыSSLKEYLOGFILEзадана,create_default_context()включает ведение журнала ключей.Примечание
Протокол, параметры, шифр и другие настройки могут меняться на более строгие значения в любое время без предварительного предупреждения. Значения представляют собой разумный баланс между совместимостью и безопасностью.
Если вашему приложению требуются определённые настройки, вы должны создать
SSLContextи применить настройки самостоятельно.Примечание
Если вы обнаружите, что при попытке подключения некоторых более старых клиентов или серверов с помощью
SSLContext, созданного этой функцией, появляется ошибка «Несовпадение протокола или набора шифров», возможно, они поддерживают только SSL3.0, что эта функция исключает, используяOP_NO_SSLv3. SSL3.0 широко считается полностью небезопасным. Если вы всё ещё хотите продолжить использование этой функции, но по-прежнему допускаете подключения SSL 3.0, вы можете включить их повторно, используя:ctx = ssl.create_default_context(Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3
Добавлена в версии 3.4.
Изменено в версии 3.4.4: RC4 был исключён из строку шифров по умолчанию.
Изменено в версии 3.6: ChaCha20/Poly1305 был добавлен в строку шифров по умолчанию.
3DES был исключён из строку шифров по умолчанию.
Изменено в версии 3.8: Добавлена поддержка ведения журнала ключей в
SSLKEYLOGFILE.
Исключения
-
exception ssl.SSLError -
Вызывается для сигнализации об ошибке в базовой реализации SSL (в настоящее время предоставляется библиотекой OpenSSL). Это указывает на какую-то проблему в верхнем уровне шифрования и аутентификации, наложенном на базовое сетевое соединение. Эта ошибка является подтипом
OSError. Код ошибки и сообщение экземпляровSSLErrorпредоставляются библиотекой OpenSSL.Изменено в версии 3.3:
SSLErrorранее была подтипомsocket.error.-
library -
Мемоническая строка, обозначающая подмодуль OpenSSL, в котором произошла ошибка, например,
SSL,PEMилиX509. Диапазон возможных значений зависит от версии OpenSSL.Добавлена в версии 3.3.
-
reason -
Мемоническая строка, обозначающая причину возникновения этой ошибки, например,
CERTIFICATE_VERIFY_FAILED. Диапазон возможных значений зависит от версии OpenSSL.Добавлена в версии 3.3.
-
-
exception ssl.SSLZeroReturnError -
Подкласс
SSLError, вызываемый при попытке чтения или записи, когда SSL-соединение было закрыто корректно. Обратите внимание, что это не означает, что базовый транспорт (TCP) был закрыт.Добавлена в версии 3.3.
-
exception ssl.SSLWantReadError -
Подкласс
SSLError, вызываемый неблокирующим SSL-сокет при попытке чтения или записи данных, но для выполнения запроса необходимо получить больше данных по базовому TCP-транспорту.Добавлена в версии 3.3.
-
exception ssl.SSLWantWriteError -
Подкласс
SSLError, вызываемый неблокирующим SSL-сокет при попытке чтения или записи данных, но для выполнения запроса необходимо отправить больше данных по базовому TCP-транспорту.Добавлена в версии 3.3.
-
exception ssl.SSLSyscallError -
Подкласс
SSLError, вызываемый при возникновении системной ошибки при попытке выполнить операцию на SSL-сокете. К сожалению, нет простого способа проверить исходный номер errno.Добавлена в версии 3.3.
-
exception ssl.SSLEOFError -
Подкласс
SSLError, вызываемый при резком прекращении SSL-соединения. Как правило, не следует пытаться повторно использовать базовый транспорт при возникновении этой ошибки.Добавлена в версии 3.3.
-
exception ssl.SSLCertVerificationError -
Подкласс
SSLError, вызываемый при неудачной проверке сертификата.Добавлена в версии 3.7.
-
verify_code -
Числовой код ошибки, указывающий на ошибку проверки.
-
verify_message -
Строка, отображающая ошибку проверки для пользователя.
-
-
exception ssl.CertificateError -
Псевдоним для
SSLCertVerificationError.Изменено в версии 3.7: Исключение теперь является псевдонимом для
SSLCertVerificationError.
Генерация случайных чисел
-
ssl.RAND_bytes(num) -
Возвращает num криптографически сильных псевдослучайных байтов. Вызывает
SSLError, если генератор псевдослучайных чисел (PRNG) не был достаточно инициализирован данными или если операция не поддерживается текущим методом RAND.RAND_status()может быть использован для проверки состояния PRNG, аRAND_add()— для инициализации PRNG.Для почти всех применений предпочтительнее использовать
os.urandom().Прочитайте статью Википедии Cryptographically secure pseudorandom number generator (CSPRNG), чтобы узнать требования к криптографически сильному генератору.
Добавлена в версии 3.3.
-
ssl.RAND_pseudo_bytes(num) -
Возвращает (bytes, is_cryptographic): bytes — num псевдослучайных байтов, is_cryptographic —
Trueесли сгенерированные байты криптографически сильны. ВызываетSSLError, если операция не поддерживается текущим методом RAND.Сгенерированные последовательности псевдослучайных байтов будут уникальными, если они достаточно длинные, но не обязательно предсказуемы. Они могут использоваться для некриптографических целей и для некоторых целей в криптографических протоколах, но обычно не для генерации ключей и т. п.
Для почти всех применений предпочтительнее использовать
os.urandom().Добавлена в версии 3.3.
Устарело начиная с версии 3.6: OpenSSL устарело
ssl.RAND_pseudo_bytes(), используйтеssl.RAND_bytes()вместо этого.
-
ssl.RAND_status() -
Возвращает
Trueесли генератор псевдослучайных чисел SSL был инициализирован достаточным количеством случайности, иFalseв противном случае. Можно использоватьssl.RAND_egd()иssl.RAND_add()для увеличения случайности генератора псевдослучайных чисел.
-
ssl.RAND_egd(path) -
Если где-то работает демон сбора энтропии (EGD), и path — имя сокета, открытого для него, эта функция прочитает 256 байтов случайности из сокета и добавит их в генератор псевдослучайных чисел SSL для повышения безопасности сгенерированных секретных ключей. Это обычно необходимо только на системах без лучших источников случайности.
См. http://egd.sourceforge.net/ или http://prngd.sourceforge.net/ для источников демонов сбора энтропии.
Доступность: недоступно с LibreSSL и OpenSSL > 1.1.0.
-
ssl.RAND_add(bytes, entropy) -
Смешивает заданные bytes в генератор псевдослучайных чисел SSL. Параметр entropy (вещественное число) — нижняя граница энтропии, содержащейся в строке (поэтому всегда можно использовать
0.0). См. RFC 1750 для получения дополнительной информации о источниках энтропии.Изменено в версии 3.5: Теперь принимается записываемый объект-подобный байтам.
Обработка сертификатов
-
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-метки, такие как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, ca_certs=None) -
Получает сертификат сервера, защищенного SSL, по адресу
addr, как (hostname, port-number) пару, и возвращает его как PEM-кодированную строку. Еслиssl_versionуказан, используется эта версия протокола SSL для попытки подключения к серверу. Еслиca_certsуказан, он должен содержать список корневых сертификатов в том же формате, что и для того же параметра вSSLContext.wrap_socket(). Вызов попытается проверить сертификат сервера против этого набора корневых сертификатов и завершится ошибкой, если попытка проверки завершится неудачей.Изменено в версии 3.3: Функция теперь совместима с IPv6.
Изменено в версии 3.5: Значение по умолчанию ssl_version изменено с
PROTOCOL_SSLv3наPROTOCOL_TLSдля максимальной совместимости с современными серверами.
-
ssl.DER_cert_to_PEM_cert(DER_cert_bytes) -
Принимая сертификат в виде DER-кодированного двоичного блока байтов, возвращает PEM-кодированную строковую версию того же сертификата.
-
ssl.PEM_cert_to_DER_cert(PEM_cert_string) -
Принимая сертификат в виде ASCII PEM-строки, возвращает DER-кодированную последовательность байтов для этого же сертификата.
-
ssl.get_default_verify_paths() -
Возвращает кортеж с именами путей к файлу cafile и каталогу capath по умолчанию OpenSSL. Эти пути такие же, как используются
SSLContext.set_default_verify_paths(). Возвращаемое значение — именованный кортежDefaultVerifyPaths:-
cafile— разрешенный путь к cafile илиNoneесли файл не существует, -
capath— разрешенный путь к capath илиNoneесли каталог не существует, -
openssl_cafile_env— системный ключ OpenSSL, указывающий на cafile, -
openssl_cafile— жёстко заданный путь к cafile, -
openssl_capath_env— системный ключ OpenSSL, указывающий на capath, -
openssl_capath— жёстко заданный путь к каталогу capath
Доступность: 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_*.
Новое в версии 3.6.
-
ssl.VERIFY_DEFAULT -
Возможные значения для
SSLContext.verify_flags. В этом режиме списки отозванных сертификатов (CRL) не проверяются. По умолчанию OpenSSL не требует и не проверяет CRL.Новое в версии 3.4.
-
ssl.VERIFY_CRL_CHECK_LEAF -
Возможные значения для
SSLContext.verify_flags. В этом режиме проверяется только сертификат узла, но не промежуточные сертификаты CA. Режим требует действительного CRL, подписанного издателем сертификата узла (его непосредственным предком CA). Если CRL не загружен с помощьюSSLContext.load_verify_locations, проверка завершится неудачей.Новое в версии 3.4.
-
ssl.VERIFY_CRL_CHECK_CHAIN -
Возможные значения для
SSLContext.verify_flags. В этом режиме проверяются CRL всех сертификатов в цепочке сертификатов узла.Новое в версии 3.4.
-
ssl.VERIFY_X509_STRICT -
Возможные значения для
SSLContext.verify_flagsдля отключения решений для работы с поврежденными сертификатами X.509.Новое в версии 3.4.
-
ssl.VERIFY_X509_TRUSTED_FIRST -
Возможные значения для
SSLContext.verify_flags. Оно инструктирует OpenSSL отдавать предпочтение доверенным сертификатам при построении цепочки доверия для проверки сертификата. Этот флаг включен по умолчанию.Новое в версии 3.4.4.
-
class ssl.VerifyFlags -
Коллекция постоянных значений VERIFY_*.
Новое в версии 3.6.
-
ssl.PROTOCOL_TLS -
Выбирает самую высокую версию протокола, поддерживаемую как клиентом, так и сервером. Несмотря на название, этот параметр может выбрать как протоколы «SSL», так и «TLS».
Новое в версии 3.6.
-
ssl.PROTOCOL_TLS_CLIENT -
Автоматически переключается на самую высокую версию протокола, как
PROTOCOL_TLS, но поддерживает только клиентские подключенияSSLSocket. Протокол по умолчанию включаетCERT_REQUIREDиcheck_hostname.Новое в версии 3.6.
-
ssl.PROTOCOL_TLS_SERVER -
Автоматически переключается на самую высокую версию протокола, как
PROTOCOL_TLS, но поддерживает только серверные подключенияSSLSocket.Новое в версии 3.6.
-
ssl.PROTOCOL_SSLv23 -
Псевдоним для
PROTOCOL_TLS.Устарело начиная с версии 3.6: Используйте
PROTOCOL_TLSвместо этого.
-
ssl.PROTOCOL_SSLv2 -
Выбирает SSL версии 2 в качестве протокола шифрования канала.
Этот протокол недоступен, если OpenSSL скомпилирован с флагом
OPENSSL_NO_SSL2.Предупреждение
SSL версии 2 небезопасен. Его использование крайне не рекомендуется.
Устарело начиная с версии 3.6: OpenSSL удалил поддержку SSLv2.
-
ssl.PROTOCOL_SSLv3 -
Выбирает SSL версии 3 в качестве протокола шифрования канала.
Этот протокол недоступен, если OpenSSL скомпилирован с флагом
OPENSSL_NO_SSLv3.Предупреждение
SSL версии 3 небезопасен. Его использование крайне не рекомендуется.
Устарело начиная с версии 3.6: OpenSSL устарел все специфичные протоколы версий. Используйте протокол по умолчанию
PROTOCOL_TLSс флагами, такими какOP_NO_SSLv3вместо этого.
-
ssl.PROTOCOL_TLSv1 -
Выбирает TLS версии 1.0 в качестве протокола шифрования канала.
Устарело начиная с версии 3.6: В OpenSSL устарели все протоколы, специфичные для версии. Используйте вместо этого протокол по умолчанию
PROTOCOL_TLSсо флагами, такими какOP_NO_SSLv3.
-
ssl.PROTOCOL_TLSv1_1 -
Выбирает TLS версии 1.1 в качестве протокола шифрования канала. Доступно только с openssl версии 1.0.1+.
Введено в версии 3.4.
Устарело начиная с версии 3.6: В OpenSSL устарели все протоколы, специфичные для версии. Используйте вместо этого протокол по умолчанию
PROTOCOL_TLSсо флагами, такими какOP_NO_SSLv3.
-
ssl.PROTOCOL_TLSv1_2 -
Выбирает TLS версии 1.2 в качестве протокола шифрования канала. Это самая современная версия, и, вероятно, лучший выбор для максимальной защиты, если обе стороны её поддерживают. Доступно только с openssl версии 1.0.1+.
Введено в версии 3.4.
Устарело начиная с версии 3.6: В OpenSSL устарели все протоколы, специфичные для версии. Используйте вместо этого протокол по умолчанию
PROTOCOL_TLSсо флагами, такими какOP_NO_SSLv3.
-
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. Это полезно, если протокол приложения поддерживает собственную схему сжатия.
Этот параметр доступен только с OpenSSL 1.0.0 и более поздними версиями.
Введено в версии 3.3.
-
class ssl.Options -
enum.IntFlagколлекция констант OP_*.
-
ssl.OP_NO_TICKET -
Запретить клиенту запрашивать билет сессии.
Введено в версии 3.6.
-
ssl.OP_IGNORE_UNEXPECTED_EOF -
Игнорировать неожиданное завершение TLS-соединений.
Этот параметр доступен только с OpenSSL 3.0.0 и более поздними версиями.
Введено в версии 3.10.
-
ssl.HAS_ALPN -
Поддерживает ли библиотека OpenSSL встроенную поддержку расширения TLS 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 встроенную поддержку обмена ключами Diffie-Hellman на основе эллиптических кривых. Это должно быть верно, если функция не была явно отключена распространителем.
Введено в версии 3.3.
-
ssl.HAS_SNI -
Наличие встроенной поддержки расширения Server Name Indication в библиотеке OpenSSL (как определено в RFC 6066).
Введено в версии 3.2.
-
ssl.HAS_NPN -
Наличие встроенной поддержки Next Protocol Negotiation в библиотеке OpenSSL, как описано в документе по согласованию протоколов прикладного уровня. В случае значения
True, вы можете использовать методSSLContext.set_npn_protocols(), чтобы указать поддерживаемые протоколы.Введено в версии 3.3.
-
ssl.HAS_SSLv2 -
Наличие встроенной поддержки протокола SSL 2.0 в библиотеке OpenSSL.
Введено в версии 3.7.
-
ssl.HAS_SSLv3 -
Наличие встроенной поддержки протокола SSL 3.0 в библиотеке OpenSSL.
Введено в версии 3.7.
-
ssl.HAS_TLSv1 -
Наличие встроенной поддержки протокола TLS 1.0 в библиотеке OpenSSL.
Введено в версии 3.7.
-
ssl.HAS_TLSv1_1 -
Наличие встроенной поддержки протокола TLS 1.1 в библиотеке OpenSSL.
Введено в версии 3.7.
-
ssl.HAS_TLSv1_2 -
Наличие встроенной поддержки протокола TLS 1.2 в библиотеке OpenSSL.
Введено в версии 3.7.
-
ssl.HAS_TLSv1_3 -
Наличие встроенной поддержки протокола TLS 1.3 в библиотеке OpenSSL.
Введено в версии 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.
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(). В предыдущих версиях было возможно создавать экземпляры напрямую. Это никогда не документировалось и официально не поддерживалось.
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— кортежи, содержащие последовательность относительных distinguished names (RDNs), указанных в структуре данных сертификата для соответствующих полей, причём каждый 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и URIOCSP.Изменено в версии 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.
-
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 Contexts
Новые в версии 3.2.
Контекст SSL хранит различные данные, более долгоживущие, чем отдельные подключения SSL, такие как параметры конфигурации SSL, сертификаты и закрытые ключи. Он также управляет кешем сессий SSL для сокетов на стороне сервера, чтобы ускорить повторные подключения от тех же клиентов.
-
class ssl.SSLContext(protocol=PROTOCOL_TLS) -
Создайте новый контекст 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). -
Объекты SSLContext имеют следующие методы и атрибуты:
-
SSLContext.cert_store_stats() -
Получить статистику о количестве загруженных сертификатов X.509, количество сертификатов X.509, помеченных как сертификаты удостоверяющих центров, и списки отзыва сертификатов в виде словаря.
Пример для контекста с одним сертификатом CA и одним другим сертификатом:
>>> context.cert_store_stats() {'crl': 0, 'x509_ca': 1, 'x509': 2}Новые в версии 3.4.
-
SSLContext.load_cert_chain(certfile, keyfile=None, password=None) -
Загрузить закрытый ключ и соответствующий сертификат. Строка certfile должна указывать на файл в формате PEM, содержащий сертификат, а также любое количество сертификатов CA, необходимых для установления подлинности сертификата. Строка keyfile, если она присутствует, должна указывать на файл, содержащий закрытый ключ. В противном случае закрытый ключ будет взят из certfile. Более подробную информацию о том, как сертификат хранится в certfile, см. в разделе Сертификаты.
Аргумент password может быть функцией для получения пароля для дешифрования закрытого ключа. Он будет вызван только в том случае, если закрытый ключ зашифрован и необходим пароль. Он будет вызван без аргументов и должен вернуть строку, байты или массив байтов. Если возвращаемое значение является строкой, оно будет закодировано как 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() # OpenSSL 1.0.x [{'alg_bits': 256, 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(256) Mac=AEAD', 'id': 50380848, 'name': 'ECDHE-RSA-AES256-GCM-SHA384', 'protocol': 'TLSv1/SSLv3', 'strength_bits': 256}, {'alg_bits': 128, 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA ' 'Enc=AESGCM(128) Mac=AEAD', 'id': 50380847, 'name': 'ECDHE-RSA-AES128-GCM-SHA256', 'protocol': 'TLSv1/SSLv3', 'strength_bits': 128}]В OpenSSL 1.1 и более поздних версиях словарь шифров содержит дополнительные поля:
>>> ctx.get_ciphers() # OpenSSL 1.1+ [{'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'}]Доступность: OpenSSL 1.0.2+.
Добавлен в версии 3.6.
-
SSLContext.set_default_verify_paths() -
Загрузить набор стандартных сертификатов уполномоченных центров сертификации (CA) из пути к файловой системе, определённого при построении библиотеки OpenSSL. К сожалению, нет простого способа узнать, успешна ли эта операция: никакой ошибки не возвращается, если сертификаты не найдены. Однако, если библиотека OpenSSL предоставляется как часть операционной системы, она, скорее всего, будет настроена должным образом.
-
SSLContext.set_ciphers(ciphers) -
Установить доступные шифры для сокетов, созданных с помощью этого контекста. Это должна быть строка в формате списка шифров OpenSSL. Если невозможно выбрать ни один шифр (потому что опции компиляции или другая конфигурация запрещают использование всех указанных шифров), будет возбуждено исключение
SSLError.Примечание
после подключения метод
SSLSocket.cipher()сокетов SSL вернёт текущий выбранный шифр.В OpenSSL 1.1.1 наборы шифров 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.OpenSSL 1.1.0 до 1.1.0e прервёт рукопожатие и вызовет
SSLError, когда обе стороны поддерживают ALPN, но не могут договориться о протоколе. 1.1.0f+ ведёт себя как 1.0.2,SSLSocket.selected_alpn_protocol()возвращает None.Добавлен в версии 3.5.
-
SSLContext.set_npn_protocols(protocols) -
Указать, какие протоколы должен рекламировать сокет во время рукопожатия SSL/TLS. Это должен быть список строк, например
['http/1.1', 'spdy/2'], упорядоченных по приоритету. Выбор протокола произойдёт во время рукопожатия в соответствии с переговорами протоколов прикладного уровня. После успешного рукопожатия методSSLSocket.selected_npn_protocol()вернёт согласованный протокол.Этот метод вызовет
NotImplementedError, еслиHAS_NPNравноFalse.Добавлен в версии 3.3.
-
SSLContext.sni_callback -
Регистрация функции обратного вызова, которая будет вызываться после получения сообщения TLS Client Hello сервером SSL/TLS, когда клиент TLS указывает индикацию имени сервера. Механизм индикации имени сервера описан в RFC 6066 разделе 3 - Server Name Indication.
Только один обратный вызов может быть задан на один
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 завершится с
ALERT_DESCRIPTION_INTERNAL_ERRORсообщением об ошибке TLS клиенту.Добавлен в версии 3.4.
-
SSLContext.load_dh_params(dhfile) -
Загрузить параметры генерации ключей для обмена ключами Диффи-Хеллмана (DH). Использование обмена ключами DH улучшает секретность в будущем, но за счёт вычислительных ресурсов (как на сервере, так и на клиенте). Параметр dhfile должен указывать путь к файлу с параметрами DH в формате PEM.
Это настройка не применяется к сокетам клиента. Также можно использовать опцию
OP_SINGLE_DH_USEдля дальнейшего повышения безопасности.Добавлен в версии 3.3.
-
SSLContext.set_ecdh_curve(curve_name) -
Установите имя кривой для обмена ключами Диффи-Хеллмана на основе эллиптических кривых (ECDH). ECDH значительно быстрее, чем обычный DH, сохраняя при этом, по всей видимости, такую же безопасность. Параметр curve_name должен быть строкой, описывающей известную эллиптическую кривую, например
prime256v1для широко поддерживаемой кривой.Это значение не применяется к сокетам клиента. Вы также можете использовать параметр
OP_SINGLE_ECDH_USEдля дальнейшего повышения безопасности.Этот метод недоступен, если
HAS_ECDHимеет значениеFalse.Добавлена в версии 3.3.
См. также
- SSL/TLS и полная передовая секретность
-
Винсент Бернат.
-
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, при server_side равном true будет возбуждено исключение
ValueError.Параметр
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 incoming и записывать данные в BIO outgoing.Параметры 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.Примечание
Эта функция требует OpenSSL 0.9.8f или более поздней версии.
-
SSLContext.keylog_filename -
Записывать ключи TLS в файл keylog всякий раз, когда генерируется или принимается материал ключа. Файл keylog предназначен только для отладки. Формат файла задаётся NSS и используется многими анализаторами трафика, такими как Wireshark. Лог-файл открывается в режиме добавления. Записи синхронизируются между потоками, но не между процессами.
Новое в версии 3.8.
Примечание
Эта функция требует OpenSSL 1.1.1 или новее.
-
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.Примечание
Этот атрибут недоступен, если модуль ssl скомпилирован с OpenSSL 1.1.0g или новее.
Новое в версии 3.7.
-
SSLContext.minimum_version -
Аналогично
SSLContext.maximum_version, но это самая низкая поддерживаемая версия илиTLSVersion.MINIMUM_SUPPORTED.Примечание
Этот атрибут недоступен, если модуль ssl скомпилирован с OpenSSL 1.1.0g или новее.
Новое в версии 3.7.
-
SSLContext.num_tickets -
Управляет количеством билетов сессий TLS 1.3 для контекста
TLS_PROTOCOL_SERVER. Настройки не влияют на соединения TLS 1.0-1.2.Примечание
Этот атрибут недоступен, если модуль ssl скомпилирован с OpenSSL 1.1.1 или новее.
Новое в версии 3.8.
-
SSLContext.options -
Целое число, представляющее набор включённых в этом контексте SSL-параметров. Значение по умолчанию —
OP_ALL, но вы можете указать и другие параметры, такие какOP_NO_SSLv2, объединив их с помощью операции поразрядного ИЛИ.Примечание
В версиях OpenSSL, более ранних, чем 0.9.8m, можно только устанавливать параметры, а не сбрасывать их. Попытка сбросить параметр (путем сброса соответствующих битов) вызовет
ValueError.Изменено в версии 3.6:
SSLContext.optionsвозвращает флагиOptions:>>> ssl.create_default_context().options <Options.OP_ALL|OP_NO_SSLv3|OP_NO_SSLv2|OP_NO_COMPRESSION: 2197947391>
-
SSLContext.post_handshake_auth -
Включить пост-рукопожатие аутентификацию клиента TLS 1.3. Пост-рукопожатие аутентификация по умолчанию отключена, и сервер может запросить только сертификат клиента TLS во время начального рукопожатия. При включении сервер может запросить сертификат клиента TLS в любое время после рукопожатия.
При включении на стороне клиента сокета клиент сигнализирует серверу, что он поддерживает пост-рукопожатие аутентификацию.
При включении на стороне сервера сокета
SSLContext.verify_modeтакже должен быть установлен наCERT_OPTIONALилиCERT_REQUIRED. Фактический обмен сертификатом клиента отложен до вызоваSSLSocket.verify_client_post_handshake()и выполнения некоторого ввода-вывода.Примечание
Доступно только с OpenSSL 1.1.1 и включенным TLS 1.3. Без поддержки TLS 1.3 значение свойства равно None и не может быть изменено
Новое в версии 3.8.
-
SSLContext.protocol -
Версия протокола, выбранная при создании контекста. Этот атрибут является только для чтения.
-
SSLContext.hostname_checks_common_name -
Определяет, будет ли
check_hostnameпереходить к проверке общего имени субъекта сертификата в отсутствие расширения альтернативного имени субъекта (по умолчанию: true).Примечание
Изменяется только с OpenSSL 1.1.0 или более поздней версией.
Новое в версии 3.7.
Изменено в версии 3.9.3: Флаг не имел эффекта с OpenSSL до версии 1.1.1k. Python 3.8.9, 3.9.3 и 3.10 включают обходные пути для предыдущих версий.
-
SSLContext.verify_flags -
Флаги для операций проверки сертификатов. Вы можете установить флаги, такие как
VERIFY_CRL_CHECK_LEAF, объединив их с помощью операции поразрядного ИЛИ. По умолчанию OpenSSL не требует и не проверяет списки отозванных сертификатов (CRL). Доступен только с версией openssl 0.9.8+.Новое в версии 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), что представляет собой закодированную в base-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
Если вам нужно подтвердить сертификат другой стороны соединения, вам нужно предоставить файл «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 проверяют сертификат сервера: это гарантирует, что сертификат сервера был подписан одним из сертификатов CA, проверяет правильность подписи и проверяет другие свойства, такие как действительность и идентификацию имени хоста:
>>> 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 предоставляет две взаимосвязанные, но distinct области функциональности:
- Обработка протокола 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.options |= ssl.OP_NO_TLSv1 >>> client_context.options |= ssl.OP_NO_TLSv1_1
Созданный выше контекст SSL позволит только подключениям TLSv1.2 и выше (если поддерживается вашей системой) к серверу. PROTOCOL_TLS_CLIENT по умолчанию подразумевает проверку сертификатов и имён хостов. Вам необходимо загрузить сертификаты в контекст.
Выбор шифров
Если у вас есть расширенные требования к безопасности, точная настройка шифров, используемых при согласовании сессии SSL, возможна с помощью метода SSLContext.set_ciphers(). Начиная с Python 3.2.3, модуль ssl отключает определённые слабые шифры по умолчанию, но вы можете дополнительно ограничить выбор шифров. Обязательно ознакомьтесь с документацией OpenSSL по формату списка шифров. Если вы хотите проверить, какие шифры включены в заданном списке шифров, используйте SSLContext.get_ciphers() или команду openssl ciphers на вашей системе.
Многопроцессорность
Если вы используете этот модуль в многопроцессорном приложении (например, с модулями multiprocessing или concurrent.futures), имейте в виду, что внутренний генератор случайных чисел OpenSSL не обрабатывает правильно разветвлённые процессы. Приложения должны изменить состояние PRNG родительского процесса, если они используют любые функции SSL с os.fork(). Любой успешный вызов RAND_add(), RAND_bytes() или RAND_pseudo_bytes() является достаточным.
TLS 1.3
Новая в версии 3.7.
Python имеет предварительную и экспериментальную поддержку TLS 1.3 с OpenSSL 1.1.1. Новый протокол ведёт себя немного иначе, чем предыдущие версии 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-клиента, настройка алгоритма подписи и переключение ключей, пока не поддерживаются.
Поддержка LibreSSL
LibreSSL — это форк OpenSSL 1.0.1. Модуль ssl имеет ограниченную поддержку LibreSSL. Некоторые функции недоступны, когда модуль ssl скомпилирован с LibreSSL.
- LibreSSL >= 2.6.1 больше не поддерживает NPN. Методы
SSLContext.set_npn_protocols()иSSLSocket.selected_npn_protocol()недоступны. -
SSLContext.set_default_verify_paths()игнорирует переменные средыSSL_CERT_FILEиSSL_CERT_PATH, хотяget_default_verify_paths()по-прежнему их отображает.
См. также
-
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
-
Steve Kent
- RFC 4086: Randomness Requirements for Security
-
Donald E., Jeffrey I. Schiller
- RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
-
D. Cooper
- RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
-
T. Dierks et. al.
- RFC 6066: Transport Layer Security (TLS) Extensions
-
D. Eastlake
- IANA TLS: Transport Layer Security (TLS) Parameters
-
IANA
- RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)
-
IETF
- Рекомендации Mozilla по TLS на стороне сервера
-
Mozilla
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/ssl.html