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