Validação de certificado Openconnect com o NetworkManager

1

No meu desktop Cinnamon (linux), configurei uma conexão VPN de conexão aberta no NetworkManager. Ao se conectar, parece que não tenho problemas: a conexão é estabelecida e o tráfego de rede é roteado por ela. No entanto, meu log do sistema contém uma entrada preocupante:

openconnect[2935]: SSL negotiation with (...)
openconnect[2935]: Server certificate verify failed: signer not found
openconnect[2935]: Connected to HTTPS on (...)
openconnect[2935]: Got CONNECT response: HTTP/1.1 200 OK

Eu tentei usar openconnect na linha de comando e não imprime nada sobre problemas de certificado (mesmo no modo detalhado). Além disso, não há nenhum erro de certificado com o site no Firefox ou usando wget (não tenho idéia de qual armazenamento de certificados openconnect usa ...).

Isso significa que a conexão é propensa a ataques man-in-the-middle? Se o certificado não pôde ser verificado, por que não há um prompt de confirmação que me peça para confiar no certificado antes de conectar e enviar minhas credenciais? Por que o problema está presente apenas ao conectar usando o NetworkManager?

A linha de comando de openconnect é

/usr/sbin/openconnect --servercert sha1:bee140657db50a73ee69f47fee9e4d670905206e --syslog --cookie-on-stdin --script /usr/lib/NetworkManager/nm-openconnect-service-openconnect-helper --interface vpn0 (ip):443

O aviso também está presente se eu não definir explicitamente um certificado de CA no NetworkManager.

    
por JPW 24.01.2016 / 14:07

1 resposta

1

Este problema ainda está presente no Ubuntu 18.04 com network-manager-openconnect .

Acho que o problema aqui é que a conexão está sendo feita com o endereço IP do servidor VPN, em vez de seu nome DNS:

$ ps aux | grep openconnect
/usr/sbin/openconnect --servercert sha256:<hash> --syslog --cookie-on-stdin --script /usr/lib/NetworkManager/nm-openconnect-service-openconnect-helper --interface vpn0 <ip>:443

Execute o comando manualmente, sem o parâmetro --servercert:

$ /usr/sbin/openconnect <ip>:443 --authenticate
POST https://<ip>/
Connected to <ip>:443
SSL negotiation with <ip>
Server certificate verify failed: certificate does not match hostname
Certificate from VPN server "<ip>" failed verification.
Reason: certificate does not match hostname
To trust this server in future, perhaps add this to your command line:
   --servercert sha256:<hash>
Enter 'yes' to accept, 'no' to abort; anything else to view: 

Observe a falha na verificação do certificado.

Agora usando o nome do host em vez do IP:

$ /usr/sbin/openconnect <hostname>:443 --authenticate
POST https://<hostname>/
Connected to <ip>:443
SSL negotiation with <hostname>
Connected to HTTPS on <hostname>
XML POST enabled
Please enter your username and password.

Não há erros de certificado.

Agora, usando o IP com o parâmetro servercert:

$ /usr/sbin/openconnect <ip>:443 --authenticate --servercert sha256:<hash>
POST https://<ip>/
Connected to <ip>:443
SSL negotiation with <ip>
Server certificate verify failed: signer not found
Connected to HTTPS on <ip>
XML POST enabled
Please enter your username and password.

Compare o erro ao primeiro exemplo - é um erro diferente. Este falha porque o signatário não é encontrado. Considerando que estamos apenas especificando um hash, acho que faz sentido, já que não há uma cadeia de confiança a seguir.

Para mim, acho que a causa raiz é que, por algum motivo, o gerenciador de rede está se conectando ao endereço IP em vez do nome do host. Não tenho certeza por que isso faria isso?

    
por 25.06.2018 / 01:52