使用ssh公钥实现免密码登录

1. SSH公钥登录原理

1.1 登录方式

在平时工作中我们经常要远程登录服务器,这就要用到SSH协议:

shell 复制代码
$ ssh user@host

主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录

1. 密码口令登录

通过密码进行登录,主要流程为:

1、客户端连接上服务器之后,服务器把自己的公钥传给客户端

2、客户端输入服务器密码通过公钥加密之后传给服务器

3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录

2. 公钥登录

公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:

1、客户端生成RSA公钥和私钥

2、客户端将自己的公钥存放到服务器

3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端

4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器

5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。

步骤如下:

shell 复制代码
# 两台机器最好都安装openssh-server / openssh-client
$ sudo apt install openssh-server
$ sudo apt install openssh-client

# 查看ssh服务是否开启
$ netstat -tlp | grep ssh 

# 在主机A上通过RSA算法生成密钥对
$ ssh-keygen -t rsa # 此时在~/.ssh文件夹中生成了两个文件 id_rsa(私钥)和id_rsa.pub(公钥)

# 上传公钥到主机B的~/.ssh/authorized_keys
$ ssh-copy-id username@hostB

#(以下为可选内容)
# 配置服务器别名文件
$ vim ~/.ssh/config

1.2 ~/.ssh/ 目录下各文件的作用

  • id_rsa(私钥)

    本机中通过RSA算法生成的私钥,与生成的公钥为一对。用于连接其他服务器

  • id_rsa.pub(公钥)

    本机中通过RSA算法生成的公钥,与生成的私钥为一对。用于连接其他服务器

  • authorized_keys(授权文件

    记录了其他主机用于连接本机服务器的公钥,如果主机A的公钥在本机的authorized_keys文件中,则主机A可免密登陆本机服务器

  • known_hosts

    记录了本机访问过的主机的公钥。下次访问对应主机时,OpenSSH会核对公钥,不同则发出警告,避免受到DNS Hijack之类的攻击

  • config(配置文件)

    非必需,一开始没有config文件。它记录了ssh一些配置信息(主机别名/主机名或IP/用户名/SSH端口/IdentityFile),如果未配置config文件,则ssh连接其他主机需要通过命令ssh username@hostB,配置后,可直接ssh host

1.3 对称加密和非对称加密

对称加密

对称加密:两边保存相同的秘钥 key

非对称加密

非对称加密:一个公钥对应一个私钥,两个是不同的。公钥可以公开,私钥必须保密。

使用公钥加密只有对应私钥才能解密,反之私钥加密,公钥才能解密

对称加密和非对称加密的优缺点

  • 对称加密: 运算速度快,但秘钥一旦泄露,消息就会破解。

  • 非对称加密:运算速度慢,私钥严格保密,黑客获取公钥无法破解密文。

2. ssh-keygen使用场景

ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。

有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。

首先以root账户登陆为例。

  1. 在A机下生成公钥/私钥对。
shell 复制代码
[root@A ~]# ssh-keygen -t rsa -P ''

-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。

该命令将在/root/.ssh目录下面产生一对密钥id_rsa和id_rsa.pub。

一般采用的ssh的rsa密钥:

id_rsa 私钥

id_rsa.pub 公钥

下述命令产生不同类型的密钥

shell 复制代码
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1
  1. 把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。
shell 复制代码
[root@A ~]# scp /root/.ssh/id_rsa.pub root@192.168.1.181:/root/.ssh/authorized_keys
root@192.168.1.181's password:
id_rsa.pub                                    100%  223     0.2KB/s   00:00

由于还没有免密码登录的,所以要输入一次B机的root密码。

  1. authorized_keys的权限要是600!!!
shell 复制代码
[root@B ~]# chmod 600 /root/.ssh/authorized_keys
  1. A机登录B机。
shell 复制代码
[root@A ~]# ssh -l root 192.168.1.181
The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
Last login: Thu Jul  3 09:53:18 2008 from root
[root@B ~]#

第一次登录是时要你输入yes。

现在A机可以无密码登录B机了。

小结:登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥/私钥对一般在私钥宿主机产生。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)

想让A,B机无密码互登录,那B机以上面同样的方式配置即可。

SSH-KeyGen 的用法

假设 A 为客户机器,B为目标机;

要达到的目的:

A机器ssh登录B机器无需输入密码;

加密方式选 rsa|dsa均可以,默认dsa

做法:

1、登录A机器

2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub

3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys

4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;

ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.

具体方法如下:

shell 复制代码
ssh-keygen -t rsa

然后全部回车,采用默认值.

这样生成了一对密钥,存放在用户目录的~/.ssh下。

将公钥考到对方机器的用户目录下,并拷到~/.ssh/authorized_keys中。

要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。(今天就是遇到这个问题,找了好久问题所在),其实仔细想想,这样做是为了不会出现系统漏洞。

相关推荐
志栋智能5 小时前
超自动化巡检剧本(Playbook):运维经验的数字化封装
运维·自动化
ElevenS_it1885 小时前
Nginx日志监控告警实战:access_log解析+5xx突增+慢请求+异常IP自动告警完整方案(Filebeat+Zabbix)
运维·网络·tcp/ip·nginx·zabbix
liulilittle5 小时前
Linux Swap 文件配置与持久化(虚拟内存)
linux·运维·服务器
未若君雅裁5 小时前
日志采集与ELK:从本地日志到集中检索分析
运维·elk·jenkins
零陵上将军_xdr6 小时前
从沙子到CPU——计算机硬件基础入门
linux·运维·硬件架构
vortex56 小时前
Linux 命令工具箱:util-linux 与 GNU Coreutils
linux·运维·gnu
AIex-YH6 小时前
三域贯通11/12:生物制造的“死亡之谷“,CDMO 是桥还是船?
运维·制造·策略模式
荒--6 小时前
MSF 使用
linux·运维·服务器
明航咨询-程老师6 小时前
信创运维困局:“救火队”模式走到尽头,平台工程如何重塑CISAW安全体系?
运维·安全·数据安全官,ccrc 认证,数据合规,职业发展规划
w3296362717 小时前
八、OpenCode 高阶玩法:CLI 自动化、CI/CD 集成与远程协作
运维·ci/cd·自动化·ai编程·开发工具·opencode