direct_tls doesn't work with PostgreSQL 17+ because ALPN isn't set
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 76/100
Direção de pesquisa
Comece localizando os contextos SSL que asyncpg cria para direct_tls e o caminho de conexão que lida com a negociação SSL direta. Reproduza usando o comando Docker do PostgreSQL 18 presente na issue e, em seguida, verifique se as conexões com direct_tls funcionam com o contexto padrão e adicione ou atualize a cobertura do protocolo ALPN do PostgreSQL.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
- asyncpg version: 0.31.0 (also checked master)
- PostgreSQL version: 17.11 and 18.0
- Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?: No, reproduced with a local PostgreSQL in Docker - Python version: 3.12
- Platform: Linux
- Do you use pgbouncer?: No
- Did you install asyncpg with pip?: Yes (via uv)
- If you built asyncpg locally, which version of Cython did you use?: N/A
- Can the issue be reproduced under both asyncio and
uvloop?: Only tried asyncio
When connecting with direct_tls=True, the connection gets dropped right away:
await asyncpg.connect(dsn, ssl="require", direct_tls=True)
# ConnectionDoesNotExistError: connection was closed in the middle of operation
The server log says why:
LOG: received direct SSL connection request without ALPN protocol negotiation extension
PostgreSQL 17 requires the postgresql ALPN protocol for direct SSL connections, and libpq always sends it. asyncpg doesn't set ALPN on the context it builds, so as far as I can tell direct_tls (and sslnegotiation=direct in the DSN) can't work against a stock PG 17+ server unless you pass your own context:
ctx = ssl.create_default_context()
ctx.set_alpn_protocols(["postgresql"])
await asyncpg.connect(dsn, ssl=ctx, direct_tls=True) # works
Repro with Docker:
docker run --rm -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres:18 \
-c ssl=on \
-c ssl_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem \
-c ssl_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
I'll send a PR that sets postgresql ALPN on the contexts asyncpg creates.
- Linguagem predominante
- Python
- Estrelas
- 8.1k
- Forks
- 469
- Merge médio
- 4d 1h
- PRs com merge (30d)
- 14
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de MagicStack/asyncpg
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 72/100
MagicStack/asyncpg#1342 ·
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 56/100
MagicStack/asyncpg#1340 · 1 comentário ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 28/100
MagicStack/asyncpg#1337 ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 42/100
MagicStack/asyncpg#1330 · 1 comentário ·
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 38/100
MagicStack/asyncpg#1322 ·
Todas as issues de MagicStack/asyncpg
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
stephrobert/dsoxlab#238 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
sublimehq/package_control#1780 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
nwg-piotr/nwg-displays#145 ·