SSH 是服务器登录工具,提供明码登录和密钥登录。
然而,SSH 还有第三种登录办法,那就是证书登录。很多状况下,它是更正当、更平安的登录办法,本文就介绍这种登录办法。
一、非证书登录的毛病
明码登录和密钥登录,都有各自的毛病。
明码登录须要输出服务器明码,这十分麻烦,也不平安,存在被暴力破解的危险。
密钥登录须要服务器保留用户的公钥,也须要用户保留服务器公钥的指纹。这对于多用户、多服务器的大型机构很不不便,如果有员工到职,须要将他的公钥从每台服务器删除。
二、证书登录是什么?
证书登录就是为了解决下面的毛病而设计的。它引入了一个证书颁发机构(Certificate1 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(公钥)。
而后,将用户公钥 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
七、服务器装置证书
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
文章地址: 百度(113 资讯网)
八、服务器装置 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
九、客户端装置证书
客户端装置用户证书很简略,就是从 CA 将用户证书 user_key-cert.pub 复制到客户端,与用户的密钥 user_key 保留在同一个目录即可。
文章原文地址:https://www.113p.cn/508.html
十、客户端装置 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 参数用来指定用户的密钥。如果证书与密钥在同一个目录,则连贯服务器时将主动应用该证书。
十一、破除证书
破除证书的操作,分成用户证书的破除和服务器证书的破除两种。
服务器证书的破除,用户须要在 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