本文由秀依林枫提供友情赞助,首发于烂泥行天下

最近一个月没有写过文章,主要是刚刚换的新工作。新公司服务器OS使用的是ubuntu server版,和以前熟悉的centos还是有很多不同的。

刚好这几天有时间,也是工作需要,学习了下有关ssh密钥的知识。

在平时的工作中,我们登陆服务器,一般是使用ssh密码的方式。其实还有一种方式,那就是通过ssh密钥登陆服务器。

这两种方法都是ssh的安全验证方式,,根据验证方式的不同我们把其分为:基于密码的安全验证和基于密钥的安全验证。

注意:在一些文章中提到的ssh证书,其实就是ssh密钥。

一、ssh两种安全验证介绍

通过以上介绍,我们知道了ssh有两种安全验证方式,下面我们一一介绍其工作原理。

1.1 基于密码的安全验证

这种方式,只需要知道远程服务器的帐号和密码,就可以登录到远程服务器。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是说这种方式的连接有可能会受到“中间人”这种方式的攻击。

1.2 基于密钥的安全验证

这种方式,需要依靠密钥,也就是说你必须为自己创建一对密钥对(公钥和私钥),并且把该公钥放到需要访问的服务器上。

注意:不能在需要访问的服务器上创建密钥,否则无法通过该密钥连接该服务器,但是通过该密钥连接其他服务器是正常的。

如果你要连接到ssh服务器,ssh客户端会向ssh服务器发出请求,请求用你的密钥进行安全验证。ssh服务器在收到该请求之后,会先在ssh服务器上,检查你登陆的用户的主目录下寻找对应的公钥,然后把它和你发送过来的公钥进行比较。如果两个公钥一致,ssh服务器就用公钥加密“质询”(challenge)并把它发送给ssh客户端。ssh客户端在收到“质询”之后就可以用你的私钥解密该“质询”,再把它发送给ssh服务器。

这种安全验证方式,你必须知道自己密钥的加密口令。当然,自己的密钥也可以不加密,而且这种不加密密钥的方式,在平时工作中使用的也比较多。

通过以上对比,我们可以很容易看出。与基于密码的安全验证相比,基于密钥的安全验证是不需要在网络上传输密码。除此之外,我们还可以看出,“中间人”这种攻击方式也是不可能的(因为他没有你的私钥)。

二、测试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无密码登陆的全部内容。

烂泥:学习ssh之ssh无密码登陆的更多相关文章

  1. 18.ssh远程双向无密码登陆

    #ssh远程双向无密码登陆 需求:在192.168.10.100执行ssh 192.168.20.205不需要输入密码直接跳转到205机器 #在192.168.10.100执行命令,我这里使用root ...

  2. ssh 信任关系无密码登陆,清除公钥,批量脚本

    实验机器: 主机a:192.168.2.128 主机b:192.168.2.130 实验目标: 手动建立a到b的信任关系,实现在主机a通过 ssh 192.168.2.130不用输入密码远程登陆b主机 ...

  3. Linux设置ssh无密码登陆

    最近在折腾Hadoop,要用到主机间无密码登陆,设置的时候遇到了一些问题,这里记录一下. 假设A需要无密码登陆B. 那么首先需要在A上使用ssh-keygen生成id_rsa.pub的公钥,生成时,一 ...

  4. 烂泥:学习ssh之ssh密钥随身携带

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 在上一篇文章<烂泥:学习ssh之ssh无密码登陆>中,我们讲解了如何使用ssh密钥,免密码登陆服务器. 这篇文章我们再来讲解,如何把已经生成的 ...

  5. 解决root用户ssh配置无密码登陆/hadoop用户照仿可以实现相同功能:hadoop用户登录并且把命令的所有root换成home/hadoop

    http://inuyasha1027.blog.51cto.com/4003695/1132896/ 主机ip:192.168.163.100(hostname: node0) ssh无密码登陆的远 ...

  6. [SSH服务]——一个SSH无密码登陆实验

    实验拓扑图 实验描述 机房内有两台服务器: (1)B服务器10.0.10.158,充当Web服务器,有普通用户user_00 (2)C服务器10.0.10.191,充当Mysql服务器,有普通用户us ...

  7. SSH无密码登陆问题解决

    转载 http://my.oschina.net/hunzi/blog/10687 安装好Cygwin后,SSH需要设置为无密码登陆, 首先查看是ssh还是ssh2:ls -l `which ssh` ...

  8. linux ssh 无密码登陆

    要点:有时候ssh localhost 无法登陆本机,但各种设置都正确.重启下就好了...... 参考地址:http://bbs.csdn.net/topics/370109654 三台机器实现互相之 ...

  9. 批量设置ssh无密码登陆脚本

    最近要给集群设置ssh无密码登陆,如果需要手动设置这个无密码登陆,所以在网上找了几个脚本,亲测下面这个好使,并且设置比较简单. 需要用root账户执行,我也是要给root账户设置无密码登陆. 首先我们 ...

随机推荐

  1. vim快捷键整理(转载)

    一.移动光标 1.左移h.右移l.下移j.上移k2.向下翻页ctrl + f,向上翻页ctrl + b3.向下翻半页ctrl + d,向上翻半页ctrl + u4.移动到行尾$,移动到行首0(数字), ...

  2. Scalaz(3)- 基础篇:函数概括化-Generalizing Functions

    Scalaz是个通用的函数式编程组件库.它提供的类型.函数组件都必须具有高度的概括性才能同时支持不同数据类型的操作.可以说,scalaz提供了一整套所有编程人员都需要的具有高度概括性的通用函数,它是通 ...

  3. 1 UML基础

    学习设计模式的过程中,发现相关的作者们都会用UML类图来表示一个模式的整体脉络,这种方式确实直观明了,既能体现宏观思路.又能兼顾实现细节.真的是很妙的工具.在开始正式学习设计模式之前,有必要对UML有 ...

  4. mongoDB简介

    概述 MongoDB 是一款跨平台.面向文档的数据库.用它创建的数据库可以实现高性能.高可用性,并且能够轻松扩展.MongoDB 的运行方式主要基于两个概念:集合(collection)与文档(doc ...

  5. 如何理解javascript closure ?

    接触过javascript的人应该听过闭包(closure),有一种观点认为是闭包赋予了javascript的强大能力,也赋予了它具备OOP的特征.既然javascript closure如此重要,那 ...

  6. 基于Eclipse搭建STM32开源开发环境

    最近项目不忙,想着没事看看简单的嵌入式,弄弄物联网什么的.于是就从廉价的STM32开刀了.因为一直是做PC软件开发的,那VS的智能感知那叫一个爽啊,相比之下,觉得这个Keil简直就像文本编辑器一样lo ...

  7. 如何排查sharepoint2010用户配置文件同步服务启动问题

    用户配置文件同步服务与 Microsoft Forefront Identity Manager (FIM) 交互,以与外部系统(如目录服务和业务系统)同步配置文件信息.启用用户配置文件同步服务时,将 ...

  8. 使用Python对文档单词进行计数

    做hacker.org上面的题目时,遇到了一个题目需要对RFC3280种长度为9的单词进行计数,并找出这些单词中出现次数最多的那个:Didactic Byte RFC3280文档有7000多行,靠人工 ...

  9. SharePoint2007:解决第二回收站大数据无法删除问题

    Emptying the Second Stage Recycle Bin in SharePoint 2007   Look in your second stage recycle bin in ...

  10. Oracle11g 统计信息——统计信息自动收集任务

    参考文献: Oracle11g 统计信息(一)-----统计信息自动收集任务 背景: 在使用cacti监控oracle数据库IO的时候发现每天晚上10点钟的时候oracle数据库读写明显增加,如下图所 ...