登录/注册
唐某
11055
占位
7
占位
31
浏览量
占位
粉丝
占位
关注
5.SSH证书登录
唐某
2021-01-07 13:25:17 2021-01-07
374
0

作者:阮一峰
出处:http://www.ruanyifeng.com/blog/2020/12/ssh-tutorial.html

SSH 证书登录

SSH 是服务器登录工具,一般情况下都采用密码登录或密钥登录。

但是,SSH 还有第三种登录方法,那就是证书登录。某些情况下,它是更合理、更安全的登录方法,本文就介绍这种登录方法。

非证书登录的缺点

密码登录和密钥登录,都有各自的缺点。

密码登录需要输入服务器密码,这非常麻烦,也不安全,存在被暴力破解的风险。

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

证书登录是什么?

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

登录时,用户和服务器不需要提前知道彼此的公钥,只需要交换各自的证书,验证是否可信即可。

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

证书登录的流程

SSH 证书登录之前,如果还没有证书,需要生成证书。具体方法是:(1)用户和服务器都将自己的公钥,发给 CA;(2)CA 使用服务器公钥,生成服务器证书,发给服务器;(3)CA 使用用户的公钥,生成用户证书,发给用户。

有了证书以后,用户就可以登录服务器了。整个过程都是 SSH 自动处理,用户无感知。

第一步,用户登录服务器时,SSH 自动将用户证书发给服务器。

第二步,服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。证实以后,就可以信任用户。

第三步,SSH 自动将服务器证书发给用户。

第四步,用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。证实以后,就可以信任服务器。

第五步,双方建立连接,服务器允许用户登录。

生成 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

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

CA 签发用户证书

下面,再用 CA 签发用户证书。这时需要用户的公钥,如果没有的话,客户端可以用下面的命令生成一对密钥。

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

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

然后,将用户公钥`u

暂无评论