使用 NetworkManager 进行 Openconnect 证书验证

JPW*_*JPW 5 vpn networkmanager certificate ssl

在我的 Cinnamon (linux) 桌面上,我在 NetworkManager 中设置了一个 openconnect VPN 连接。连接时,我似乎没有任何问题:连接已建立,网络流量通过它路由。但是,我的系统日志包含一个令人担忧的条目:

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
Run Code Online (Sandbox Code Playgroud)

我尝试openconnect从命令行使用,但它不会打印任何有关证书问题的信息(即使在详细模式下)。此外,该站点在 Firefox 或使用中没有证书错误wget(我不知道 openconnect 使用哪个证书存储......)。

这是否意味着该连接容易受到中间人攻击?如果无法验证证书,为什么在连接和发送我的凭据之前没有要求我信任证书的确认提示?为什么仅在使用 NetworkManager 连接时才会出现此问题?

的命令行openconnect

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

如果我没有在 NetworkManager 中明确设置 CA 证书,也会出现警告。

小智 5

这个问题在 Ubuntu 18.04 中仍然存在network-manager-openconnect

我认为这里的问题是连接到 VPN 服务器的 IP 地址,而不是它的 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
Run Code Online (Sandbox Code Playgroud)

手动运行命令,不带 --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: 
Run Code Online (Sandbox Code Playgroud)

注意证书验证失败。

现在使用主机名而不是 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.
Run Code Online (Sandbox Code Playgroud)

没有证书错误。

现在,使用带有 servercert 参数的 IP:

$ /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.
Run Code Online (Sandbox Code Playgroud)

将错误与第一个示例进行比较 - 这是一个不同的错误。这个失败是因为没有找到签名者。考虑到我们只是指定了一个散列,我想这是有道理的,因为没有可遵循的信任链。

对我来说,我认为根本原因是网络管理器出于某种原因连接到 IP 地址而不是主机名。不知道为什么会这样做?