我使用基于 PKI 的 SSH 连接已有 10 多年了。突然,在服务器更新后,一些连接停止工作。我使用的 PKI 密钥与我多年来使用的相同(每个服务器都有自己的密钥,我有一小组个人密钥)。
工作 - 看起来像这样:
C:\Users\michael>ssh2 -p 2222 [email protected] date
Authentication successful.
Fri Nov 25 10:30:42 2016
不工作看起来像:
C:\Users\michael>ssh2 [email protected] date
warning: Authentication failed.
Disconnected; key exchange or algorithm negotiation failed (Algorithm negotiation failed.).
发生了什么变化?
答案1
更新后 - 可能会产生副作用。使用 OpenSSH - 默认值经常更改。 OpenBSD(维护/开发 OpenSSH)有一个 OpenBSD 的政策,即不关心向后兼容性。这可能会“破坏”那些运转良好的东西。
有一个巨大的提示 - 我没有注意到这种情况第一次发生在我身上(使用 GUI 界面,我只是点击它,并对“愚蠢的更新 - 新版本被破坏”感到“生气”。原来是新版本没有被破坏 - 但 OpenBSD/OpenSSH 开始更改从 OpenSSH-6.7p1 开始的密钥交换默认值,请参阅:http://www.openssh.com/txt/release-6.7,值得注意的是:
自 OpenSSH 6.6 以来的变化
可能不兼容的更改
sshd(8):默认的密码和 MAC 集已更改以
删除不安全的算法。特别是,CBC 密码和 arcfour*
默认情况下处于禁用状态。
如果通过 Ciphers 和 MAC sshd_config 选项显式配置,则全套算法仍然可用。
我的问题是我有一个旧客户端,它没有任何新的默认设置,因此无法连接。
两种解决方案路径:修复/修补服务器或 - 修复/修补客户端。
服务器解决方案:恢复“旧”设置,以便“旧”客户端可以继续连接,即 - 对现有客户端友好 - 编辑 sshd_config 文件并添加回(足够的)旧密码。
sshd_config 中要更改/添加的关键行是:
ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],aes256-cbc
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
macs hmac-sha2-256,hmac-sha2-512,hmac-sha1-96,hmac-sha1
只需添加:
# Ciphers
# The dafaults starting with OpenSSH 6.7 are:
# aes128-ctr,aes192-ctr,aes256-ctr,[email protected]
# older clients may need an older cipher, e.g.
# ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
# only adding aes256-cbc as an "old" cipher
ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],aes256-cbc
# KEX Key Exchange algorithms
# default from openssh 6.7 are:
# [email protected],diffie-hellman-group-exchange-sha256,\
# diffie-hellman-group14-sha1
# an older kex are: none,KexAlgorithms diffie-hellman-group1-sha1
# only adding diffie-hellman-group-sha1 as an "old" KEX
# and this should be deleted ASAP as it is clearly "one of the problems" with SSL based encryption
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
# MAC message authentification code
# the new defaults are:
# [email protected],[email protected],
# [email protected],hmac-sha2-512-
# [email protected],
# [email protected],[email protected],
# hmac-sha2-256,hmac-sha2-512
# older defaults (still supported) are:
# macs hmac-sha1,hmac-md5
# consider removing hmac-sha1-96,hmac-sha1,hmac-md5 "Soon!"
macs hmac-sha2-256,hmac-sha2-512,hmac-sha1-96,hmac-sha1
解决方案#2 - 修复/更换客户端
查看当前客户端支持哪些密码(假设 CLI)的一个简单方法是ssh -h
,看看是否提供类似的内容:
Supported ciphers:
3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc,blowfish-cbc,twofish-cbc,twofish256-cbc,twofish192-cbc,twofish128-cbc,[email protected],cast128-cbc,[email protected],arcfour,none
Supported MAC algorithms:
hmac-md5,hmac-md5-96,hmac-sha1,hmac-sha1-96,[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],none
另一个有用的命令是:ssh -V
ssh2: SSH Secure Shell 3.2.9 Windows Client
Product: SSH Secure Shell for Workstations
License type: none (non-commercial)
我的 - 是 - 一个非常老的客户端 - 用于我的桌面。从上面看,您可以看到它不支持 15 年后的任何首选算法,甚至不支持 -cbr(旋转),仅支持 -cbc(块复制)。
如果您的客户端没有提供支持的密钥等选项(OpenSSH 应该有选项-Q
),只需启动与您自己的连接,例如,ssh -v localhost
并且有诸如此类的行告诉您已知的信息:
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-grousha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected]@openssh.com,[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected]
...
以及发现(和使用)的内容:
debug2: mac_setup: found hmac-sha1
debug1: kex: server->client aes128-ctr hmac-sha1 none
debug2: mac_setup: found hmac-sha1
debug1: kex: client->server aes128-ctr hmac-sha1 none
额外:来自失败连接的调试信息 - 更多详细信息
或者,尝试过但错过了。
debug: OpenSSH: Major: 7 Minor: 3 Revision: 0
debug: Ssh2Transport: All versions of OpenSSH handle kex guesses incorrectly.
debug: Ssh2Transport: Algorithm negotiation failed for c_to_s_cipher: client list: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour vs. server list : [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
debug: Ssh2Transport: Algorithm negotiation failed for s_to_c_cipher: client list: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour vs. server list : [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
debug: Ssh2Transport: lang s to c: `', lang c to s: `'
debug: Ssh2Transport: Couldn't agree on kex or hostkey alg. (chosen_kex = NULL, chosen_host_key = ssh-rsa)
debug: Ssh2Common: DISCONNECT received: Algorithm negotiation failed.
编辑:2017 年 1 月 2 日添加
新部分 - 停止工作的按键怎么办?
在我的服务器上,我安装了一个“旧”客户端和“最新”客户端 - 连接到服务器时会出现不同的行为。这里的问题不是密码不匹配 - 而是使用古老PKI 对 - 基于 DSA。
简而言之,openssh-7(.3) 不再发送(默认情况下,可能根本不发送)DSA 公钥。
下面我比较了两个版本的 openssh /usr/bin/ssh (旧版本,左侧)和
/opt/bin/ssh (新版本,右侧)的输出- 命令是:
${version}/ssh -v user@host date
当您浏览下面的输出时,我希望您注意到步骤和消息通常是相同的。关键区别在于字符串之后SSH2_MSG_SERVICE_ACCEPT
我想让您注意的是,旧版本提供(并被“旧”服务器接受)基于 DSA 的密钥对,而新服务器从不提供基于 DSA 的密钥。
注意:“解决方案”是添加(至少之一)基于 rsa、ecdsa 或 ed25519 的 PKI 对。
OpenSSH_6.0p1, OpenSSL 1.0.2h 3 May 2016 | OpenSSH_7.3p1, OpenSSL 1.0.2h 3 May 2016
debug1: Reading configuration data /etc/ssh/ssh_config | debug1: Reading configuration data /var/openssh/etc/ssh_confi
debug1: Failed dlopen: /usr/krb5/lib/libkrb5.a(libkrb5.a.so): <
0509-026 System error: A file or directory in the pat <
<
debug1: Error loading Kerberos, disabling Kerberos auth. <
debug1: Connecting to x061 [192.168.129.61] port 22. debug1: Connecting to x061 [192.168.129.61] port 22.
debug1: Connection established. debug1: Connection established.
debug1: identity file /home/michael/.ssh/id_rsa type 1 debug1: identity file /home/michael/.ssh/id_rsa type 1
> debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_rsa-cert type -1 debug1: identity file /home/michael/.ssh/id_rsa-cert type -1
debug1: identity file /home/michael/.ssh/id_dsa type 2 debug1: identity file /home/michael/.ssh/id_dsa type 2
> debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_dsa-cert type -1 debug1: identity file /home/michael/.ssh/id_dsa-cert type -1
debug1: identity file /home/michael/.ssh/id_ecdsa type 3 debug1: identity file /home/michael/.ssh/id_ecdsa type 3
> debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_ecdsa-cert type - debug1: identity file /home/michael/.ssh/id_ecdsa-cert type -
debug1: Remote protocol version 2.0, remote software version | debug1: key_load_public: No such file or directory
debug1: match: OpenSSH_6.0 pat OpenSSH* | debug1: identity file /home/michael/.ssh/id_ed25519 type -1
> debug1: key_load_public: No such file or directory
> debug1: identity file /home/michael/.ssh/id_ed25519-cert type
debug1: Enabling compatibility mode for protocol 2.0 debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.0 | debug1: Local version string SSH-2.0-OpenSSH_7.3
> debug1: Remote protocol version 2.0, remote software version
> debug1: match: OpenSSH_6.0 pat OpenSSH* compat 0x04000000
> debug1: Authenticating to x061:22 as 'padmin'
debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none | debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: client->server aes128-ctr hmac-md5 none | debug1: kex: host key algorithm: ssh-rsa
> debug1: kex: server->client cipher: aes128-ctr MAC: umac-64@o
> debug1: kex: client->server cipher: aes128-ctr MAC: umac-64@o
debug1: sending SSH2_MSG_KEX_ECDH_INIT debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: RSA 9f:0a:4d:a8:1b:ba:e6:d4:1a:b2:cd | debug1: Server host key: ssh-rsa SHA256:ORf5UVI7mRm/9MthM2qXM
debug1: Host 'x061' is known and matches the RSA host key. debug1: Host 'x061' is known and matches the RSA host key.
debug1: Found key in /home/michael/.ssh/known_hosts:57 debug1: Found key in /home/michael/.ssh/known_hosts:57
debug1: ssh_rsa_verify: signature correct | debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS debug1: expecting SSH2_MSG_NEWKEYS
> debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS received debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server | debug1: Skipping ssh-dss key /home/michael/.ssh/id_dsa - not
debug1: SSH2_MSG_SERVICE_REQUEST sent <
debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/michael/.ssh/id_rsa debug1: Offering RSA public key: /home/michael/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password debug1: Authentications that can continue: publickey,password
debug1: Offering DSA public key: /home/michael/.ssh/id_dsa | debug1: Offering ECDSA public key: /home/michael/.ssh/id_ecds
debug1: Server accepts key: pkalg ssh-dss blen 433 | debug1: Authentications that can continue: publickey,password
debug1: read PEM private key done: type DSA | debug1: Trying private key: /home/michael/.ssh/id_ed25519
debug1: Authentication succeeded (publickey). | debug1: Next authentication method: keyboard-interactive
Authenticated to x061 ([192.168.129.61]:22). | debug1: Authentications that can continue: publickey,password
debug1: channel 0: new [client-session] | debug1: Next authentication method: password
debug1: Requesting [email protected] | padmin@x061's password:
debug1: Entering interactive session. |