手把手教你!SSH 证书登陆教程

来自:阮一峰的网络日志
连接:https://tinyurl.com/yc9xrc7t

SSH 是服务器登陆工具,提供密码登陆和密钥登陆。算法

可是,SSH 还有第三种登陆方法,那就是证书登陆。不少状况下,它是更合理、更安全的登陆方法,本文就介绍这种登陆方法。安全

1、非证书登陆的缺点

密码登陆和密钥登陆,都有各自的缺点。服务器

密码登陆须要输入服务器密码,这很是麻烦,也不安全,存在被暴力破解的风险。网络

密钥登陆须要服务器保存用户的公钥,也须要用户保存服务器公钥的指纹。这对于多用户、多服务器的大型机构很不方便,若是有员工离职,须要将他的公钥从每台服务器删除。app

2、证书登陆是什么?

证书登陆就是为了解决上面的缺点而设计的。它引入了一个证书颁发机构(Certificate1 authority,简称 CA),对信任的服务器颁发服务器证书,对信任的用户颁发用户证书。ssh

登陆时,用户和服务器不须要提早知道彼此的公钥,只须要交换各自的证书,验证是否可信便可。ide

证书登陆的主要优势有两个:(1)用户和服务器不用交换公钥,这更容易管理,也具备更好的可扩展性。(2)证书能够设置到期时间,而公钥没有到期时间。针对不一样的状况,能够设置有效期很短的证书,进一步提升安全性。工具

3、证书登陆的流程

SSH 证书登陆以前,若是尚未证书,须要生成证书。具体方法是:(1)用户和服务器都将本身的公钥,发给 CA;(2)CA 使用服务器公钥,生成服务器证书,发给服务器;(3)CA 使用用户的公钥,生成用户证书,发给用户。ui

有了证书之后,用户就能够登陆服务器了。整个过程都是 SSH 自动处理,用户无感知。url

  • 第一步,用户登陆服务器时,SSH 自动将用户证书发给服务器。
  • 第二步,服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。
  • 第三步,SSH 自动将服务器证书发给用户。
  • 第四步,用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。
  • 第五步,双方创建链接,服务器容许用户登陆。

4、生成 CA 的密钥

证书登陆的前提是,必须有一个 CA,而 CA 本质上就是一对密钥,跟其余密钥没有不一样,CA 就用这对密钥去签发证书。

虽然 CA 能够用同一对密码签发用户证书和服务器证书,可是出于安全性和灵活性,最好用不一样的密钥分别签发。因此,CA 至少须要两对密钥,一对是签发用户证书的密钥,假设叫作 user_ca,另外一对是签发服务器证书的密钥,假设叫作 host_ca。

使用下面的命令,生成 user_ca。

# 生成 CA 签发用户证书的密钥  

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user\_ca -C user\_ca

上面的命令会在 ~/.ssh 目录生成一对密钥:user_ca(私钥)和 user_ca.pub(公钥)。

这个命令的各个参数含义以下。

  • -t rsa:指定密钥算法 RSA。
  • -b 4096:指定密钥的位数是4096位。安全性要求不高的场合,这个值能够小一点,可是不该小于1024。
  • -f ~/.ssh/user_ca:指定生成密钥的位置和文件名。
  • -C user_ca:指定密钥的识别字符串,至关于注释,能够随意设置。

使用下面的命令,生成 host_ca。

# 生成 CA 签发服务器证书的密钥
$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca

上面的命令会在~/.ssh目录生成一对密钥:host_ca(私钥)和 host_ca.pub(公钥)。

如今,~/.ssh 目录应该至少有四把密钥。

  • ~/.ssh/user_ca
  • ~/.ssh/user_ca.pub
  • ~/.ssh/host_ca
  • ~/.ssh/host_ca.pub

5、CA 签发服务器证书

有了 CA 之后,就能够签发服务器证书了。

签发证书,除了 CA 的密钥之外,还须要服务器的公钥。通常来讲,SSH 服务器(一般是sshd)安装时,已经生成密钥 /etc/ssh/ssh_host_rsa_key 了。若是没有的话,能够用下面`的命令生成。

$ sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -b 4096 -t rsa

上面命令会在 /etc/ssh 目录,生成 ssh_host_rsa_key(私钥)和 ssh_host_rsa_key.pub(公钥)。而后,须要把服务器公钥 ssh_host_rsa_key.pub,复制或上传到 CA 所在的服务器。

上传之后,CA 就可使用密钥 host_ca 为服务器的公钥 ssh_host_rsa_key.pub 签发服务器证书。

$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub

上面的命令会生成服务器证书 ssh_host_rsa_key-cert.pub(服务器公钥名字加后缀-cert)。这个命令各个参数的含义以下。

  • -s:指定 CA 签发证书的密钥。
  • -I:身份字符串,能够随便设置,至关于注释,方便区分证书,未来可使用这个字符串撤销证书。
  • -h:指定该证书是服务器证书,而不是用户证书。
  • -n host.example.com:指定服务器的域名,表示证书仅对该域名有效。若是有多个域名,则使用逗号分隔。用户登陆该域名服务器时,SSH 经过证书的这个值,分辨应该使用哪张证书发给用户,用来证实服务器的可信性。
  • -V +52w:指定证书的有效期,这里为 52 周(一年)。默认状况下,证书是永远有效的。建议使用该参数指定有效期,而且有效期最好短一点,最长不超过 52 周。
  • ssh_host_rsa_key.pub:服务器公钥。

生成证书之后,可使用下面的命令,查看证书的细节。

$ ssh-keygen -L -f ssh_host_rsa_key-cert.pub

最后,为证书设置权限。

$ chmod 600 ssh_host_rsa_key-cert.pub

6、CA 签发用户证书

下面,再用 CA 签发用户证书。这时须要用户的公钥,若是没有的话,客户端能够用下面的命令生成一对密钥。

$ ssh-keygen -f ~/.ssh/user_key -b 4096 -t rsa

上面命令会在 ~/.ssh 目录,生成 user_key(私钥)和 user_key.pub(公钥)。

而后,将用户公钥 user_key.pub,上传或复制到 CA 服务器。接下来,就可使用 CA 的密钥 user_ca 为用户公钥 user_key.pub 签发用户证书。

$ ssh-keygen -s user_ca -I user@example.com -n user -V +1d user_key.pub

上面的命令会生成用户证书 user_key-cert.pub(用户公钥名字加后缀-cert)。这个命令各个参数的含义以下。

  • -s:指定 CA 签发证书的密钥
  • -I:身份字符串,能够随便设置,至关于注释,方便区分证书,未来可使用这个字符串撤销证书。
  • -n user:指定用户名,表示证书仅对该用户名有效。若是有多个用户名,使用逗号分隔。用户以该用户名登陆服务器时,SSH 经过这个值,分辨应该使用哪张证书,证实本身的身份,发给服务器。
  • -V +1d:指定证书的有效期,这里为1天,强制用户天天都申请一次证书,提升安全性。默认状况下,证书是永远有效的。
  • user_key.pub:用户公钥。

生成证书之后,可使用下面的命令,查看证书的细节。

$ ssh-keygen -L -f user_key-cert.pub

最后,为证书设置权限。

$ chmod 600 user_key-cert.pub

7、服务器安装证书

CA 生成服务器证书 ssh_host_rsa_key-cert.pub 之后,须要将该证书发回服务器,可使用下面的 scp 命令,将证书拷贝过去。

$ scp ~/.ssh/ssh_host_rsa_key-cert.pub root@host.example.com:/etc/ssh/

而后,将下面一行添加到服务器配置文件 /etc/ssh/sshd_config。

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

上面的代码告诉 sshd,服务器证书是哪个文件。

从新启动 sshd。

$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart

8、服务器安装 CA 公钥

为了让服务器信任用户证书,必须将 CA 签发用户证书的公钥 user_ca.pub,拷贝到服务器。

$ scp ~/.ssh/user_ca.pub root@host.example.com:/etc/ssh/

上面的命令,将 CA 签发用户证书的公钥 user_ca.pub,拷贝到 SSH 服务器的 /etc/ssh 目录。

而后,将下面一行添加到服务器配置文件 /etc/ssh/sshd_config。

TrustedUserCAKeys /etc/ssh/user_ca.pub

上面的作法是将 user_ca.pub 加到 /etc/ssh/sshd_config,这会产生全局效果,即服务器的全部帐户都会信任 user_ca 签发的全部用户证书。

另外一种作法是将 user_ca.pub 加到服务器某个帐户的 ~/.ssh/authorized_keys 文件,只让该帐户信任 user_ca 签发的用户证书。具体方法是打开 ~/.ssh/authorized_keys,追加一行,开头是 @cert-authority principals="...",而后后面加上 user_ca.pub 的内容,大概是下面这个样子。

@cert-authority principals="user" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上面代码中,principals="user" 指定用户登陆的服务器帐户名,通常就是 authorized_keys 文件所在的帐户。

从新启动 sshd。

$ sudo systemctl restart sshd
# 或者
$ sudo service sshd restart

至此,SSH 服务器已配置为信任 user_ca 签发的证书。

9、客户端安装证书

客户端安装用户证书很简单,就是从 CA 将用户证书 user_key-cert.pub 复制到客户端,与用户的密钥 user_key 保存在同一个目录便可。

10、客户端安装 CA 公钥

为了让客户端信任服务器证书,必须将 CA 签发服务器证书的公钥 host_ca.pub,加到客户端的 /etc/ssh/ssh_known_hosts 文件(全局级别)或者 ~/.ssh/known_hosts 文件(用户级别)。

具体作法是打开 ssh_known_hosts 或 known_hosts 文件,追加一行,开头为 @cert-authority *.example.com,而后将 host_ca.pub 文件的内容(即公钥)粘贴在后面,大概是下面这个样子。

@cert-authority _.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ== 上面代码中,_.example.com 是域名的模式匹配,表示只要服务器符合该模式的域名,且签发服务器证书的 CA 匹配后面给出的公钥,就均可以信任。若是没有域名限制,这里能够写成*。若是有多个域名模式,可使用逗号分隔;若是服务器没有域名,能够用主机名(好比 host1,host2,host3)或者 IP 地址(好比 11.12.13.14,21.22.23.24)。

而后,就可使用证书,登陆远程服务器了。

$ ssh -i ~/.ssh/user_key user@host.example.com

上面命令的 -i 参数用来指定用户的密钥。若是证书与密钥在同一个目录,则链接服务器时将自动使用该证书。

11、废除证书

废除证书的操做,分红用户证书的废除和服务器证书的废除两种。

服务器证书的废除,用户须要在 known_hosts 文件里面,修改或删除对应的 @cert-authority 命令的那一行。

用户证书的废除,须要在服务器新建一个 /etc/ssh/revoked_keys 文件,而后在配置文件 sshd_config 添加一行,内容以下。

RevokedKeys /etc/ssh/revoked_keys

revoked_keys 文件保存再也不信任的用户公钥,由下面的命令生成。

$ ssh-keygen -kf /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub

上面命令中,-z 参数用来指定用户公钥保存在 revoked_keys 文件的哪一行,这个例子是保存在第 1 行。

若是之后须要废除其余的用户公钥,能够用下面的命令保存在第 2 行。

$ ssh-keygen -ukf /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub

12、参考连接

  • SSH Emergency Access, Carl Tashian
  • Using OpenSSH Certificate Authentication, Red Hat Enterprise Linux Deployment Guide
  • How to SSH Properly, Gus Luxton

jishuroad.jpg

相关文章
相关标签/搜索