SSH学习(三)- SSH协议中的Public Key Algorithm

简介: 在SSH协议中,有两个地方涉及到公钥算法,分别是:1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情;2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情;这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。

背景

在SSH协议中,有两个地方涉及到公钥算法,分别是:

  1. 服务端认证:服务端在进行密钥协商的时候证明自己身份,防止中间人攻击,此时为SSH-TRANS协议发生的事情;
  2. 客户端认证:客户端通过PublicKey方式证明自己身份,完成SSH登录认证,此时SSH-USERAUTH发生的事情;

这两种情况下的公钥算法使用的是同一个概念,接下来本文将主要基于PublicKey公钥认证方式,学习对应的内容。

理论知识

公私钥类型

在OpenSSH的ssh-keygen命令中,我们可以通过-t选项来指定我们生成的SSH公私钥对的类型是什么:
image.png

类型 可选的位数 规范
RSA 1024
2048
3076(default)
4096
RFC4253和RFC8332
https://datatracker.ietf.org/doc/html/rfc4253
https://datatracker.ietf.org/doc/html/rfc8332
ecdsa 256(default),nistp256
384, nistp384
521, nistp521
RFC5915定义
https://datatracker.ietf.org/doc/html/rfc5915
ed25519 RFC8709
https://www.rfc-editor.org/rfc/rfc8709

Public Key Algorithm

在IANA的SSH Parameter列表中,我们可以看到SSH协议使用的Public Key Algorithm Names主要为截图所示:
image.png
而在OpenSSH中,通过查看HostKeyAlgorithms(服务端认证时,使用的签名方法)和PubkeyAcceptedAlgorithms(客户端认证时,使用的签名方法),可以找到对应支持的公钥算法具体实现。
image.png
image.png
结合公私钥类型,我们可以看到,同一个公私钥类型也会支持多种的Public Key Algorithm,以RSA为例,标准定义的算法有三种:ssh-rsa(sha1),rsa-sha2-256,rsa-sha2-512。

Public Key Format

根据RFC8332的解释,Public Key Algorithm和Public Key Format是包含了不同的意思,具体见截图:
image.png
image.png
根据OpenSSH的实现,目前针对单个SSH公私钥对,我们会遇到如下几个格式(感觉还没有掌握清楚,大家可以具体情况再次分析,我目前使用RSA格式公私钥对进行的转换分析):

key format 公私钥支持 描述
OpenSSH Private format 公钥、私钥 OpenSSH ssh-keygen生成的默认格式,对密钥的安全存储做了增强。
RFC4716 公钥 RFC4716定义的SSH公钥格式
PKCS#8 私钥、公钥 一般用于存储私钥
PEM 公钥、私钥 标准的PEM格式

OpenSSH实践

Public Key Format转换

使用ssh-keygen -t rsa命令,我们可以得到如下公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDFmDdF6R+awJS4f5lA8XjOBMJSxDxOMm7....U= localhost

同样,使用ssh-keygen,我们转换公钥为其它格式如下:

ssh-keygen -e -f ssh-rsa.pub -m PEM > ssh-rsa-pem.pub

-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEAxZg3RekfmsCUuH+ZQPF4zgTCUsQ8TjJuxUsDE3g6OlCc7h7GtHef
ElJSsVKq1....e59mONPdzH2bxDQpWAP0bU/m48f2oymqgBTP1SnFEMTO1D1
UcESmRWuwmaahTV4QmoY7aq5gLLtiU8hCzYVD7zREUIjPug8oM+htciyyu3qRdvF
sFcUrTe1BrNlAgMBAAE=
-----END RSA PUBLIC KEY-----
ssh-keygen -e -f ssh-rsa.pub -m RFC4716 > ssh-rsa-rfc4716.pub

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "3072-bit RSA, converted by local from OpenSS"
AAAAB3NzaC1yc2EAAAADAQABAAABgQDFmDdF6R+awJS4f5lA8XjOBMJSxDxOMm7FSwMTeD
....
mAsu2JTyELNhUPvNERQiM+6Dygz6G1yLLK7epF28WwVxStN7UGs2U=
---- END SSH2 PUBLIC KEY ----
ssh-keygen -e -f ssh-rsa.pub -m PKCS8 > ssh-rsa-pkcs8.pub

-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAxZg3RekfmsCUuH+ZQPF4
zgTCUs.....+UXXdKS9jc0Jv1QWiie59mONPdzH2bxDQ
pWAP0bU/m48f2oymqgBTP1SnFEMTO1D1UcESmRWuwmaahTV4QmoY7aq5gLLtiU8h
CzYVD7zREUIjPug8oM+htciyyu3qRdvFsFcUrTe1BrNlAgMBAAE=
-----END PUBLIC KEY-----

指定PubkeyAcceptedAlgorithms

OpenSSH8.8版本以后,默认禁用了ssh-rsa签名方案,这导致我们使用某些老旧客户端时,无法SSH连接上服务器。以Ubuntu22.04为例,通过sshd -T命令,我们可以看到支持Public Key Algorithm如下:
image.png
为了模拟使用ssh-rsa签名方案的客户端,我们可以通过如下选项来发起ssh连接:
ssh root@xxx.xx.xx.xx -i ssh-rsa -o PubkeyAcceptedAlgorithms=ssh-rsa -v
其最终结果如下所示,公钥认证不通过:image.png
接着我们再指定签名算法为rsa-sha2-256,可以看到认证通过(不指定场景,默认为rsa-sha2-512):
ssh root@xx.xx.xx.xx -i ssh-rsa -o PubkeyAcceptedAlgorithms=rsa-sha2-256 -v
image.png
image.png

总结

本文旨在于理解清楚使用OpenSSH时,涉及到公私钥对格式和签名算法的区别。通过逐步的学习,可以发现SSH公私钥对相关内容主要有如下三点:第一是什么类型的公私钥,如RSA or ECDSA,这里面还可以继续区分对应位数;第二是什么要的编码格式,如OpenSSH格式 or RFC4716格式 or PEM格式;第三是使用什么样的签名的算法,如ssh-rsa(sha1),rsa-sha2-256,rsa-sha2-512。同时针对ssh-rsa这个具体名词,除了签名算法外,在公钥展示时还表示使用了rsa类型的公私钥对,需要注意区分两者的区别。最后,针对签名算法的学习,我们可以通过配置服务端的sshd_config,结合-o PubkeyAcceptedAlgorithms选项来实际验证对应的签名算法使用场景。

参考文档

  1. IANA SSH Parameter:https://www.iana.org/assignments/ssh-parameters/ssh-parameters.xhtml
  2. OpenSSH manual Pages:https://www.openssh.com/manual.html
  3. OpenSSH sshd_config manual Page: https://man.openbsd.org/sshd_config.5#Ciphers
  4. https://zhuanlan.zhihu.com/p/66794410
  5. https://security.stackexchange.com/questions/270349/understanding-ssh-rsa-not-in-pubkeyacceptedalgorithms
  6. https://ubuntu.com/server/docs/openssh-crypto-configuration
  7. https://security.stackexchange.com/questions/255074/why-are-rsa-sha2-512-and-rsa-sha2-256-supported-but-not-reported-by-ssh-q-key
  8. https://www.alibabacloud.com/help/zh/ecs/user-guide/resolve-an-rsa-key-based-connection-failure-to-an-instance
  9. https://www.rfc-editor.org/rfc/rfc8709
  10. https://datatracker.ietf.org/doc/html/rfc4253
  11. https://datatracker.ietf.org/doc/html/rfc8332
  12. https://datatracker.ietf.org/doc/html/rfc5915
目录
相关文章
|
6天前
|
网络安全
检查使用IP协议远程维护的设备是否配置SSH协议,禁用telnet协议
检查使用IP协议远程维护的设备是否配置SSH协议,禁用telnet协议
15 0
|
6天前
|
弹性计算 算法 安全
SSH学习(一)- 概念了解
整体上对SSH协议进行一个概括了解。
47 3
|
6天前
|
移动开发 监控 安全
通过SSH协议实现的屏幕局域网电脑监控:屏幕安全访问代码
随着科技的不断发展,网络安全问题愈发突出。为了确保屏幕数据的安全,我们需要一种高效可靠的监控方法。本文介绍了一种基于SSH协议的屏幕局域网电脑监控方案,同时提供了相关代码示例,确保屏幕数据的安全传输和访问。
250 0
|
6天前
|
算法 安全 Shell
SSH:加密安全访问网络的革命性协议
SSH:加密安全访问网络的革命性协议
46 9
|
6天前
|
安全 网络安全
jsch 报错 no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha>问题处理方法
【5月更文挑战第10天】jsch 报错 no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha>问题处理方法
17 0
|
6天前
|
算法 网络安全
no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha> 问题解决
【5月更文挑战第8天】no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha> 问题解决
21 0
|
6天前
|
算法 网络安全
Unable to negotiate with 127.0.0.1 port 29215: no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha> 解决
【5月更文挑战第5天】Unable to negotiate with 127.0.0.1 port 29215: no matching host key type found. Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha> 解决
35 7
|
6天前
|
弹性计算 运维 Shell
基于key验证多主机ssh访问
【4月更文挑战第30天】
23 1
|
6天前
|
监控 前端开发 安全
【专栏】介绍了前端工程师如何掌握SSH命令,包括SSH协议的基础知识、命令行操作如登录、文件传输、目录管理和进程管理
【4月更文挑战第29天】本文介绍了前端工程师如何掌握SSH命令,包括SSH协议的基础知识、命令行操作如登录、文件传输、目录管理和进程管理。在前端开发中,SSH用于部署项目、协同后端开发及服务器监控。文章还强调了使用密钥认证、配置别名及安全注意事项,并提醒开发者面对问题时如何解决。学习和熟练运用SSH是前端工程师适应复杂项目需求的关键。
|
6天前
|
安全 算法 Linux
SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法
SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法
278 0