ssh 报: “no matching host key type found. Their offer” 240729
用 Windows11环境下的 git bash 自带的 ssh 登录 virtualbox上的CentOS6.10时, 报:“no matching host key type found. Their offer”
git版本: git version 2.43.0.windows.1
ssh版本: OpenSSH_9.5p1, OpenSSL 3.1.4 24 Oct 2023
原因是新版的 ssh 禁用了 ssh-rsa
算法
解决办法1:
例如把 ssh root@localhost -p61022
改为
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa root@localhost -p61022
或
ssh -o HostKeyAlgorithms=+ssh-rsa root@localhost -p61022
或
ssh -o HostKeyAlgorithms=ssh-rsa root@localhost -p61022
解决办法2:
在 git 安装文件夹下的 \etc\ssh\ssh_config 文件中加入
Host *
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
例如
# $OpenBSD: ssh_config,v 1.36 2023/08/02 23:04:38 djm Exp $# This is the ssh client system-wide configuration file. See
# ssh_config(5) for more information. This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.# Configuration data is parsed as follows:
# 1. command line options
# 2. user-specific file
# 3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.# Site-wide defaults for some commonly used options. For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_config(5) man page.# Host *
# ForwardAgent no
# ForwardX11 no
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# BatchMode no
# CheckHostIP no
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
# RekeyLimit 1G 1h
# UserKnownHostsFile ~/.ssh/known_hosts.d/%k
# Added by git-extra
Host ssh.dev.azure.comHostkeyAlgorithms +ssh-rsaPubkeyAcceptedAlgorithms +ssh-rsa
# Added by git-extra
Host *.visualstudio.comHostkeyAlgorithms +ssh-rsaPubkeyAcceptedAlgorithms +ssh-rsa### 2407290509 append
Host *
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
可看到, 官方给 ssh.dev.azure.com 和 Host *.visualstudio.com 加了
ssh -o
在SSH(Secure Shell)命令中,-o
选项后面通常跟随一个配置指令,用于在命令行中临时设置SSH客户端的配置选项。这种方式允许你覆盖SSH客户端配置文件(通常是~/.ssh/config
或者/etc/ssh/ssh_config
)中的设置,或者为单个SSH会话指定特定的配置。
-o
选项后面紧跟的是配置项的名称和值,配置项和值之间通常使用=
分隔,如果配置项的值包含空格,则整个值可能需要用引号括起来。
ssh -o HostKeyAlgorithms
ssh -o HostKeyAlgorithms
选项允许你指定 SSH 客户端在连接服务器时应该接受哪些主机密钥算法。这个选项在 SSH 客户端配置中非常重要,因为它可以帮助你控制连接的安全性。
随着 SSH 协议的发展,一些较旧的密钥算法(如 RSA1)已经被认为是不安全的,而新的、更安全的算法(如 ecdsa-sha2-nistp256, rsa-sha2-512 等)已经被引入。通过使用 -o HostKeyAlgorithms
选项,你可以指定 SSH 客户端只接受你认为安全的那些算法。
例如,如果你想要 SSH 客户端只接受使用 ECDSA(椭圆曲线数字签名算法)和 RSA(Rivest-Shamir-Adleman)签名算法(且要求 RSA 至少使用 SHA-2 散列函数)的主机密钥,你可以这样配置你的 SSH 命令:
ssh -o HostKeyAlgorithms=+ecdsa-sha2-nistp256,+rsa-sha2-512 user@hostname
ssh -o HostKeyAlgorithms=ssh-rsa
ssh -o HostKeyAlgorithms=ssh-rsa
这个命令选项用于在 SSH 连接时指定服务器主机密钥的算法。在这个例子中,它指定了仅使用 ssh-rsa
算法来验证服务器的身份。然而,需要注意的是,ssh-rsa
算法已经不再被认为是安全的最佳选择,因为它容易受到一些已知的攻击,如小公钥指数攻击和因子分解攻击。
从 OpenSSH 7.0 开始,ssh-rsa
已经不是默认的密钥算法了,而是被更安全的算法(如 ecdsa-sha2-nistp256
、ecdsa-sha2-nistp384
、ecdsa-sha2-nistp521
、rsa-sha2-256
、rsa-sha2-512
、ssh-ed25519
)所取代。
尽管出于兼容性考虑,你可能需要暂时使用 ssh-rsa
,但建议逐步迁移到更安全的算法上。如果你控制服务器,你应该更新 SSH 服务器的配置以使用更安全的密钥算法,并在客户端相应地更新你的 SSH 客户端配置或连接选项。
如果你只是偶尔需要连接到某个仍在使用 ssh-rsa
的服务器,使用 ssh -o HostKeyAlgorithms=+ssh-rsa
(注意加号 +
)可以确保在保持对其他更安全算法支持的同时,也接受 ssh-rsa
算法。然而,如果你完全确定只与 ssh-rsa
服务器通信,并且了解相关的安全风险,那么直接使用 ssh -o HostKeyAlgorithms=ssh-rsa
也是可以的。
不过,请记住,最好的做法是尽可能避免使用 ssh-rsa
,并在可能的情况下升级到更安全的密钥算法。
注意,在 HostKeyAlgorithms
的值前面使用 +
符号是可选的,但在某些情况下(尤其是当你想要明确添加某个算法而不是替换默认列表时),使用 +
符号会更加清晰。然而,在许多 SSH 客户端实现中,简单地列出你想要的算法而不使用 +
也是有效的。
如果你想要完全禁用对旧算法的支持(比如,只接受 ECDSA 和 RSA-SHA2 密钥),你可以省略 +
符号,并确保你的列表中没有包含任何你认为不安全的算法。但是,请注意,这样做可能会阻止你连接到一些仍然使用旧算法的服务器。
最后,请记得这个选项的效果是临时的,它只会影响你当前执行的 SSH 命令。如果你想要永久更改这个设置,你应该在你的 SSH 客户端配置文件中(通常是 ~/.ssh/config
)设置 HostKeyAlgorithms
选项。
其它一些-o
选项
-
设置端口号:
ssh -o Port=2222 user@hostname
这个命令将SSH会话的端口号设置为2222,而不是默认的22端口。
-
禁用主机密钥检查(警告:这降低了安全性):
ssh -o StrictHostKeyChecking=no user@hostname
这会在连接到新主机时自动接受并添加未知的主机密钥到
~/.ssh/known_hosts
文件,而不是询问用户是否接受。 -
设置连接超时:
ssh -o ConnectTimeout=10 user@hostname
这个命令设置了连接尝试的超时时间为10秒。
-
使用特定的私钥文件:
ssh -o IdentityFile=/path/to/your/private/key user@hostname
这告诉SSH客户端在认证时使用指定的私钥文件。
-
设置日志级别:
ssh -o LogLevel=VERBOSE user@hostname
这会增加SSH客户端的日志详细程度,有助于调试连接问题。
注意
- 使用
-o
选项时,可以指定多个配置项,只需在命令中重复-o
选项即可。 - 某些配置项可能涉及到安全性问题,如禁用主机密钥检查,应谨慎使用。
- 始终确保你的SSH密钥和配置文件受到妥善保护,避免未授权访问。
通过-o
选项,SSH提供了一种灵活的方式来为不同的SSH会话定制配置,而无需修改全局或用户级别的SSH配置文件。
HostKeyAlgorithms +ssh-rsa
, PubkeyAcceptedKeyTypes +ssh-rsa
, PubkeyAcceptedAlgorithms +ssh-rsa
在SSH配置中,HostKeyAlgorithms
、PubkeyAcceptedKeyTypes
和 PubkeyAcceptedAlgorithms
这三个选项都涉及到SSH密钥和算法的使用。然而,从安全性的角度来看,直接在这些选项中添加 +ssh-rsa
可能不是最佳实践,因为RSA密钥算法(特别是较短的密钥长度)已经被认为在某些情况下不够安全,容易受到攻击。
HostKeyAlgorithms
HostKeyAlgorithms
选项用于指定SSH客户端在验证SSH服务器身份时接受的公钥算法。现代SSH服务器和客户端通常推荐使用更安全的算法,如 ecdsa-sha2-nistp256
、ecdsa-sha2-nistp384
、ecdsa-sha2-nistp521
、rsa-sha2-512
或 ssh-ed25519
。
如果你需要在配置中包含 ssh-rsa
(即RSA密钥算法),可以这样做,但请注意这可能会降低安全性。例如:
HostKeyAlgorithms +ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
但请注意,通常不推荐仅使用 ssh-rsa
。
PubkeyAcceptedKeyTypes
PubkeyAcceptedKeyTypes
选项用于指定SSH服务器在公钥认证过程中接受的公钥类型。与 HostKeyAlgorithms
类似,这个选项也建议使用更安全的算法。如果你需要包含 ssh-rsa
,可以这样做:
PubkeyAcceptedKeyTypes +ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
但同样地,仅使用 ssh-rsa
可能会带来安全风险。
PubkeyAcceptedAlgorithms
PubkeyAcceptedAlgorithms
选项实际上与 PubkeyAcceptedKeyTypes
类似,但在某些SSH版本中可能用于更广泛的公钥算法配置。不过,请注意,具体的选项名称和用法可能因SSH版本和配置而异。对于大多数现代SSH版本,你可能不需要单独设置这个选项,除非你有特定的配置需求。
安全性建议
- 升级密钥算法:尽可能使用更安全的密钥算法,如ECDSA或ED25519。
- 密钥长度:对于RSA密钥,至少使用2048位长度,最好是4096位。
- 定期更换密钥:定期更换SSH密钥以减少潜在的安全风险。
- 禁用不安全的算法:在可能的情况下,禁用
ssh-rsa
和其他已知不安全的算法。
如果你必须保持与旧系统的兼容性,并且无法避免使用 ssh-rsa
,请确保你了解相关的安全风险,并采取适当的缓解措施。