OpenSSH#007#使用数字证书登录

前面的文章我们介绍了基于密码身份验证、密钥身份认证等登录系统的方法,本文我们基于OpenSSH数字证书的身份认证。

基于数字证书的身份认证,主要包含如下内容:

第一,管理员:建设身份认证CA中心,包括CA私钥文件sanxian_ca和公钥文件sanxian_ca.pub,由私钥文件向用户端授权,由公钥文件验签;

第二,管理员:部署CA公钥文件sanxian_ca.pub到服务器,并对OpenSSH进行配置使其支持基于数字证书的身份认证;

第三,用户端:用户自行生成其私钥和公钥文件如:mancode_key和mancode_key.pub(该文件的名称可自定义);

第四,用户端:用户将公钥文件mancode_key.pub发送给管理员,并提交签发申请;

第五,管理员:使用CA公钥文件签发基于用户公钥文件的证书文件,并于证书文件中设置登录主体、登录有效期等关键信息;

第六,用户端:用户使用CA签发的mancode_key-cert.pub数字证书和私钥文件mancode_key通过OpenSSH登录系统;

第七,管理员:管理员进行日常维护,如用户离职等原因可以吊销已发放数字证书的登录权限;

第一步,创建CA中心的公私钥文件

我们使用如下命令来生成公私钥文件:

1
ssh-keygen -t ed25519 -C ca_for_authorization -f sanxian_ca

此处我们生成公私钥时选择了ed25519算法,其算法选项可以为:dsa,ecdsa,ecdsa-sk,ed25519,ed25519-sk,rsa。

该命令执行过程,如下图所示:

执行完上述命令之后,在本地生成的sanxian_ca和sanxian_ca.pub就是我们需要的CA中心的私钥文件和公钥文件。其内容大概如下所示:

第二步,OpenSSH服务端的配置

1)如我们欲登录的服务器是192.168.9.132,那么我首先将sanxian_ca.pub文件上传到该服务器/etc/ssh目录下并设置权限:

设置权限命令:

1
chmod 0600 sanxian_ca.pub

设置完毕后,如下图所示

2)创建文件夹 /etc/ssh/principals 并设置权限:

设置权限命令:

1
2
3
mkdir -p /etc/ssh/principals

chmod 0755 /etc/ssh/principals

上述命令执行后, 结果如下图所示:

3)创建登录账号的主体文件

假如服务器192.168.9.132上有4个账号:root、admin、mancode、sanxian,我们允许基于数字证书的身份认证,可以登录root、mancode这两个账号,那么我们就在/etc/ssh/principals目录下为root和mancode创建主题文件,在文件中明确该账号对应数字证书中的登录主体信息,并设置文件权限。

设置权限命令:

1
2
3
chmod 0644 /etc/ssh/principals/root

chmod 0644 /etc/ssh/principals/mancode

填写文件内容以及设置权限后,结果如下图举例所示:

注意:主体文件中的内容可以自行设定,上图中的 principals_test_for_mancode 等仅为示例,其值只要与数字证书中的主题信息匹配即可!

/etc/ssh/principals/root和/etc/ssh/principals/mancode这两个文件的作用是什么?

以mancode账户为例:

  • 在签发数字证书时:

为数字证书A设置登录主体为:principals_test_for_mancode

为数字证书B设置登录主体为:principals_test_for_nothing

  • 用户后续使用 数字证书A 登录192.168.9.132的mancode账户时:

因数字证书A的主体信息 principals_test_for_mancode,其位于/etc/ssh/principals/mancode内,那么使用数字证书A可以正常登录

  • 用户后续使用 数字证书B 登录192.168.9.132的mancode账户时:

因数字证书B的主体信息 principals_test_for_nothing,其不在/etc/ssh/principals/mancode内,那么使用数字证书B就不能正常登录

  • 以此推断:数字证书B的主体信息不在/etc/ssh/principals/root和/etc/ssh/principals/mancode任一文件内,那么它不能正常登录任何账号;

4)修改配置文件/etc/sshd/sshd_config

我们在上述配置文件中增加如下两行配置信息:

1
2
3
TrustedUserCAKeys /etc/ssh/sanxian_ca.pub

AuthorizedPrincipalsFile /etc/ssh/principals/%u

配置完毕后,信息如下图所示:

5)上述工作完成后,我们重启sshd,使用如下命令:

1
sudo systemctl restart ssh

第三步,用户创建公私钥文件以及签发

1)用户使用如下命令创建公私钥文件:

1
ssh-keygen -t ed25519 -C "This certificate is CERT_A" -f cert_a

上述命令执行过程如下图所示:

2)管理员使用CA私钥签发,使用如下命令:

1
ssh-keygen -s sanxian_ca -I ident -z 01 -n "principals_test_for_mancode" -V -10m:+90d cert_a.pub

上述命令执行过程如下图所示:

其中,cert_a-cert.pub就是管理员签发后的用户数字证书。

我们使用如下命令查看下数字证书cert_a-cert.pub的信息:

1
ssh-keygen -L -f cert_a-cert.pub

该证书信息如下图所示:

第四步,使用SecureCRT+数字证书登录服务器

1)将数字证书放置于Windows客户机上的任一位置,如下图所示:

2)打开SecureCRT创建连接,如下图所示:

3)选择数字证书的路径,如下图所示:

4)尝试登录服务器,如下图所示:

5)点击Connect查看登录结果,如下图所示:

第五步,使用SSH命令+数字证书登录服务器

上节介绍了使用SecureCRT+数字证书登录服务器的步骤,本节我们在另外一台Linux服务器上,使用SSH命令+数字证书登录服务器的方法。

1)首先,我们将数字证书拷贝客户端任一目录下,并为其设置权限0600,如下图所示:

2)然后,使用如下命令登录远程服务器,如下图所示:

1
ssh mancode@192.168.9.132 -i /home/mancode/cert/cert_a/cert_a