MagicStack / MagicStack/asyncpg

`sslmode=prefere` surface misleading "no encryption" error when using a wrong password

Aberta
#1,306 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Linguagem predominante
Python
Estrelas
8.1k
Forks
468
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

## Summary
When connecting with the default `sslmode=prefere` to a PostreSQL server that requires SSL (e.g. Amazon RDS with their default force_ssl=1), asyncpg reports:
```
asyncpg.exceptions.InvalidAuthorizationSpecificationError:
no pg_hba.conf entry for host "...", user "...", database "...", no encryption
```
The "no encryption" message points at an SSL/`pg_hba.conf` problem, when the actual issue is simply wrong credentials. This can send users on a lengthy debugging detour (so I heard).

## Steps to reproduce

1. Set up a PostgreSQL instance that requires SSL (e.g. Amazon RDS with `rds.force_ssl=1`).
2. Attempt to connect with `sslmode=prefer` (or rely on the default) using an **incorrect password**.

**Expected:** An error indicating password authentication failed (or at least something that points toward credentials). **Actual:** `no pg_hba.conf entry ... no encryption`

## Analysis
(Disclaimer: First glance at the asyncpg code and no Python dev)
I believe what's happening is the following
The retry logic in `_connect_addr` / `__connect_addr` (`connect_utils.py`) does the following for `sslmode=prefer`:

1. **First attempt** — connects with SSL. The TLS handshake succeeds, but authentication fails, raising `InvalidAuthorizationSpecificationError`. The exact server message from this first attempt is never surfaced to the user.
2. The exception handler at the `except InvalidAuthorizationSpecificationError` block checks `retry and params.sslmode == SSLMode.prefer and pr.is_ssl` — all `True` — and raises `_RetryConnectSignal`.
3. **Second attempt** — connects **without SSL**. The server, which requires SSL, rejects the plaintext connection with the `pg_hba.conf` / "no encryption" error. This is the only error the user sees.

Is there a way to safely distinguish between both cases and do not attempt to retry when the first attempt fails because of a wrong password? Or otherwise: Can we preserve the error message and raise both?

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece reproduzindo a falha contra um servidor PostgreSQL que exija SSL com uma senha incorreta e, em seguida, inspecione _connect_addr/__connect_addr e o tratamento de novas tentativas em connect_utils.py. Está concluído quando a primeira falha de autenticação é preservada ou a nova tentativa deixa de substituí-la pelo erro enganoso "no encryption".

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
postgresql, python
Domínio
backend, databases
Tipo de issue
Bug
Dificuldade
4/5
Tempo estimado
3-5 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.