все Python 3до 3.12Удалено из стандартной библиотекифункция
ssl.wrap_socket()
удалено
Оборачивал сокет в TLS без проверки сертификата и имени сервера. Удалён в Python 3.12 — используйте ssl.create_default_context() и context.wrap_socket().
Синтаксис
ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False) # до 3.12
Функция создавала временный контекст с опасными умолчаниями: не отправляла SNI и не проверяла ни сертификат, ни имя сервера, поэтому соединение было открыто для подмены (CWE-295). Её объявили устаревшей в Python 3.7 и убрали в 3.12. Как переписать: ctx = ssl.create_default_context() — контекст с проверкой сертификата и имени; затем tls = ctx.wrap_socket(sock, server_hostname='example.org'). Для сервера: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER), ctx.load_cert_chain(certfile, keyfile), затем ctx.wrap_socket(sock, server_side=True).
Примеры
# Python 3.12+
import ssl
try:
ssl.wrap_socket
except AttributeError as e:
print(type(e).__name__) # → AttributeError
# Python 3.12+
import socket, ssl
ctx = ssl.create_default_context()
print(ctx.check_hostname, ctx.verify_mode == ssl.CERT_REQUIRED) # → True True
with socket.socket() as raw:
tls = ctx.wrap_socket(raw, server_hostname='example.org')
print(tls.server_hostname) # → example.org
import socket, ssl
with socket.socket() as raw:
tls = ssl.wrap_socket(raw)
print(type(tls).__name__) # → SSLSocket
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности