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
目录
相关文章
|
1月前
|
弹性计算 算法 安全
SSH学习(一)- 概念了解
整体上对SSH协议进行一个概括了解。
43 3
|
4月前
|
移动开发 监控 安全
通过SSH协议实现的屏幕局域网电脑监控:屏幕安全访问代码
随着科技的不断发展,网络安全问题愈发突出。为了确保屏幕数据的安全,我们需要一种高效可靠的监控方法。本文介绍了一种基于SSH协议的屏幕局域网电脑监控方案,同时提供了相关代码示例,确保屏幕数据的安全传输和访问。
244 0
|
6月前
|
Linux 网络安全 开发工具
百度搜索:蓝易云【Git安装 + 多站点SSH Key配置教程。】
现在,你已经成功安装了Git,并配置了多站点的SSH Key。你可以使用Git命令进行版本控制,并通过SSH Key进行身份验证来访问不同的Git仓库。
153 0
|
1月前
|
安全 算法 Linux
SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法
SSH协议的原理和使用:深入剖析SSH协议的原理和使用方法
84 0
|
2月前
|
网络安全 数据安全/隐私保护
如何使用ssh key免密码登录服务器?
如何使用ssh key免密码登录服务器?
|
3月前
|
安全 Shell 网络安全
远程登录安全连接协议SSH(Secure Shell)
SSH(Secure Shell)协议是一种用于在不安全网络上提供安全远程登录、命令执行和数据传输的加密网络协议,通过公钥加密和身份验证技术确保通信的安全性和隐私性。
91 0
|
23天前
|
存储 网络安全 开发工具
Git的GUI图形化工具&ssh协议&IDEA集成Git
Git的GUI图形化工具&ssh协议&IDEA集成Git
113 0
|
4月前
|
Shell 网络安全 开发工具
git02->gui图形化界面使用,ssh协议,idea集成GIT
git02->gui图形化界面使用,ssh协议,idea集成GIT
52 0
git02->gui图形化界面使用,ssh协议,idea集成GIT
|
4月前
|
安全 网络安全 开发工具
更安全的ssh协议与Gui图形化界面使用
更安全的ssh协议与Gui图形化界面使用
|
4月前
|
安全 网络安全 开发工具
【Git】gui图形化界面的使用、ssh协议以及idea集成Git
【Git】gui图形化界面的使用、ssh协议以及idea集成Git
63 0