Linux-使用ssh免密码登录

Linux-使用ssh免密码登录

ssh登录的认证方式

我们能用ssh登录服务器,是因为服务器中运行着一个叫sshd的守护进程,它默认监听着22端口,该进程的配置文件在/etc/ssh/sshd_config,在里面我们可以看到sshd的认证方式大概有:

PubkeyAuthentication    公钥认证
RSAAuthentication   RSA认证
PasswordAuthentication  密码认证
PAM authentication  PAM认证
GSSAPIAuthentication    GSSAPI认证

其中注释的都是默认使用注释的值,最常用的认证就是公钥认证密码认证,我们平时登录时要输入密码,就是用的密码认证,而免密码登录就是使用公钥认证了,其他的我也不太懂(好像也是可以免密登录),以后用到再说吧。

使用公钥认证方式实现免密登录

1、使用ssh-keygen生成RSA公钥/私钥对

首先你要检查一下你的~/.ssh目录下,有没有id_rsaid_rsa.pub两个文件,如果有,那就不用执行ssh-keygen了,因为你以前已经执行过了,id_rsa就是私钥,id_rsa.pub就是公钥。

如果没有这两个文件,那么执行下面命令,无论提示什么,你都闭着眼晴一路回车即可,最后会在~/.ssh目录下生成id_rsaid_rsa.pub两个文件。

ssh-keygen

如图所示(该命令也可以写成ssh-keygen -t rsa,如果不写,默认就是-t rsa,t表示type,即类型)
Xnip2018-11-04_00-43-06.png

ssh-keygen输出的内容翻译:

Generating public/private rsa key pair.
翻译:正在生成rsa公/私密钥对
Enter file in which to save the key (/Users/bruce/.ssh/id_rsa):
翻译:输入你要保存的密钥文件名(直接回车表示使用默认文件名`/Users/bruce/.ssh/id_rsa`)
Enter passphrase (empty for no passphrase):
翻译:输入密码(如果不输入则默认为空,公钥认证方式还可以再加一层密码,这样更安全,但是一般没必要)
Enter same passphrase again:
翻译:再次输入密码(还是直接回车表示使用空密码)
Your identification has been saved in /Users/bruce/.ssh/id_rsa.
翻译:你的私钥已经保存到`/Users/bruce/.ssh/id_rsa`文件中
Your public key has been saved in /Users/bruce/.ssh/id_rsa.pub.
翻译:你的公钥已经保存到`/Users/bruce/.ssh/id_rsa.pub`文件中(注意,公钥文件名都是在私钥文件名后面加上`.pub`,pub表示public,公共的)
The key fingerprint is:
翻译:密钥指纹是:
SHA256:IPOJPYk+xqkqn11pCX8Jn/WVHjIUqf5wjevNxLliL3Q [email protected]

2、使用ssh-copy-id把公钥拷贝到服务器中

使用ssh-copy-id命令,把上一步中生成的公钥拷贝到需要免密登录的服务器中,一个公钥可以多个服务器使用,所以你需要免密登录的服务器都可以往那拷(记得把 [email protected] 换成你的服务器的账号密码哦)。

ssh-copy-id [email protected]

这一步会把你用户目录中的id_rsa.pub拷贝到服务器中的~/.ssh/authorized_keys文件中(这个文件默认是不存在的,会自动创建)。

事实上,你也可以用其他方法(如scp、sftp等)把公钥文件传到服务器后,自己新建~/.ssh/authorized_keys文件,并把公钥文件中的内容复制到该文件中,但需要注意~/.ssh/authorized_keys文件的权限必须为600,且~/.ssh目录的权限为700,这是Linux为了安全而规定的,如果这两个权限有一个不对,则公钥认证会失败,但由于~/.ssh目录默认就存在,所以它的权限无需你去设置,默认就是700,而用ssh-copy-id命令往服务器传公钥自动生成的~/.ssh/authorized_keys的权限自动就是600,所以也无需你去修改,所以只有你自己新建的才需要修改。

这一步操作完成后,你可以去服务器的~/.ssh目录下看,是不是多了一个authorized_keys,如果有多个用户想用公钥认证方式登录这台服务器,同样,只要把它们的公钥放到authorized_keys文件中即可,一个公钥占一行(如果你用vi/vim查看是多行,那是因为软换行,实际上还是一行,显示行号即可看出来)。

如果是你管理着这台服务器,很明显其他人想要用公钥认证的方式登录,必须把它们的公钥交给你,你来放到这台服务器的authorized_keys文件中,但是因为传是其他人的公钥,所以你用ssh-copy-id命令的时候,就需要用-i来指定公钥文件的路径,否则还是会默认拷贝你自己电脑上的~/.ssh/id_rsa.pub文件上去,当然上面也说了,你可以自己传文件上去,自己添加到authorized_keys文件中,添加的方式也不用vim编辑,这样容易出错,直接用cat+>>输出重定向符即可把新的公钥添加到authorized_keys文件中。
Xnip2018-11-04_01-05-24.png

3、试试免密登录是否正常

如果正常的话,会直接进入登录用户的家目录(记得把 [email protected] 换成你自己服务器的账号密码哦)

ssh [email protected]

4、解决SSH连接自动断开的问题

编辑sshd的配置文件/etc/ssh/sshd_config,把ClientAliveInterval改成60,这样每隔60秒服务器会跟客户端通讯一次,然后客户端会回复,这样就不会断,把ClientAliveCountMax修改成3,表示如果3次(3*60=180秒)以后还是没有人操作客户端,那就自动断开(毕竟不能长时间开着,这样不安全):

ClientAliveInterval 60
ClientAliveCountMax 3

或者还可以在客户端(就是你自己的电脑上),编译vim ~/.ssh/config,在里面添加:

ServerAliveInterval 60

表示每60秒与服务器通信一次,这样就不会断开,这个比较厉害一点,因为我是mac,晚上睡眠了都没断开,所以如果没必要,还是别用这个了,毕竟一直开着不是太安全。

此外,客户端还可以设置当空闲时,每隔一定时间自动往服务器发送一个任意字符(默认是0),比如我用的iTerm2就可以这样设置:
Xnip2018-11-07_16-20-57.png

奇怪的是,以前用密码登录的时候,只需要客户端这样设置即可,但换成了公钥认证免密码登录,客户端这个不灵了,所以才需要在服务器修改配置。

5、公钥认证免密登录原理

假设你想用自己的电脑A去登录服务器B(以下是自己网上查找并加上个人理解,如有不对恳请大佬指出!)

  • 1)A向B发送一个连接请求,信息包括自己的用户名,ip等;
  • 2)然后B得到A信息后,去.ssh下的authorized_keys文件中查找,如果有该用户的用户名和主机名,B会随机生成一个字符串STR;
  • 3)然后B利用A的公钥对字符串STR进行加密,然后发送给A,A得到B发过来的消息用自己的私钥进行解密,然后将解密后的字符串用自己私钥签名后发送给B;
  • 4)B接收到A发过来解密的字符串并用公钥验签,验签通过说明A发过来的数据中途未被篡改,然后比较STR是否跟刚才发过去的一致,如果一致就会允许免登陆(此时命令行界面将跳转到登录服务器后的界面)。

其他免密登录方式

可以使用expect工具,自己写一个脚本,来样模拟用户的输入,本质上还是要密码,只不过expect工具可以自动发送密码,所以你也不需要手动输入,可参考:Linux使用expect实现免手工密码输入

打赏

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Linux-使用ssh免密码登录