1. SSH公钥登录原理
1.1 登录方式
在平时工作中我们经常要远程登录服务器,这就要用到SSH协议:
$ ssh user@host
主要有两种登录方式:第一种为密码口令登录
,第二种为公钥登录
1. 密码口令登录
通过密码进行登录,主要流程为:
1、客户端连接上服务器之后,服务器把自己的公钥传给客户端
2、客户端输入服务器密码通过公钥加密之后传给服务器
3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录
2. 公钥登录
公钥登录是为了解决每次登录服务器都要输入密码的问题,流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
步骤如下:
# 两台机器最好都安装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账户登陆为例。
- 在A机下生成公钥/私钥对。
[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 公钥
下述命令产生不同类型的密钥
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1
- 把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。
[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密码。
- authorized_keys的权限要是600!!!
[root@B ~]# chmod 600 /root/.ssh/authorized_keys
- A机登录B机。
[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不用使用密码.
具体方法如下:
ssh-keygen -t rsa
然后全部回车,采用默认值.
这样生成了一对密钥,存放在用户目录的~/.ssh
下。
将公钥考到对方机器的用户目录下,并拷到~/.ssh/authorized_keys
中。
要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。(今天就是遇到这个问题,找了好久问题所在),其实仔细想想,这样做是为了不会出现系统漏洞。