Поддерживается ли протокол TLSv1.3 в библиотеке aiohttp?

Как можно реализовать создание TLS сертификата с помощью aiohttp, аналогично тому, как это сделано с использованием requests.adapter.HTTPAdapter в библиотеке requests?
  • 18 января 2024 г. 15:09
Ответы на вопрос 2
Да, библиотека `aiohttp` поддерживает TLS 1.3, но это также зависит от версии OpenSSL, которую использует ваша Python-среда. Чтобы использовать TLS 1.3 с `aiohttp`, вам нужно убедиться, что установлены соответствующие версии `aiohttp`, `pyOpenSSL`, и что сама система поддерживает TLS 1.3.

Чтобы использовать TLS в `aiohttp`, вам следует использовать `SSLContext`, который настроен на использование необходимой версии TLS. Вот пример, показывающий, как это можно сделать:

```python
import ssl
import aiohttp

# Создайте SSL контекст
ssl_context = ssl.create_default_context()
# Настройте SSL контекст для использования TLS 1.3 (если поддерживается вашей системой)
ssl_context.options |= (
    ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_TLSv1_2
)

# Теперь мы можем создать aiohttp сессию с этим SSL контекстом
async with aiohttp.ClientSession() as session:
    async with session.get('https://your-secure-site.com', ssl=ssl_context) as resp:
        print(resp.status)
        print(await resp.text())
```

Этот код создает сессию `aiohttp` с контекстом SSL, настроенным на работу с TLS 1.3, если это поддерживается.

Что касается создания TLS сертификата с `aiohttp`, этот функционал напрямую не предоставляется библиотекой, так как `aiohttp` — это асинхронный HTTP-клиент/сервер, а не инструмент для управления TLS-сертификатами. В `requests`, аналог `HTTPAdapter` используется для настройки транспортного уровня, включая таймауты, количество попыток подключения, SSL-параметры и так далее.

Для управления сертификатами (создание, подпись и т.д.) вы можете использовать сторонние библиотеки, такие как `pyOpenSSL` или `cryptography`. Пример создания самоподписанного сертификата с использованием `cryptography`:

```python
from cryptography import x509
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
from cryptography.x509.oid import NameOID
import datetime

# Генерация ключа
key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

# Создание запроса на сертификат
subject = issuer = x509.Name([
    x509.NameAttribute(NameOID.COUNTRY_NAME, u"RU"),
    x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"Russia"),
    x509.NameAttribute(NameOID.LOCALITY_NAME, u"Saint Petersburg"),
    x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"My Company"),
    x509.NameAttribute(NameOID.COMMON_NAME, u"mysite.com"),
])
cert = x509.CertificateBuilder().subject_name(
    subject
).issuer_name(
    issuer
).public_key(
    key.public_key()
).serial_number(
    x509.random_serial_number()
).not_valid_before(
    datetime.datetime.utcnow()
).not_valid_after(
    # Сертификат действителен в течение 1 года
    datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
    x509.SubjectAlternativeName([x509.DNSName(u"mysite.com")]),
    critical=False,
    # Подпишите сертификат самоподписным ключом
).sign(key, hashes.SHA256())

# Сериализация ключа и сертификата
with open("private_key.pem", "wb") as f:
    f.write(key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.TraditionalOpen
Забавно. Скоро не будет никакого смысла идти за ответом сюда, когда можно к чатжпт сходить. 
Даже читать не стал ваш вопрос после заголовка и скопировал его в чатжпт4. Вот что он ответил:

В `aiohttp`, процесс создания и настройки пользовательского TLS контекста отличается от того, что используется в `requests`. В `aiohttp`, вы должны настроить SSL контекст до создания сессии и передать его в качестве аргумента при создании клиентской сессии. Вот как вы можете адаптировать ваш пример для `aiohttp`:

1. Создайте SSL контекст, используя стандартную библиотеку `ssl`.
2. Настройте контекст, задав нужные параметры, такие как версия TLS, набор шифров и кривые ECDH.
3. Создайте экземпляр `aiohttp.ClientSession`, передав SSL контекст.

Пример кода:


В этом примере кода создаётся пользовательский SSL контекст, который затем используется для создания `aiohttp.ClientSession`. Обратите внимание, что вам нужно будет заменить `'...'` в `ciphers` на фактический список шифров, которые вы хотите использовать.
Похожие вопросы