密钥SSH免密登录(详解)

前言

RSA公钥加密算法

在进入正题之前,我们先了解一下"RSA公钥加密算法"的历史

RSA公钥加密算法作为目前地球上最重要的加密算法,已经完全渗透到了互联网的每一个角落,在1976年以前所有的加密方法都是同一个模式(对称加密):

1. A方选择某一种加密规则(算法),对信息加密
2. B方使用同一种规则,对信息进行解密

​ 由于加密和解密使用同样的规则(简称:密钥),这被称为"对称加密算法(Symmetric-key algorithm)。"

​ 这种加密模式有一个最大问题:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。

​ 1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。

​ 这种新的加密模式被称为"非对称加密算法":

1. 乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
2. 甲方获取乙方的公钥,然后用它对信息加密。
3. 乙方得到加密后的信息,用私钥解密。

如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

​ 1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。

​ 这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。

SSH免密登录配置

​ 首先,说明一下我们要做的是,A服务器的userA用户免密码登录B服务器的root用户。

1、客户端(本机)生成公私钥
# 切换为userA用户
[root@A ~]# su - userA 
# 生成rsa加密算法的公私密钥对
[userA@A ~]# ssh-keygen -t rsa
# 正在生成rsa算法的公私钥对
Generating public/private rsa key pair.
# 未使用-f指定生成文件名时将提示,请输入密钥文件名及存储路径,回车即默认
Enter file in which to save the key (/root/.ssh/id_rsa): 
# 请输入密钥的密码短语,回车即默认为空
Enter passphrase (empty for no passphrase): 
# 重复输入以确认密码短语
Enter same passphrase again: 
# 私钥保存位置
Your identification has been saved in /root/.ssh/id_rsa.
# 公钥保存位置
Your public key has been saved in /root/.ssh/id_rsa.pub.
# 密钥指纹(自动生成)
The key fingerprint is:
SHA256:+VrggUfr70KWpXyXeqwNl10QIsVlwhRVa67Y8W8N9+U root@centos
# 密钥随即图像,RSA密钥长度2048位(自动生成)
The key's randomart image is:
+---[RSA 2048]----+
|          .=*+=..|
|           .o+ ..|
|        .     .o |
|       o o.   o. |
|      ..S+   o ..|
|       +*+. =o=.o|
|       oo.+=oo.=+|
|        .+.+o   E|
|        .o+o.  ..|
+----[SHA256]-----+
# 命令参数
-C:添加备注("youremail@example.com"),其注释会在公钥中明文显示;默认为"用户名@主机名"
-f:指定用来保存密钥的文件名;默认根据算法名生成,如:"id_rsa  id_rsa.pub"
-t:指定要创建的密钥类型,常见加密算法"[-t dsa | ecdsa | ed25519 | rsa | rsa1]"。
-b:指定密钥长度(默认长度2048);
-e:读取openssh的私钥或者公钥文件;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
[userA@A ~]# ls ~/.ssh/
id_rsa  id_rsa.pub
  • id_rsa :私钥
  • id_rsa.pub :公钥
2、上传公钥至需要免密登录客户端服务器
方法一:

使用命令ssh-copy-id 将公钥写到需要免密登录服务器~/ .ssh/authorized_key文件中。

# 如果公钥在默认路径'~/.ssh'下,则不需要'-i'参数;这里可以使用/etc/hosts文件中ip对应的域名;
[userA@A ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub userB@192.168.235.22
# INFO:要安装的密钥文件:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.215.89 (192.168.215.89)' can't be established.
ECDSA key fingerprint is SHA256:2+IsVxKigOS+up9nuJRL7I7d+FHIlssq+wHhwQcfUWI.
# 指纹不一致,确定要继续连接?
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
# 输入需要远程登录服务器用户的密码
root@192.168.215.89's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.215.89'"
# 检查确保已经添加了authorized_keys密钥文件

and check to make sure that only the key(s) you wanted were added.

把公钥写入到需要登录的服务器后,再次查看该目录~/.ssh/目录,

[userA@A ~]# cd ~/.ssh/
[userA@A .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

此时发现多出一个known_hosts1文件,查看该文件内容

[userA@A .ssh]# cat known_hosts 
192.168.215.89 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBECAF3H1aWLuBUQ7DyPmuoZbUI9+yzJw/Eb3H5y8Rc6zjCFGxwzenzvX+L/fNJhwC1uVP+T0HYpGILGWv6SfZJM=
# 文件内容分为:[免密登录服务器地址] [未知密钥头] [hostKey密钥]

注意:

  1. known_hosts是对服务器认证的,当你用ssh连接到一个新的服务器的时候,ssh会让你确认服务器的信息(域名、IP、公钥),如果你确认了,就会写到known_hosts里。
  2. 如果以后你再连接到这个服务器时,但是信息改变了(通常是公钥改变了),就会提示你服务器信息改变了,你可以把它从known_hosts里删除,然后重新确认。
  3. 即使删除或没有该文件也可以免密登录,只是多出了一步确认连接操作,再次登录后会再次生成。

登录B服务器对应用户目录下~/.ssh,查看authorized_keys文件。

[userB@B ~]# cd ~/.ssh/
[userB@B .ssh]# ls
authorized_keys
# 查看写入公钥内容
[userB@B .ssh]# cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDPQyvtW6dez20q+f0mEgPiFTYQZp31BVKUyxbGtd6y2AzVpaUhBLwKadI4OjPoICYlPjCSueVf7hUBkM35iTWzwWhj+uGslGc7m93DxNeP/43sHnYyQUnwCpJ6GXM886j5Y1eD6Kf/mcg1Uenhkr8OLV1HNzPEQCS9nKqQCpo/BAu4ZxymbqZRG06uuvrQuJK5+ejMH6fzn9an8RP+S3laJSr1slFnuRG9jlbHyRnJqNlwqhVJeeHKLzCmwq+q2mbo0UJ2KQwgOU70Gap9eGs9SA1dwP4kPFDKlqlx9mgzF3RuRbgCuMoAQws5nPbcyIOzylLYVGyaJt14UY1hnbqgCG6clp6KN0UF+J/H7cJz/TM3RyxAVts4P2lvcwDwH0menpKMvhfctiuvsVB56lzCImfYFUNGMpDm7msrNpDp3svUxx2ldCm7xLvYx9I33S7WG6DOsGlVF66HlPYwnruQk4xHTlGVJ/n0nps0YGMPltnD8xz6v/dHlo4UpLuvjeU= userA@A
# `authorized_keys`文件内容即是A服务器上生成的公钥内容(所以直接拷贝过来也行),
# 分为: [加密算法名] [公钥密钥] [备注(不使用-C参数指定则为`用户名@服务器名`)]

如果多台客户端服务器需要免密登录,只需要将公钥内容回车追加到authorized_keys此文件中即可。ssh-copy-id命令也会自动追加。

# 命令参数
-i:指定公钥文件;默认'~/.ssh/id_rsa.pub'
-p:指定自定义端口;
方法二:

依据上述方法执行的结果,这里可以手动实现上述操作。

# 此处使用root用户进行的演示
# 使用SCP命令把公钥写入需要免密登录的服务器`~/.ssh`目录下,
[root@Centos ~]# scp ~/.ssh/id_rsa.pub root@192.168.215.89:/root/.ssh 
# 拷贝
[userB@B ~]# cd ~/.ssh/
[userB@B .ssh]# ls
id_rsa.pub
# 将此文件名改为`authorized_keys`即可
[userB@B .ssh]# mv id_rsa.pub authorized_keys
# 如果已存在正在使用的`authorized_keys`文件,只需要将公钥内容追加到`authorized_keys`中即可
3、测试免密登录
[userA@A ~]# ssh root@192.168.215.89
Last login: Wed Apr 28 11:11:38 2021 from 192.168.216.33
[userB@B ~]# 

常见问题

连接时报密钥认证不通过(Permission denied)

​ 这种情况最常见,一般会有三种原因引起:

​ 一是~/.ssh~/.ssh/authorized_keys的用户权限不够,

​ 二是authorized_keys的不能被正常访问,比如路径问题引起

SSH免密登录原理

  • 在客户端服务器A上为自己创建一对密钥,并把公钥放在需要免密登录的服务器B上。
  • 当你要连接到服务器B上时,客户端服务器A就会向服务器B请求使用密钥进行安全验证。
  • 服务器B收到请求之后,会在用户的home目录下寻找你的公钥。
  • 然后与你发送过来的公钥进行比较。
  • 如果两个密钥一致,服务器就用该公钥加密“质询”并把它发送给客户端服务器A。
  • 客户端收到“质询”之后用自己的私钥解密再把它发送给服务器。

总结

​ 就是将A服务器的公钥文件内容,写入到免密登录的服务器上的~/.ssh目录下authorized_keys文件中。


服务器A 服务器B SSH登录 返回公钥1(host key) 服务器A将公钥1存入known_hosts文件中 再次SSH登录 返回公钥2(host key) 1.OpenSSH核对公钥公钥1与公钥2 2.简单的验证后,公钥不同则OpenSSH会发出警告 (避免你受到DNS Hijack之类的攻击) 服务器A 服务器B

  1. A通过SSH首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。如上图: ↩︎

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值