来自:阮一峰的博客链接:https://tinyurl.com/yc9xrc7tSSH是一款提供密码登录和密钥登录的服务器登录工具。不过SSH还有第三种登录方式,那就是证书登录。在很多情况下,这是一种更合理、更安全的登录方式,本文介绍的就是这种登录方式。1、无证书登录的缺点密码登录和密钥登录都有各自的缺点。密码登录需要输入服务器密码,非常麻烦且不安全,还有被暴力破解的风险。密钥登录需要服务器保存用户的公钥,用户也需要保存服务器公钥的指纹。这对于拥有多个用户和多个服务器的大型组织来说是不方便的。如果员工离职,他的公钥需要从每台服务器上删除。2、什么是证书登录?证书登录就是为了解决以上不足而设计的。它引入了证书颁发机构(Certificate1authority,简称CA),向受信服务器颁发服务器证书,向受信用户颁发用户证书。登录时,用户和服务器无需事先知道对方的公钥,只需交换各自的证书即可验证是否可信。证书登录的主要优点有两个:(1)用户和服务器不需要交换公钥,更易于管理,具有更好的可扩展性。(2)证书可以设置有效期,但公钥没有有效期。针对不同情况,可以设置较短有效期的证书,进一步提高安全性。3、证书登录流程SSH证书登录之前,如果没有证书,需要生成证书。具体方法是:(1)用户和服务器都将自己的公钥发送给CA;(2)CA使用服务器公钥生成服务器证书,发送给服务器;(3)CA使用用户的公钥生成用户证书。证书,颁发给用户。有了证书,用户就可以登录服务器了。整个过程由SSH自动处理,用户无感知。第一步,当用户登录服务器时,SSH自动将用户证书发送给服务器。在第二步中,服务器检查用户证书是否有效并由受信任的CA颁发。第三步,SSH自动将服务器证书发送给用户。第四步,用户检查服务器证书是否有效并由受信任的CA颁发。第五步,双方建立连接,服务器允许用户登录。4、生成CA密钥证书登录的前提是必须有CA,CA本质上是一对密钥,与其他密钥没有区别,CA使用这对密钥来颁发证书。虽然CA可以使用同一对密码颁发用户证书和服务器证书,但为了安全和灵活性,最好分别使用不同的密钥颁发它们。所以CA至少需要两对密钥,一对是颁发用户证书的密钥,假设叫user_ca,另一对是颁发服务器证书的密钥,假设叫host_ca。使用以下命令生成user_ca。#生成CA颁发用户证书的密钥$ssh-keygen-trsa-b4096-f~/.ssh/user\_ca-Cuser\_ca以上命令会在~/.ssh目录下生成一对密钥:user_ca(私钥)和user_ca.pub(公钥)。该命令各参数含义如下。-trsa:指定密钥算法RSA。-b4096:指定密钥的位数为4096位。在安全性要求不高的场合,这个值可以小一些,但不能小于1024。-f~/.ssh/user_ca:指定生成密钥的位置和文件名。-Cuser_ca:指定key的标识字符串,相当于注释,可以随意设置。使用以下命令生成host_ca。#生成CA颁发服务器证书的密钥$ssh-keygen-trsa-b4096-fhost_ca-Chost_ca上面的命令会在~/.ssh目录下生成一对密钥:host_ca(私钥)和host_ca.pub(公钥)。~/.ssh目录中现在应该至少有四个密钥。~/.ssh/user_ca~/.ssh/user_ca.pub~/.ssh/host_ca~/.ssh/host_ca.pub5.CA颁发服务器证书有了CA之后,你就可以颁发服务器证书了。要颁发证书,除了CA的密钥外,还需要服务器的公钥。一般来说,在安装SSH服务器(一般是sshd)的时候,密钥/etc/ssh/ssh_host_rsa_key就已经生成了。如果没有,您可以使用以下命令生成它。$sudossh-keygen-f/etc/ssh/ssh_host_rsa_key-b4096-trsa以上命令会在/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-shost_ca-Ihost.example.com-h-nhost.example.com-V+52wssh_host_rsa_key.pub上面的命令会生成服务器证书ssh_host_rsa_key-cert.pub(服务器公钥名称后缀为-证书)。该命令各参数含义如下。-s:指定CA颁发证书的秘钥。-I:身份字符串,可以随意设置,相当于注释,方便区分证书。此字符串可用于将来吊销证书。-h:指定证书是服务器证书,不是用户证书。-nhost.example.com:指定服务器的域名,表示证书只对该域名有效。如果有多个域名,用逗号分隔。当用户登录域名服务器时,SSH使用证书的这个值来标识应该使用哪个证书发送给用户,以证明服务器的可信度。-V+52w:指定证书的有效期,这里是52周(一年)。默认情况下,证书永远有效。推荐使用该参数指定有效期,有效期最好短一些,最长不超过52周。ssh_host_rsa_key.pub:服务器公钥。生成证书后,可以使用以下命令查看证书的详细信息。$ssh-keygen-L-fssh_host_rsa_key-cert.pub最后,设置证书的权限。$chmod600ssh_host_rsa_key-cert.pub6.CA颁发用户证书接下来,使用CA颁发用户证书。这时候就需要用户的公钥。如果没有,客户端可以使用以下命令生成一对密钥。$ssh-keygen-f~/.ssh/user_key-b4096-trsa上面的命令会在~/.ssh目录下生成user_key(私钥)和user_key.pub(公钥)。然后将用户公钥user_key.pub上传或复制到CA服务器。接下来,您可以使用CA的密钥user_ca为用户公钥user_key.pub颁发用户证书。$ssh-keygen-suser_ca-Iuser@example.com-nuser-V+1duser_key.pub上面的命令会生成一个用户证书user_key-cert.pub(用户公钥名后缀-cert)。该命令各参数含义如下。-s:指定CA颁发的证书的密钥-I:身份字符串,可以随意设置,相当于注释,方便区分证书。此字符串可用于将来吊销证书。-nuser:指定用户名,表示证书只对用户名有效。如果有多个用户名,用逗号分隔。当用户使用这个用户名登录到服务器时,SSH使用这个值来识别应该使用哪个证书,证明他们的身份,并将它发送到服务器。-V+1d:指定证书的有效期,这里是1天,强制用户每天申请证书,提高安全性。默认情况下,证书永远有效。user_key.pub:用户公钥。生成证书后,可以使用以下命令查看证书的详细信息。$ssh-keygen-L-fuser_key-cert.pub最后,为证书设置权限。$chmod600user_key-cert.pub7.服务器安装证书CA生成服务器证书ssh_host_rsa_key-cert.pub后,需要将证书发回服务器。您可以使用下面的scp命令复制证书。$scp~/.ssh/ssh_host_rsa_key-cert.pubroot@host.example.com:/etc/ssh/然后,将以下行添加到服务器配置文件/etc/ssh/sshd_config。HostCertificate/etc/ssh/ssh_host_rsa_key-cert.pub上面的代码告诉sshd服务器证书是哪个文件。重新启动sshd。$sudosystemctlrestartsshd#or$sudoservicesshdrestart8.服务器安装CA公钥为了让服务器信任用户证书,必须将CA颁发的公钥user_ca.pub复制到服务器。$scp~/.ssh/user_ca.pubroot@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颁发的所有用户证书。另一种方式是在服务器上某个账号的~/.ssh/authorized_keys文件中加入user_ca.pub,只让这个账号信任user_ca颁发的用户证书。具体方法是打开~/.ssh/authorized_keys,添加一行,开头是@cert-authorityprincipals="...",然后添加user_ca.pub的内容,如下所示。@cert-authorityprincipals="user"ssh-rsaAAAAB3Nz...XNRM1EX2gQ==上面代码中principals="user"指定了用户登录的服务器账号名称,一般就是authorized_keys所在的账号文件位于。重新启动sshd。$sudosystemctlrestartsshd#or$sudoservicesshdrestart至此,SSH服务器已经配置为信任user_ca颁发的证书。9、客户端安装证书在客户端安装用户证书非常简单,就是将用户证书user_key-cert.pub从CA复制到客户端,并保存在与用户密钥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.comssh-rsaAAAAB3Nz...XNRM1EX2gQ==上面代码中,_.example.com是域名模式匹配,也就是说只要服务器匹配到的域名pattern,并且颁发服务器证书的CA匹配后面给出的公钥可以信任。如果没有域名限制,这里可以写成*。如果有多个域名模式,可以用逗号分隔;如果服务器没有域名,可以使用主机名(如host1、host2、host3)或IP地址(如11.12.13.14、21.22.23.24)。然后,您就可以使用该证书登录远程服务器了。$ssh-i~/.ssh/user_keyuser@host.example.com上面命令的-i参数用来指定用户的密钥。如果证书与密钥在同一目录中,则在连接到服务器时将自动使用该证书。11、证书的吊销证书的吊销操作分为用户证书的吊销和服务器证书的吊销两种。用户要撤销服务器证书,需要修改或删除known_hosts文件中@cert-authority命令对应的行。要撤销用户证书,需要在服务器上新建一个/etc/ssh/revoked_keys文件,然后在配置文件sshd_config中添加一行内容如下。RevokedKeys/etc/ssh/revoked_keysrevoked_keys文件保存不再受信任的用户公钥,由以下命令生成。$ssh-keygen-kf/etc/ssh/revoked_keys-z1~/.ssh/user1_key.pub在上面的命令中,-z参数用于指定用户公钥保存在revoked_keys文件的哪一行。此示例保存在第1行中。如果以后需要撤销其他用户公钥,可以在第2行使用如下命令保存。$ssh-keygen-ukf/etc/ssh/revoked_keys-z2~/.ssh/user2_key.pub十二、参考链接SSH紧急访问,CarlTashian使用OpenSSH证书身份验证,RedHatEnterpriseLinux部署指南如何正确使用SSH,GusLuxton