最近有消息称 OpenSSH 不再支持 SHA-1 登录,我试图了解他们指的是哪种格式。多年来,我一直通过 生成密钥ssh-keygen -t rsa -b 2048
。这种类型不再推荐了吗?我应该切换到 ECDSA 吗?
在此手册页中,https://www.man7.org/linux/man-pages/man1/ssh-keygen.1.htmlrsa
,该参数的默认选项-t
说明所选选项是使用 SHA1 签名,因此应该选择rsa-sha2-256
例如。
我尝试检查密钥的类型ssh-keygen -l -f key
,结果显示它确实是 SHA256 类型。如果是这样,那么它解决了我的问题,但希望能够澄清一下。谢谢!
新闻来源:https://www.zdnet.com/article/openssh-to-deprecate-sha-1-logins-due-to-security-risk/
答案1
密钥格式没有改变。唯一改变的是签名每次身份验证握手期间发送的格式。
令人困惑的是,最初在 SSHv2 中,密钥类型和签名类型是组合定义的。(例如,相同的“ssh-rsa”标识符被定义为表示 RSA 密钥和RSA/SHA-1 签名。因此改变签名过程会意味着分配一个新的密钥类型标识符,并且意味着生成一个新的密钥......
但是,已经开发了协议扩展来避免这种情况,现代 SSH 客户端将在涉及 RSA 密钥时自动协商签名类型。如果您连接,ssh -v
您会注意到正在交换一些额外的数据包:
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,
rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,
ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
因此,您可以继续使用“ssh-rsa”密钥 - 您只需将两端的软件升级到相当新的版本,它就会自动开始从该密钥生成“rsa-sha2-256”签名。(例如,您可能需要安装新版本的 PuTTY 和 Pageant,而使用旧版本的 gpg-agent 可能会遇到问题。)
ssh-keygen 中的签名
rsa
该参数的默认选项-t
说明所选选项是使用 SHA1 签名,因此应该选择rsa-sha2-256
示例。
这适用于发行证书,但在生成纯密钥时无关紧要。
每个证书在颁发时都由父 CA 签名。此长期签名存储在证书本身中(务必认识到,这与每次连接期间生成然后丢弃的短期签名不同)。这就是为什么许多 HTTPS (X.509) 证书必须更换的原因——颁发 CA 已用 RSA/SHA-1 签名盖章。
OpenSSH 还创建了自己的证书格式,这就是手册页所指的。这些所谓的“SSH 证书”是不是只是普通的 SSH 密钥——它们还由你的工作场所 CA 签名。因此,如果你有以 结尾的文件*-cert.pub
,你可能需要那些重新签发。(用于ssh-keygen -Lf <file>
检查它们的签名方式)。
但普通的 SSH 密钥不包含任何长期签名——它们仅用于在每次连接期间进行临时签名。因此密钥本身不需要替换。
选项-l
我尝试检查密钥的类型
ssh-keygen -l -f key
,结果显示它确实是 SHA256 类型
不,这根本不是 ssh-keygen 显示的内容。该-l
选项向您显示密钥的“指纹”,并告诉您它使用 SHA256 来计算此指纹 - 但它与密钥的类型无关,也与密钥的实际使用方式无关。指纹只是一个哈希值,它现在被计算出来以显示给你。
(请记住,以前 SSH 软件习惯显示基于 MD5 的密钥指纹——即使在实际的 SSHv2 协议中没有使用 MD5。)
其他密钥类型
这是不再推荐的类型吗?我应该切换到 ECDSA 吗?
据我所知(即从我在 Security.SE 上收集到的信息),RSA 作为签名算法仍然很强大——问题大多发生在尝试使用 RSA 作为加密算法,而这对于 SSHv2 来说不是问题。(当然,不断增加的密钥大小也不是个好问题。)
ECDSA 有其自身的问题——很难正确实施,某些程序员的错误可能会带来灾难性的后果。如果你必须切换,EdDSA(即 ssh-ed25519 或 ssh-ed448)会是更好的选择。