Code前端首页关于Code前端联系我们

SSH第三种登录方式,什么是证书登录?处理及处置

terry 2年前 (2023-09-28) 阅读数 65 #未命名

SSH 是一个服务器登录工具。一般采用密码登录或按键登录。

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

无证书登录的缺点

使用密码登录和密钥登录各有其缺点。

密码登录需要输入服务器密码,非常繁琐且不安全,并且存在被暴力破解的风险。

密钥登录需要服务器存储用户的公钥,用户也必须存储服务器公钥的指纹。这对于拥有多个用户和多个服务器的大型组织来说非常不方便。如果员工离开,他的公钥必须从每台服务器上删除。

什么是证书登录?

证书登录就是为了解决上述缺陷而设计的。它引入了证书颁发机构 (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(私钥)❀ca)和us(公钥)。

该命令中各个参数的含义如下。

  • -t rsa:指定密钥算法RSA。
  • -b 4096:指定密钥的位数为4096。在安全性要求不高的情况下,该值可以更小,但不应小于1024。
  • -f ~ / .ssh/user_ca:指定生成密钥的位置和文件名。
  • -C user_ca:指定key的标识字符串,对应注释,可根据需要设置。

使用以下命令生成host_ca

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

上面的命令会在文件夹~/.ssh中生成一对密钥:host_ca(私钥)和host_ca (公钥)。

现在目录~/.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
    

    上面的命令会在s/目录下生成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
    

    上面的命令将在中生成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.service
    # 或者
    $ sudo service sshd restart
    

    服务器安装 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
    

    上面的方法是在/etc/ssh/sshd_config中添加user_ca.pub,这样就会有一个全局账户,这样就会有一个全局账户user_ca

    所有用户证书已颁发。

    另一种方法是将 user_ca.pub 添加到 ~/.ssh/authorized_keys这样只有用户可以信任服务器_ca上的❝帐户颁发的用户证书。具体方法是打开~/.ssh/authorized_keys,添加一行以@cert-authorityprincipals="..."开头,然后添加ca。 pub

    的内容大概如下。

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

    上述代码中,principals="user"指定用户登录的服务器账户名,一般就是authorized_keys⸝文件所在的账户。

    重新启动 sshd。

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

    此时,SSH 服务器已配置为信任由 user_ca 签名的证书。

    客户端安装证书

    客户端安装用户证书非常简单,就是将用户证书user_key-cert.pub从CA复制到客户端,以及用户的密钥❙❙❝ user_key

    只需将其保存在同一个公文包中即可。

    客户端安装CA公钥

    为了让客户端信任服务器证书,必须将CA颁发的服务器证书的公钥host_ca.pub添加到客户端证书中/etc/ssh / ssh_known_hosts

    文件(全局级别)或 ~/.ssh/known_hosts 文件(用户级别)。

    具体方法是打开ssh_known_hostsknown_hosts文件,添加一行以♼hor.com开头的内容。 ,然后把host_ca.pub文件的内容(即公钥)粘贴在后面,大概是这样的。

    @cert-authority *.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ==
    

    上面的代码中,*.example.com是域名的模式匹配,也就是说只要服务器与模式域名匹配并且颁发服务器证书的CA与稍后给出公钥,一切都很好。信心。如果没有域名限制,可以写成*。如果有多个域名模式,可以用逗号分隔;如果服务器没有域名,可以使用主机名(如 host1,host2,host3)或 IP 地址(如 11.12.13.14,21.242...

    则可以使用证书登录远程服务器。上述命令中的

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

    -i参数用于指定用户的密钥,如果证书与密钥在同一目录下,则连接服务器时会自动使用证书。

    证书吊销

    证书吊销操作分为两种:用户证书吊销和服务器证书吊销。中的@cert-authority

    known_hosts❀ 文件。要吊销

    用户证书,请在服务器上创建新的 /etc/ssh/revoked_keys 文件,然后在配置文件 ❀_s 中添加一行与♸d_configsh以下内容。文件

    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

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门