C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Azure DevOps ちほーの git サーバーへ git@ssh しようとしたら Unable to negotiate で diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 を提案されたら思い出すメモ

状況

git clone git@ssh.dev.azure.com:v3/my_team/my_project/my_repos
Cloning into 'my_repos'...
Unable to negotiate with 40.81.25.218 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

エラーメッセージ訳:

40.81.25.218:22 との交渉はダメでした。鍵交換方式が合いません。 diffie-hellman-group1-sha1, diffie-hellman-group14-sha1 とか試してみたらいいかもね。

解決方法

~/.ssh/config にそういう事を言う git サーバー用の接続設定を特殊化します。今回の例だと ssh.dev.azure.com に対して特殊化します:

Host ssh.dev.azure.com
  User git
  Port 22
  HostName ssh.dev.azure.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  KexAlgorithms +diffie-hellman-group1-sha1

ついで設定もありますが、今回の解決方法の要は KexAlgorithmsHost/HostName に対して設定している部分です。 "Kex" は "Key-eXchanging" とかそんなノリでしょうね。😅

ちなみに、 Azure DevOps の場合は残念ながらいまだに ECDSA とか使えず RSA 鍵を使わなければならないので IdentityFile の特殊化も事実上必須です。かなしい。

Reference