Estou tentando configurar um novo dispositivo para se conectar ao meu servidor OpenVPN. O novo dispositivo é um sistema Linux sem GUI. Exportei o arquivo de configuração de um sistema Linux desktop e fiz as alterações necessárias.
O sistema de desktop pode se conectar à VPN. No entanto, o novo sistema não pode se conectar. O log informa que o handshake TLS expirou. No servidor, vejo as seguintes entradas:
TLS Error: cannot locate HMAC in incoming packet from ...
Isso indica que o cliente não foi configurado para autenticação HMAC, mas o servidor espera isso. No entanto, esta configuração foi exportada de um cliente que funciona e tem a chave HMAC configurada. Esta é a configuração do cliente:
client
remote 'vpn.example.org'
ca 'ca.pem'
cert 'cert.pem'
key 'key.pem'
cipher AES-128-CBC
dev tun
proto udp
verify-x509-name 'vpn.example.org'
tls-auth 'hmackey.pem' 1
nobind
auth-nocache
script-security 2
persist-key
persist-tun
A chave HMAC é idêntica em todos os sistemas. O que está errado?
Alguns antecedentes: A autenticação HMAC é um recurso de segurança adicional. Mesmo antes do handshake ocorrer, o cliente deve assinar a solicitação usando uma chave pré-compartilhada. Se a solicitação não tiver uma assinatura HMAC válida, o servidor ignorará a solicitação. Com o UDP, isso é equivalente a um firewall bloqueando o tráfego desse cliente.
No meu caso, após comparação com outro cliente, o arquivo de configuração no novo sistema parece estar faltando a linha
Isso estava faltando no arquivo exportado da caixa de desktop Linux, mas a configuração do cliente Android mostrou. Depois de adicionar essa opção, o handshake funciona (até o ponto em que estou enfrentando outro erro não relacionado).
Conclusão: sem
auth
, o OpenVPN não usa autenticação HMAC ou volta para um algoritmo de hash padrão (não descobri qual é o caso). De qualquer forma, isso provavelmente resultará em uma incompatibilidade de HMAC, fazendo com que o servidor descarte a solicitação do cliente.Eu arquivei uma solicitação de recurso com o projeto para lançar um aviso quando
tls-auth
for especificado, masauth
não for.