默认情况下,我的 SSH 客户端不允许使用diffie-hellman-group-exchange-sha256
密钥交换算法。但是,我需要访问 10.0.0.1 上的服务器,该服务器需要使用该算法。
这在命令行下工作得很好:
$ ssh -o KexAlgorithms=diffie-hellman-group-exchange-sha256 [email protected]
Password:
但是,如果我尝试在末尾添加以下内容,则会失败/etc/ssh/ssh_config
:
Host 10.0.0.1
KexAlgorithms diffie-hellman-group-exchange-sha256
这是相关的输出:
$ ssh -vvv [email protected]
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug3: kex names ok: [[email protected]]
...
debug1: /etc/ssh/ssh_config line 72: Applying options for 10.0.0.1
debug3: kex names ok: [diffie-hellman-group-exchange-sha256]
...
debug1: Connecting to 10.0.0.1 [10.0.0.1] port 22.
debug1: Connection established.
...
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: [email protected]
...
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256
...
debug2: kex_parse_kexinit: first_kex_follows 0
debug2: kex_parse_kexinit: reserved 0
debug2: mac_setup: setup hmac-ripemd160
debug1: kex: server->client aes256-ctr hmac-ripemd160 none
debug2: mac_setup: setup hmac-ripemd160
debug1: kex: client->server aes256-ctr hmac-ripemd160 none
Unable to negotiate a key exchange method
我对此感到困惑的是 SSH 清楚地读取了相关行/etc/ssh/ssh_config
并且似乎对此感到满意。但随后它尝试使用[email protected]
而不是与服务器协商密钥交换diffie-hellman-group-exchange-sha256
,这当然会失败。
为什么会这样,我该如何纠正?
答案1
乍一看,OpenSSH 选项可能表现得有些奇怪。但手册页ssh_config
很好地记录了它:
对于每个参数,将使用第一个获得的值。配置文件包含由“主机”规范分隔的部分,并且该部分仅适用于与规范中给出的模式之一匹配的主机。匹配的主机名通常是命令行上给出的主机名(有关例外情况,请参阅 CanonicalizeHostname 选项。)
您可以像这样重写您的配置来实现您所需要的(星星*
匹配应该是最后一个):
Host 10.0.0.1
KexAlgorithms diffie-hellman-group-exchange-sha256
#[...]
Host *
KexAlgorithms [email protected]
并解释为什么命令行选项有效,也来自同一手册页ssh_config
:
- 命令行选项
- 用户的配置文件(~/.ssh/config)
- 系统范围的配置文件(/etc/ssh/ssh_config)