公私钥体系好吗?好!那假如你有十几台服务器遍布全世界呢?那假如你的某个私钥突然被偷了呢?难道要一台一台删 Authorized_keys 吗?

相比上一篇的 OpenSSL CA,OpenSSH 的 CA 就简单许多了。

OpenSSH CA

OpenSSH CA 证书具备动态性(签发/吊销)、有效期以及身份权限,相比于密码、公私钥这种静态的认证,能极大丰富 OpenSSH 的认证体系和提升安全性。

由于本人日常使用 Arch Linux 和 Windows、没有 MacOS,所以下面只有 Linux 和 Windows 的介绍。

Linux Server

关于在 Linux 上使用 OpenSSH,这里基本参照 iBug 的文章,记录一下我的配置。

  • 和产生 OpenSSH 公私钥一样,产生一对 CA 私钥 ca 和 CA 公钥 ca.pub。若没有指定 -P,则会要求你输入 passphrase(可选,但建议有)。
1
2
3
4
5
6
7
8
9
test ssh-keygen -f ca -P "Totoro-Test" -C "This is a test"
Generating public/private rsa key pair.
Your identification has been saved in ca
Your public key has been saved in ca.pub
The key fingerprint is:
SHA256:5DBKx...MDh5I This is a test
The key's randomart image is:
+---[RSA 3072]----+
...
  • 我们只需要保存私钥即可,可由 CA 私钥生成公钥。
1
2
3
4
5
6
test cat ca.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCji+s1JRiUvhJVHyekdyi27T2Pi7/D/3QJfYkJ1cCuORV/7KkmfTm7Yp5OJqv3rqDUbd84OuDAIFyRV51ghQYdoWHQ/GC7KhJErhiMu0IuEIeuaeqlQFY8E475tTtN4kcrEvKvMgQBl5G1EPQC4bVmBhvlR2jWFo1O7HVdXmcLGpdHtaDpOG7T9UzOlFxQKuK/sXQ6+XTAX4aSnELM0+6Kr438hZxrkV67aosHbg0clWqqoSBw53WslxwNC/x+0kEf61aXyNiAOdhwQFAJSxSo+oanm2uMTkxm6twPzqjt3MfZm8swMb3IgGDKOrxHoqcxVysF+wSD3o4X1nGhbp4irQk/Wc7g3yCfsoDmNuPvmax6Dpg4Vz/i0NqnHadUEnrxStdA5679D7QV0YbjAJvcKQ8qS3yLpo+zMJIbBBGu5tA+yQ5owGGdFtwVyRoaw9t+zb6hp4hrTBdGq+gqJzsuoNOWFvS4+0m3v5/0ZEmsgGc6ZGz7sXx7zuD1BmTzcIU= This is a test
test rm ca.pub
test ssh-keygen -f ca -y
Enter passphrase:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCji+s1JRiUvhJVHyekdyi27T2Pi7/D/3QJfYkJ1cCuORV/7KkmfTm7Yp5OJqv3rqDUbd84OuDAIFyRV51ghQYdoWHQ/GC7KhJErhiMu0IuEIeuaeqlQFY8E475tTtN4kcrEvKvMgQBl5G1EPQC4bVmBhvlR2jWFo1O7HVdXmcLGpdHtaDpOG7T9UzOlFxQKuK/sXQ6+XTAX4aSnELM0+6Kr438hZxrkV67aosHbg0clWqqoSBw53WslxwNC/x+0kEf61aXyNiAOdhwQFAJSxSo+oanm2uMTkxm6twPzqjt3MfZm8swMb3IgGDKOrxHoqcxVysF+wSD3o4X1nGhbp4irQk/Wc7g3yCfsoDmNuPvmax6Dpg4Vz/i0NqnHadUEnrxStdA5679D7QV0YbjAJvcKQ8qS3yLpo+zMJIbBBGu5tA+yQ5owGGdFtwVyRoaw9t+zb6hp4hrTBdGq+gqJzsuoNOWFvS4+0m3v5/0ZEmsgGc6ZGz7sXx7zuD1BmTzcIU= This is a test
  • 拿 CA 私钥对服务器公钥进行签发。
1
2
3
test sudo ssh-keygen -s ca -I "host test" -h /etc/ssh/ssh_host_rsa_key.pub
Enter passphrase:
Signed host key /etc/ssh/ssh_host_rsa_key-cert.pub: id "host test" serial 0 valid forever
  • 查看签发的 CA 证书。
1
2
3
4
5
6
7
8
9
10
11
test sudo ssh-keygen -Lf /etc/ssh/ssh_host_rsa_key-cert.pub
/etc/ssh/ssh_host_rsa_key-cert.pub:
Type: [email protected] host certificate
Public key: RSA-CERT SHA256:mnZmGMfyJVWl02a3AJWmtOj8GCpSFPRz5fOuRpF2B5M
Signing CA: RSA SHA256:5DBKxpQKbn5xkhIhuquIa/Bd/GJKoJIPfcJxaLMDh5I (using rsa-sha2-512)
Key ID: "host test"
Serial: 0
Valid: forever
Principals: (none)
Critical Options: (none)
Extensions: (none)
  • 安装 CA 证书和公钥。

同时,我们需要在 /etc/ssh/sshd_config 中指定 CA 证书 HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

然后指定 TrustedUserCAKeys /etc/ssh/ca.pub 同时把 ca.pub 文件复制到 /etc/ssh/ca.pub(或者在 ~/.ssh/authorized_keys 中加入 @cert-authority principals="<user>" <ca.pub>,user 和 ca.pub 请自行替换,这样只对单个用户产生效果)。

对于服务器来说,从证书认证和从公钥认证是一样的方式(基于我的观察和理解),都是 publickey:只是通过证书登录的私钥类型是 ssh2: RSA-CERT,而公钥认证的私钥类型是 ssh2: RSA。

同时重启 ssh 服务 systemctl reload ssh

若在服务器上要废除一个用户 CA 证书,只需要修改 RevokedKeys 文件,把该用户的 CA 证书加入到该文件即可。

Linux Client

  • 拿 CA 私钥对用户公钥进行签发。和上面签发过程类似,只是不需要加 -h(-n 后可加上 Principals)。
1
2
3
test ssh-keygen -s ca -I "client test" -n root,totoro id_rsa.pub
Enter passphrase:
Signed user key id_rsa-cert.pub: id "client test" serial 0 valid forever
  • 安装 CA 证书和公钥。

~/.ssh/known_hosts 中(或者在全局列表 /etc/ssh/ssh_known_hosts 中)加入对 CA 公钥的信任(可把 * 换成 *.yyw.moe 之类的匹配,而不是所有 Host):

1
@cert-authority * <ca.pub>

同时把签发的证书 id_rsa-cert.pubid_rsa 放在一个目录下。

若在客户端要废除一个 CA 证书,则在 known_hosts 中删去 @cert-authority 的信任即可。

Windows Client

在 Windows 上,我用的集成远程管理软件 MobaXterm 相信很多人都用过,而 Windows 也自带了 OpenSSH。

很惊喜,Windows 上的 OpenSSH 和 Linux 用起来几乎一样:

1
2
3
4
5
6
7
8
9
PS C:\Users\totoro\Downloads> ssh-keygen -f ca -P "Totoro-Test" -C "This is a test"
Generating public/private rsa key pair.
Your identification has been saved in ca
Your public key has been saved in ca.pub
The key fingerprint is:
SHA256:5DBKx...MDh5I This is a test
The key's randomart image is:
+---[RSA 3072]----+
...

这里就不重复了,下面讲讲 MobaXterm 客户端的使用。

MobaXterm 个人免费版的下载页面中冗长的更新日志讲述了 MobaXterm 从发布以来一点一滴的进展,其中 4 月 20 日 21.1 版本的更新中写道:

1
2
3
4
5
6
7
8
9
Improvement: you can now select a custom log file name with several variables available
Improvement: enhanced syntax highlighting speed, the terminal is now 16x faster when processing colored patterns
Improvement: added basic SSH certificate support, you can now define a CA-signed OpenSSH user key in your SSH sessions
Improvement: enhanced overall terminal rendering speed and decreased CPU consumption when refreshing, especially on High DPI monitors
Improvement: better support for mouse "infinite scrolling mode" into terminals
Improvement: decreased the SSH connection time, especially when using private keys with more than 2048 bits
Improvement: support for ECDSA private keys with "aes-256-ctr" cipher in "OpenSSH_v2" format into SFTP sessions
Improvement: support for RSA private keys with a passphrase in "OpenSSH_v2" format into SFTP sessions
...

其中第三条就是我们这里讲的 SSH CA。

在实际使用时,我们只需要和平时一样选择私钥登录就好了,确保相同目录下有 ${私钥名字}-cert.pub 的证书、用户名为证书中所允许的即可。