SSH证书登录方法详细教程

目录
  • 一、非证书登录的缺点
  • 二、证书登录是什么?
  • 三、证书登录的流程
  • 四、生成 CA 的密钥
  • 五、CA 签发服务器证书
  • 六、CA 签发用户证书
  • 七、服务器安装证书
  • 八、服务器安装 CA 公钥
  • 九、客户端安装证书
  • 十、客户端安装 CA 公钥
  • 十一、废除证书

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 <a href="mailto:user@example" target="_blank" rel="nofollow">user@example</a>.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 <a href="mailto:root@host" target="_blank" rel="nofollow">root@host</a>.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

八、服务器安装 CA 公钥

为了让服务器信任用户证书,必须将 CA 签发用户证书的公钥user_ca.pub,拷贝到服务器。

$ scp ~/.ssh/user_ca.pub <a href="mailto:root@host" target="_blank" rel="nofollow">root@host</a>.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 # 或者 $ sudo service sshd restart

至此,SSH 服务器已配置为信任user_ca签发的证书。

九、客户端安装证书

客户端安装用户证书很简单,就是从 CA 将用户证书user_key-cert.pub复制到客户端,与用户的密钥user_key保存在同一个目录即可。

十、客户端安装 CA 公钥

为了让客户端信任服务器证书,必须将 CA 签发服务器证书的公钥host_ca.pub,加到客户端的/etc/ssh/ssh_known_hosts文件(全局级别)或者~/.ssh/known_hosts文件(用户级别)。

具体做法是打开ssh_known_hostsknown_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 <a href="mailto:user@host" target="_blank" rel="nofollow">user@host</a>.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

到此这篇关于SSH证书登录方法详细教程的文章就介绍到这了,更多相关SSH证书登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux下SSH免密码登录配置详解

    假设有 A. B 两台 Linux 服务器,我们希望能够从其中一台服务器通过 SSH 免密码登录到另一台服务器. 两台服务器的信息如下: 主机名 IP地址 免密码登录用户名 server1 192.168.12.11 guest1 server2 192.168.12.12 guest2 环境设置(root权限) 1.关闭防火墙和SELinux Redhat使用了SELinux来增强安全,关闭的办法为: a. 永久有效 修改 /etc/selinux/config 文件中的 SELINUX=en

  • SSH 登录工具常用命令

    首先我们得知道什么叫shell.操作系统与外部最主要的接口就叫做shell,或许这样说过于术语化,例如cmd命令行,这是windows操作系统下的一个shell.这里说的dreamhost的shell是指dreamhost提供给客户一个命令行,方便客户更好的使用他们的虚拟主机服务.DreamHost中shell使用指南本shell指令及操作均基于Linuxord2.4.29,即DreamHost现在采用的系统,如果你也是DreamHost的用户,那本文或许对你有所帮助. 目录:1.BasicIn

  • ssh自动登录的4种实现方法

    1. 自动ssh/scp方法 A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux 在A上运行命令:# ssh-keygen -t rsa (连续三次回车,即在本地生成了公钥和私钥,不设置密码)# ssh root@192.168.60.110 "mkdir .ssh" (需要输入密码)# scp ~/.ssh/id_rsa.pub root@192.168.60.110:.ssh/

  • SSH原理及两种登录方法图文详解

    SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密. 传统的对称加密使用的是一套秘钥,数据的加密以及解密用的都是这一套秘钥,可想而知所有的客户端以及服务端都需要保存这套秘钥,泄露的风险很高,而一旦秘钥便泄露便保证不了数据安全. 非对称加密解决的就是这个问题,它包含两套秘钥 - 公钥以及私钥,其中公钥用来加密,私钥用来解密,并且通过公钥计算不出私钥,因此私钥谨慎保存在服务端,而公钥可以随便传递,即使泄露也无风险.

  • 设置ssh无密码登录linux服务器的方法

    每次登录测试服务器,ssh登录总是需要输入密码.登录的少还行,登录的多了,多一行命令都是多余的. rsa认证登录方式 制作密钥对 在客户端(本地机器)终端下输入以下命令 ssh-keygen -t [rsa|dsa] rsa和dsa代表不同的算法 例如: ssh-keygen -t rsa 一直回车就对了(不用设置密码) 将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub(如果用dsa则生成id_dsa,id_dsa.pub) 生成位置在/root/.ssh/文件夹下(我用的是roo

  • SSH远程登录和端口转发详解

    介绍 SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境. SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH 远程登录 SSH主要用于远程登录: $ ssh user@host 当本地用户名和远程用户名一致时,可省略用户名: $ ssh host SSH 协议默认端口是22,指定端口可使用 -p 参数 $ ssh -p 2222 user@host MITM SSH 采用公钥加密的方式来保证传输安全.过程如下: 客户端发起

  • SSH证书登录方法详细教程

    目录 一.非证书登录的缺点 二.证书登录是什么? 三.证书登录的流程 四.生成 CA 的密钥 五.CA 签发服务器证书 六.CA 签发用户证书 七.服务器安装证书 八.服务器安装 CA 公钥 九.客户端安装证书 十.客户端安装 CA 公钥 十一.废除证书 SSH是服务器登录工具,密码登录和密钥登录,都有各自的缺点.SSH还有第三种登录方法,那就是证书登录.很多情况下,它是更合理.更安全的登录方法,本文介绍证书登录的方法,需要的朋友可以参考下. 一.非证书登录的缺点 密码登录和密钥登录,都有各自的

  • MyBatis CodeHelperPro激活方法详细教程

    MybatisCodeHelperPro是一款功能强大的插件,可以让IDEA使用Mybatis,帮助用户轻松进行各种程序的编程,提高工作效率,让代码编写更加便捷. 之前给大家介绍过MyBatisCodeHelper-Pro插件破解版详细教程[2.8.2] 插件下载地址 链接: https://pan.baidu.com/s/1bufFKaE3D9vpoQXjhvysyA 提取码: 9pdb 下载完成后解压 在IDEA中本地安装插件 File > Settings >Plugins 找到刚才的解

  • idea搭建ssh框架的超详细教程

    目录 一.创建项目 1.new->project出现如下 2.构建目录结构 二.Struts2 1.首先引入struts2依赖 2.WEB-INF下web.xml文件配置 3.在resources下添加struts.xml文件 4.在action包下创建TestAction类,为了测试在webapp下新建了test.jsp页面 5.部署 6.启动测试 三.Spring 1.首先引入spring相关依赖 2.在web.xml中添加listener,并在resources下新建spring,xml文

  • Ubutu1604安装colmap实现方法详细教程

    从源码级别编译的有cuda加速,直接给的软件是没有cuda加速的,而且后面要用pycolmap库,前提必须自己编译安装colmap环境 联想Y7000笔记本 ubuntu1604.6 显卡 1050TI 显卡驱动版本 430 cuda10.1 0前期准备(可跳过) 0-1先不要安装aconda,不然会造成后面编译引用库的时候混乱报错.关键报错 libtiff4_0引用失败. 0-2已经装了aconda的,尝试修改acoda文件夹名字或者在bash中注销aconda系统路径,总之让系统找不到aco

  • PHP的swoole扩展安装方法详细教程

    Swoole支持PHP 5.3.10以上版本,所以安装Swoole之前请先安装PHP 5.3.10以上版本,现在来介绍Windows下PHP安装配置方法. 软件版本:php-5.3.1-Win32-VC6-x86.zip 这个不需要额外的安装.net的库,所以就用这个了.可以使用其他的. 1.PHP安装 使用绿色方式,下载Zip文件解压. 2.配置 在解压的根目录下找到php.ini-development,是用于开发环境的配置文件:还有一个php.ini-production,这个是用于生产环

  • pycharm专业版远程登录服务器的详细教程

    本文单纯为记录个人学习经历,以及一些经验教训,如涉及侵权,请联系作者立即删除! ** Pycharm等环境连接服务器手册 下载pycharm专业版,购买激活码,利用ssh远程登录调试代码,运行程序 ** 1.在pycharm中菜单中找到tools-------->选择deployment------>configuration 2.就会进入deployment页面,选择左侧的±-------->使用SFTP方式 3.进入create new name页面,输入servername[这里可

  • pycharm与ssh远程访问服务器docker的详细教程

    pycharm与ssh远程访问服务器docker   背景:有些实验需要在服务器上完成,因此为了快速便利地在本地调试远程服务器上的代码,需要完成本地与远程服务器的直连.然而现阶段诸多服务器上安装有docker,通常需要在docker内完成调试代码,因此本文主要提供远程访问服务器docker的配置方法.   需要工具及说明: 一台远程服务器 pycharm:集成开发工具,在本地安装 ssh:远程访问工具,本地和远程服务器都要有 docker:容器,在远程服务器上 1.配置远程服务器docker 第

  • 一键GHOST V8.3 Build 060425 硬盘版一键ghost使用方法说明[图文详细教程]

    http://down7.zol.com.cn//backtools/1KEY_HD.rar http://www.info-collect.com/post/296.html 如何使用一键ghost,一键ghost使用方法说明[图文详细教程] 一键Ghost 8.3         下载地址:http://www.xdowns.com/soft/6/145/2006/Soft_29836.html 现在大家电脑安装的一般是Windows XP系统,并且大多没有软驱,由于无法进入纯Dos,而且以

  • Linux配置免密登录单机和全分布详细教程

    目录 一:单机免密登录配置 1.设置虚拟机主机名 2.虚拟机中配置主机名与ip地址的映射关系 3.关闭防火墙 4.执行如下命令: 二:全分布免密登录配置  1.设置每台虚拟机的主机名 2.虚拟机中配置主机名与ip地址的映射关系(每一台都要操作) 3.关闭防火墙(每一台都要操作) 4.执行如下命令: 一:单机免密登录配置 1.设置虚拟机主机名 hostnamectl --static set-hostname hadoop001 --static 参数代表永久生效 hadoop001为虚拟机主机名

随机推荐