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