02 - Confirmação pelo Servidor
video: https://youtu.be/... no frontmatter da nota.Confirmação pelo Servidor
1. Definição e Contexto
No protocolo SSH, a Confirmação pelo Servidor é o estágio final e decisivo do processo de troca de chaves (Key Exchange — KEX). Após cliente e servidor realizarem os cálculos matemáticos do algoritmo Diffie-Hellman (ou ECDH), o servidor deve enviar uma prova inequívoca de que possui a identidade correta e de que o segredo compartilhado foi estabelecido com sucesso. Esta etapa encerra a fase de negociação em texto claro e "tranca" o túnel criptográfico.
Características do Estágio
- Mensagem chave:
SSH_MSG_KEXDH_REPLY(RFC 4253, seção 8). - Função: Provar identidade do servidor e integridade da negociação.
- Resultado: Transição para
SSH_MSG_NEWKEYS— ativação da cifra simétrica. - RFCs de referência: RFC 4251 (Architecture), RFC 4253 (Transport), RFC 5656 (ECDH), RFC 8731 (Curve25519 KEX).
2. O Pacote de Confirmação (SSH_MSG_KEXDH_REPLY)
A confirmação ocorre através do envio de um pacote específico. Este pacote não contém a chave de sessão em si (que nunca é enviada), mas sim três elementos cruciais:
| Campo | Função | Conteúdo |
|---|---|---|
K_S (Host Public Key) |
Identidade do servidor | Chave pública de host do servidor |
f (Server Public Value) |
Componente DH do servidor | g^b mod p ou ponto ECDH |
H (Exchange Hash Signature) |
Prova criptográfica | Assinatura do hash de troca pela chave privada de host |
Cálculo do Hash de Troca (H)
O hash H é calculado sobre todos os elementos da negociação (RFC 4253 seção 8):
H = HASH(V_C || V_S || I_C || I_S || K_S || e || f || K)
Onde:
- V_C, V_S: strings de identificação SSH do cliente e servidor.
- I_C, I_S: pacotes de negociação de algoritmos (kex init).
- K_S: chave pública de host do servidor.
- e, f: valores públicos DH do cliente e servidor.
- K: segredo compartilhado calculado (não transmitido).
- HASH: algoritmo negociado (SHA-256, SHA-512).
3. Verificação de Identidade pelo Cliente
Ao receber a confirmação, o cliente realiza uma verificação de segurança em duas etapas antes de aceitar o servidor:
Etapa 1: Validação Matemática
O cliente usa a chave pública do servidor para verificar a assinatura digital H. Se a assinatura for válida, isso prova que:
- O servidor possui a chave privada correspondente (prova de identidade).
- Os dados da negociação não foram alterados por um terceiro (integridade).
Etapa 2: Consulta ao known_hosts
O cliente compara a chave pública recebida com as chaves armazenadas em ~/.ssh/known_hosts:
| Cenário | Comportamento |
|---|---|
| Primeiro acesso (chave não presente) | Solicita confirmação ao usuário (TOFU — Trust On First Use) |
| Acesso posterior, chave idêntica | Confirmação automática, sem intervenção |
| Acesso posterior, chave diferente | Conexão abortada com erro WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! |
Exemplo de Aviso de Mudança de Chave
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
4. A Mensagem NEWKEYS
Uma vez que a identidade do servidor é confirmada e os cálculos do segredo compartilhado (K) batem, ambos os lados enviam a mensagem técnica SSH_MSG_NEWKEYS (RFC 4253 seção 7.3).
Sinalização de Mudança
Esta mensagem avisa à contraparte: "A partir do próximo pacote, tudo o que eu enviar será cifrado com a nova chave de sessão que acabamos de confirmar".
Ativação do Motor de Cifragem
| Componente | Antes de NEWKEYS | Após NEWKEYS |
|---|---|---|
| Cipher | none (texto claro) |
AES-GCM, ChaCha20-Poly1305, AES-CTR |
| MAC | none |
HMAC-SHA-256, AES-GCM built-in |
| Compression | none |
zlib@openssh.com, none |
O estado da conexão muda de "negociação" para "cifrado".
5. Algoritmos KEX Comuns
A escolha do algoritmo KEX define a robustez da confirmação:
| Algoritmo KEX | Curva/Grupo | RFC | Status |
|---|---|---|---|
diffie-hellman-group14-sha256 |
Oakley Group 14 (2048 bits) | RFC 8268 | Compatível, em desuso |
diffie-hellman-group16-sha512 |
Oakley Group 16 (4096 bits) | RFC 8268 | Aceitável |
ecdh-sha2-nistp256 |
NIST P-256 | RFC 5656 | Comum em FIPS |
ecdh-sha2-nistp521 |
NIST P-521 | RFC 5656 | Forte |
curve25519-sha256 |
Curve25519 | RFC 8731 | Recomendado |
curve25519-sha256@libssh.org |
Curve25519 | OpenSSH | Recomendado |
diffie-hellman-group1-sha1 |
Oakley Group 2 (1024 bits) | RFC 4253 | Obsoleto (Logjam) |
diffie-hellman-group-exchange-sha1 |
Dinâmico | RFC 4419 | Obsoleto |
Curva25519 (Recomendação Moderna)
Definida na RFC 8731 (2020), Curve25519 oferece:
- Chaves de 256 bits (alta entropia com baixo overhead).
- Imunidade a ataques de canais laterais (não depende de RNG de qualidade criptográfica para segurança — usa clamping).
- Performance superior a ECDH NIST em software.
- Adotada como padrão no OpenSSH desde a versão 7.4 (2017).
6. Garantia de Sigilo Direto (Forward Secrecy)
Um aspecto técnico vital da confirmação pelo servidor é que ela valida um segredo efêmero:
Propriedades
- O servidor confirma uma chave que só existirá para esta sessão específica.
- O segredo
Ké calculado matematicamente a partir dos valorese(cliente) ef(servidor), ambos efêmeros. - Mesmo que um atacante obtenha a chave privada do servidor no futuro, a confirmação feita nesta sessão permanece segura, pois a chave de sessão assinada não pode ser derivada apenas da chave de host.
Comparação: Forward Secrecy vs Sem FS
| Cenário | Sem FS (RSA KEX antigo) | Com FS (DH/ECDH) |
|---|---|---|
| Captura de tráfego gravado + futura chave privada do servidor | Decifra tudo | Impossível decifrar |
A captura de tráfego hoje não pode ser decifrada amanhã, mesmo com acesso à chave privada de host. Esta é a propriedade mais importante da criptografia moderna em SSH/TLS.
7. Transição para a Autenticação de Usuário
A confirmação pelo servidor marca o fim da Camada de Transporte (RFC 4253). Com o túnel agora "confirmado" e seguro, o servidor fica em estado de prontidão para receber a próxima fase: o Processo de Autenticação de Usuário (RFC 4252).
Estado da Conexão Após Confirmação
- Transporte: cifrado e integro (AES + HMAC ou AEAD).
- Compressão: opcionalmente ativa.
- Identidade do servidor: comprovada.
- Próxima etapa:
SSH_MSG_SERVICE_REQUESTparassh-userauth.
A partir deste ponto, qualquer tentativa de espionagem mostrará apenas dados cifrados. O servidor provou quem é; agora é a vez do cliente provar quem é o usuário que deseja entrar.
8. Auditoria e Diagnóstico
# Ver algoritmos KEX oferecidos por um servidor
ssh -Q kex
# Forçar um KEX específico
ssh -o KexAlgorithms=curve25519-sha256@libssh.org usuario@host
# Depurar handshake completo (mostra confirmação)
ssh -vvv usuario@host 2>&1 | grep -i kex
# Verificar chave pública do servidor (fingerprint)
ssh-keyscan -t ed25519 host.exemplo.com | ssh-keygen -l -f -
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| Mensagem chave | SSH_MSG_KEXDH_REPLY |
| RFC | 4253 (Transport), 8731 (Curve25519) |
| Conteúdo do pacote | K_S + f + assinatura de H |
| Próxima mensagem | SSH_MSG_NEWKEYS |
| Propriedade crítica | Forward Secrecy |
| Verificação cliente | known_hosts + assinatura |
10. Conclusão
A Confirmação pelo Servidor é o ponto de virada do handshake SSH: antes dela, tudo é texto claro; após ela, tudo é cifrado. A assinatura do hash de troca com a chave privada de host prova simultaneamente a identidade do servidor e a integridade de toda a negociação. Combinada com algoritmos modernos como Curve25519 (RFC 8731), oferece forward secrecy, garantindo que tráfego capturado hoje permaneça indecifrável mesmo se a chave privada for comprometida amanhã. Para administradores, entender este estágio é essencial para diagnosticar falhas de handshake, validar trocas de chaves de host e configurar corretamente as opções KexAlgorithms no sshd_config para eliminar algoritmos legados.