Cinnamon(linux)デスクトップで、NetworkManagerでopenconnectVPN接続をセットアップしました。接続するとき、問題はないようです。接続が確立され、ネットワークトラフィックがそこを経由してルーティングされます。しかし、私のシステムログには心配なエントリが含まれています:
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
コマンドラインからopenconnect
を使用しようとしましたが、証明書の問題について何も出力されません(冗長モードでも)。また、Firefoxのサイトまたはwget
を使用した証明書エラーはありません(openconnectが使用する証明書ストアがわかりません...)。
これは、接続がman-in-the-middle攻撃を受けやすいことを意味しますか?証明書を検証できなかった場合、接続して資格情報を送信する前に証明書を信頼するように求める確認プロンプトが表示されないのはなぜですか? 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
NetworkManagerでCA証明書を明示的に設定しない場合にも、警告が表示されます。
この問題は、Ubuntu18.04でもnetwork-manager-openconnect
。
ここでの問題は、DNS名ではなくVPNサーバーのIPアドレスに接続されていることだと思います。
$ 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
--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:
証明書の検証の失敗に注意してください。
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.
証明書エラーはありません。
ここで、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.
エラーを最初の例と比較してください-それは別のエラーです。署名者が見つからないため、これは失敗します。ハッシュを指定しているだけであることを考えると、従うべき信頼チェーンがないので、それは理にかなっていると思います。
私にとって、根本的な原因は、ネットワークマネージャーが何らかの理由でホスト名ではなくIPアドレスに接続していることだと思います。なぜこれを行うのかわかりませんか?
私は、networkmanager-connectとnetwork-manager-appletを使用してArchLinuxで同じ問題を抱えていました。私は手動でCA証明書をダウンロードすることでこれを解決しました:
echo -n | openssl s_client -connect <Host>:<PORTNUMBER> \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/vpn.crt
次に、Gnomeのネットワーク設定のVPN構成メニューでそのファイルを選択しました。これにより、設定ファイル/etc/NetworkManager/system-connections/MyVpn.nmconnectionに次の行が追加されます。
[vpn]
...
cacert=/home/<my username>/vpn.crt
設定ファイルの他の行が変更される可能性があります。調べるために差分を実行しませんでした。しかし、いずれにせよ、その後、NetworkManagerを介してVPNに接続できるようになりました。