本文首发于烂泥行天下linux
最近一个月没有写过文章,主要是刚刚换的新工做。新公司服务器OS使用的是ubuntu server版,和之前熟悉的centos仍是有不少不一样的。面试
恰好这几天有时间,也是工做须要,学习了下有关ssh密钥的知识。shell
在平时的工做中,咱们登录服务器,通常是使用ssh密码的方式。其实还有一种方式,那就是经过ssh密钥登录服务器。ubuntu
这两种方法都是ssh的安全验证方式,,根据验证方式的不一样咱们把其分为:基于密码的安全验证和基于密钥的安全验证。windows
注意:在一些文章中提到的ssh证书,其实就是ssh密钥。centos
1、ssh两种安全验证介绍安全
经过以上介绍,咱们知道了ssh有两种安全验证方式,下面咱们一一介绍其工做原理。服务器
1.1 基于密码的安全验证网络
这种方式,只须要知道远程服务器的账号和密码,就能够登陆到远程服务器。全部传输的数据都会被加密,可是不能保证你正在链接的服务器就是你想链接的服务器。可能会有别的服务器在冒充真正的服务器,也就是说这种方式的链接有可能会受到“中间人”这种方式的***。ssh
1.2 基于密钥的安全验证
这种方式,须要依靠密钥,也就是说你必须为本身建立一对密钥对(公钥和私钥),而且把该公钥放到须要访问的服务器上。
注意:不能在须要访问的服务器上建立密钥,不然没法经过该密钥链接该服务器,可是经过该密钥链接其余服务器是正常的。
若是你要链接到ssh服务器,ssh客户端会向ssh服务器发出请求,请求用你的密钥进行安全验证。ssh服务器在收到该请求以后,会先在ssh服务器上,检查你登录的用户的主目录下寻找对应的公钥,而后把它和你发送过来的公钥进行比较。若是两个公钥一致,ssh服务器就用公钥加密“质询”(challenge)并把它发送给ssh客户端。ssh客户端在收到“质询”以后就能够用你的私钥解密该“质询”,再把它发送给ssh服务器。
这种安全验证方式,你必须知道本身密钥的加密口令。固然,本身的密钥也能够不加密,并且这种不加密密钥的方式,在平时工做中使用的也比较多。
经过以上对比,咱们能够很容易看出。与基于密码的安全验证相比,基于密钥的安全验证是不须要在网络上传输密码。除此以外,咱们还能够看出,“中间人”这种***方式也是不可能的(由于他没有你的私钥)。
2、测试ssh无密码登录
在第一章中咱们介绍了,ssh的两种安全验证方式。要达到ssh无密码登录服务器,咱们就要使用ssh密钥验证这种方式。
PS:本次试验OS为Ubuntu 14.04.02 64bit,以下:
uname –a
cat /etc/issue
2.1建立ssh密钥
经过第一章咱们知道了,要使用ssh密钥验证。咱们必需要建立一个ssh密钥对。
ssh密钥的建立,咱们能够有两种方式。第一就是在linux OS上经过ssh-kengen这个命令来建立,第二就是在windows下经过ssh客户端工具来建立。
下面咱们对其建立密钥的方法一一进行介绍,以下。
2.1.1 经过ssh-kengen命令建立密钥
使用ssh-kengen命令建立ssh密钥很简单,直接使用该命令建立便可。以下:
ssh-keygen
经过上图,咱们能够很明显的看出刚刚新建立的密钥存放在/home/ilanni/.ssh目录下,并且私钥文件是id_rsa,公钥文件是id_rsa.pub。
除此以外,咱们还须要注意ssh-kengen命令中:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
这两行是表示设置私钥的加密密码,咱们在此是没有设置私钥的加密密码。
如今咱们来查看密钥的文件属性,以下:
ll .ssh/
经过上图,咱们能够很明显的看出:
.ssh目录的用户权限是700,私钥id_rsa的权限是600,公钥id_rsa.pub的权限是644。
注意:有关私钥id_rsa和公钥id_rsa.pub文件权限很是重要,若是权限没有设置对的话,在使用ssh密钥登录时,系统仍是会提示须要输入密码。
ssh-keygen默认使用的密钥加密类型是rsa,这个咱们能够经过查看公钥文件id_rsa.pub得知。以下:
cat .ssh/id_rsa.pub
若是要使用其余类型的加密方式,咱们能够经过ssh-keygen的-t参数来指定使用的加密类型。以下:
ssh-keygen -t dsa
cat .ssh/id_dsa.pub
有关ssh-kengen命令的详细使用方法,咱们能够经过查看ssh-kengen的帮助命令得到。以下:
ssh-keygen --help
注意:该密钥是在192.168.1.8机器上生成的,以下:
hostname
ifconfig
2.1.2 经过xshell建立密钥
windows下ssh客户端的链接工具比较多,可是我使用最多的仍是xshell这个工具。
下面咱们就经过xshell工具,来建立ssh的密钥。
打开xshell,点击“工具”--“新建用户密钥生成向导”,以下:
下面这个界面,咱们能够选择密钥的类型和密钥的长度,以下:
生成密钥对,以下:
输入密钥名称以及密钥的加密密码,以下:
注意:这个密钥的加密密码就是ssh私钥的加密密码,咱们能够为空。
为了下面试验区分经过ssh-kengen生成的密钥id_rsa,在此密钥的名称咱们命名为id_rsa_1024。
生成公钥,以下:
公钥生成后,咱们须要把该公钥保存到一个文件中。以下:
公钥保存完毕后,xshell就会跳转到私钥的界面。以下:
经过上图,咱们能够看到目前私钥的名称就是咱们前面命名的id_rsa_1024,并且密钥的长度是1024字节。
如今咱们来导出该私钥,以下:
这样咱们就获得了一对ssh密钥,以下:
2.2 上传ssh公钥
在2.1章节中,咱们已经建立好了ssh的公钥与私钥,如今咱们开始把公钥上传到须要被访问的服务器上,即ssh服务器上。
在把公钥上传到ssh服务器上,咱们还有几件事要作:
1)、肯定要登录ssh服务器的用户
2)、修改ssh服务器的ssh配置文件sshd_config
3)、建立authorized_keys文件
4)、上传公钥并把内容重定向到authorized_keys文件
注意:本章节是在192.168.1.7机器上操做,以下:
hostname
ifconfig
2.2.1 肯定要登录ssh服务器的用户
由于咱们是要免密码登录ssh服务器,因此咱们必需要肯定使用哪个用户登录ssh服务器。
注意:该用户必定要在ssh服务器存在,而且是能够登录ssh服务器的。
在此咱们使用的是ilanni这个用户登录ssh服务器的。以下:
whoami
cat /etc/passwd |grep ilanni
2.2.2 修改ssh配置
ssh存放用户登录的公钥是经过sshd_config文件配置的,可是默认该选项是没有启用的。须要咱们经过修改sshd_config文件来启用,以下:
sudo vi /etc/ssh/sshd_config
咱们只须要把#AuthorizedKeysFile %h/.ssh/authorized_keys行前的#去掉便可。以下:
AuthorizedKeysFile存放该用户能够用来登陆的RSA/DSA公钥。该指令中%h表示用户的主目录,最后公钥会存放到主目录的.ssh/authorized_keys文件中。
注意:这个步骤不是必须的,由于经过ssh-copy-id命令进行配置时,就无需修改ssh配置文件。
2.2.3 建立authorized_keys文件
在上一章节中,咱们知道了用户的公钥是存放在authorized_keys文件中的,如今咱们来建立该文件。
先建立.ssh目录并修改其用户属性,以下:
mkdir .ssh
chmod 700 .ssh
.ssh目录建立完毕后,咱们如今来建立authorized_keys文件。以下:
touch authorized_keys
2.2.4 把公钥内容重定向到authorized_keys文件
在2.1章节中,咱们介绍了ssh密钥的生成方法。一是经过ssh-kengen命令生成,二是经过xshell生成。
咱们如今把这两个公钥都上传到192.168.1.7机器上,而后重定向到authorized_keys文件中。以下:
把192.168.1.8公钥复制到192.168.1.7机器上,以下:
scp .ssh/id_rsa.pub ilanni@192.168.1.7:/home/ilanni
把xshell生成的公钥上传到192.168.1.7上,以下:
如今把两个公钥都重定向到authorized_keys文件,以下:
cat id_rsa.pub >.ssh/authorized_keys
cat id_rsa_1024.pub>>.ssh/authorized_keys
cat .ssh/authorized_keys
2.3 链接ssh服务器
公钥上传完毕后,咱们来链接ssh服务器,也就是链接192.168.1.7机器。
链接192.168.1.7,咱们也能够分为linux和windows,下面对其链接方法一一讲解。
2.3.1 在linux上链接ssh服务器
咱们先在linux机器192.168.1.8上链接192.168.1.7,以下:
ssh ilanni@192.168.1.7
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
经过上图,咱们能够很明显的看出在192.168.1.8上链接192.168.1.7时,系统没有提示咱们输入密码。
这也就实现了,咱们免密码登录ssh服务器的功能。
2.3.2 在windows上链接ssh服务器
咱们如今切换到windows系统上,来链接192.168.1.7。 ssh客户端工具,咱们使用的仍是xshell,仍是在生成密钥的那台windows机器上。以下:
ssh ilanni@192.168.1.7
注意:用户身份验证方法,在此咱们须要选择的是Public Key也就是密钥验证方式,而且用户密钥就是咱们前面生成时的密钥时的私钥id_rsa_1024。
经过上图,咱们能够很明显的看到在windows客户端链接192.168.1.7,系统也没有要求咱们输入密码,这也就实现了ssh的无密码登录。
2.4 使用ssh-copy-id上传ssh公钥
看了第2.2章节有关上传ssh公钥,你是否是以为很麻烦。其实ssh还给咱们提供了另一个命令ssh-copy-id,ssh-copy-id命令能够把上述的步骤一次性执行完毕。
注意:ssh-copy-id命令只存在于linux系统中,目前没有发现windows系统的ssh客户端工具备该命令。
ssh-copy-id命令使用方法,以下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
ssh-copy-id -i .ssh/id_rsa.pub ilanni@192.168.1.9
cat .ssh/id_rsa.pub
登录192.168.1.9,查看公钥。以下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
ll --full-time .ssh/
cat .ssh/authorized_keys
经过以上两张截图,咱们很明显的看出,使用ssh-copy-id命令能够直接在ssh服务器对应用户的家目录下建立.ssh目录,而且在该目录下建立authorized_keys文件。同时也会把公钥id_rsa.pub文件中的内容,复制到authorized_keys文件中。
查看ssh配置文件是否修改。以下:
cat /etc/ssh/sshd_config |grep authorized_keys
经过上图,咱们能够很明显的看出ssh-copy-id没有修改ssh配置。
如今咱们来链接192.168.1.9测试下,以下:
ifconfig eth0|grep "inet addr"|awk '{print $2}'|cut -d: -f2
ssh ilanni@192.168.1.9
经过上图,咱们能够很明显的看到即便不修改ssh的配置文件,只要有authorized_keys文件,也能实现ssh的无密码登录。
有关ssh-copy-id详细的使用方法,能够查看其帮助命令。以下:
ssh-copy-id -h
以上就是有关ssh无密码登录的所有内容。