一.本文环境
CentOS 8
公钥加密,私钥签名是非常常见的安全方式。基本三种生成密钥对的方式。
公钥交换的原理图
1.客户端发起连接请求
2.服务端返回给客户端自己的公钥,以及一个会话ID
3.客户端用自己的公钥异或会话ID,计算一个res值,并将服务器的公钥加密
4.服务器使用自己的私钥解密,得到res值,并用res值异或会话ID计算,从而得到客户端的公钥
5.双方完成公钥交换。之后的所有通讯都会被加密。
二.生成密钥对
1.使用 gpg 生成密钥对
1 [root@CentOS-8-LinuxIV ~]# gpg --gen-key
输入此命令后,会出现一些需要你输入的信息,如邮箱,名字,对密钥的保护密码等信息。
完成之后会在家目录中有一个.gnupg/的目录,其中公钥私钥还有配置都在此目录中。
由于gpg生成的公钥是二进制的不能直接查看,因此我们需要使用ascii导出来。
gpg --export -a -o pub.key
这样生成的文件就可以直接查看了
2 使用openssl生成密钥对
openssl生成的私钥可以直接查看,需要借助私钥生成公钥,简单快捷
1 [root@CentOS-8-LinuxIV .gnupg]# openssl genrsa -out file.key 2 Generating RSA private key, 2048 bit long modulus (2 primes) 3 .........................................................................................................................+++++
4 ...........+++++
5 e is 65537 (0x010001)
接下来使用私钥生成私钥
[root@CentOS-8-LinuxIV .gnupg]# openssl rsa -in file.key -pubout -out file.key.pub
writing RSA key
查看公钥
1 [root@CentOS-8-LinuxIV .gnupg]# cat file.key.pub 2 -----BEGIN PUBLIC KEY-----
3 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0GPV7g2KwLCcRnfQmhk6 4 q5MqKq3t5HzD6pYSSzbNmhinalSSjRPUiyX0jDQvrJpARhFw7PGFHCUXfyagM7A6 5 Z9emM0M4tPLZCx01Cswm0A2pCkQAlfFhZi+PGvD+HJ1DfxKZ4j78TbthAPxr1XOd 6 Ro6Qhyjw7L/g7KlrygHZZOBxXbveheMueLnWJN4Zmw8wACGvSzuFgkvbIib6SYlf 7 aLbON8shsFalK4RPRFiykiTx+PncbT8Eu/2MMs5dHVPiq9GWDh5vwClWiWmk9Tyc 8 OLTPYwf6TJAZ0LyUMJIjasvrgpWs1h+jo9puy5bbgBCp/arPi24a/9M0kGibpc4o 9 hQIDAQAB 10 -----END PUBLIC KEY-----
3 使用ssh生成密钥对
1 [root@CentOS-8-LinuxIV script39]# ssh-keygen 2 Generating public/private rsa key pair. 3 Enter file in which to save the key (/root/.ssh/id_rsa): 4 Enter passphrase (empty for no passphrase): 5 Enter same passphrase again: 6 Your identification has been saved in /root/.ssh/id_rsa. 7 Your public key has been saved in /root/.ssh/id_rsa.pub. 8 The key fingerprint is: 9 SHA256:6oA+lLQqwc6e7leucpILW+YtZ3v6SOsF0zpt8AOQeOU root@CentOS-8-LinuxIV 10 The key's randomart image is:
11 +---[RSA 2048]----+
12 | . |
13 | . + |
14 |. + E |
15 | ... . |
16 |.. o= . S |
17 |..+. X . |
18 |++= B B |
19 |+%+=oX.. |
20 |**OBO=o |
21 +----[SHA256]-----+
22 [root@CentOS-8-LinuxIV script39]#
使用ssh-keygen生成的密钥文件会在家目录的.ssh文件夹。进入此文件夹
1 [root@CentOS-8-LinuxIV .ssh]# ls 2 id_rsa id_rsa.pub known_hosts 3 [root@CentOS-8-LinuxIV .ssh]#
三.使用key登录验证
1.首先在客户端生成一对密钥
2.将生成公钥拷贝到服务器端
3.当客户端发起请求时,服务器端会在相对应的家目录中uthorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串
4.服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
5.得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
6.服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
操作时间key登录
使用ssh-copy-id 192.168.55.6
1 [root@CentOS-8-LinuxIV .ssh]# ssh-copy-id 192.168.55.6 2 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" 3 The authenticity of host '192.168.55.6 (192.168.55.6)' can't be established. 4 RSA key fingerprint is SHA256:4AeVnKTLZZgRG1j4uDeLUlG8TItb44VrcwUQW8SYsKU. 5 Are you sure you want to continue connecting (yes/no)? yes 6 /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed 7 /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 8 root@192.168.55.6's password: 9 10 Number of key(s) added: 1 11 12 Now try logging into the machine, with: "ssh '192.168.55.6'" 13 and check to make sure that only the key(s) you wanted were added. 14 ------------------------------------------------------------------------- 15 [root@CentOS-8-LinuxIV .ssh]# ssh 192.168.55.6 16 Last login: Sat Nov 9 11:55:02 2019 from 192.168.55.25
如上使用ssh-copy-id 到目标服务器,第一次需要密码,并在目标家目录中(默认root用户,可以使用其他用户user@192.168.55.6),创建。ssh/authorized_keys. 里面存放192.168.55.25的公钥。所有第15行,再次连接时不需要密码了。
四 总结
基于key登录的方法还有很多,比如使用key登录还可以加密码 使用key的密码。每次使用KEY都需要密码,但是每次需要密码不又回到需要密码的原点了吗?其实是不一样的。这个是key的密码而不是其他主机的密码。意义不同。
key的密码可以使用代理,就不用每次输入key的密码,但是退出终端代理就失效。
使用key的代理
1 [root@CentOS-8-LinuxIV ~]# ssh-agent bash 2 [root@CentOS-8-LinuxIV ~]# ssh-a 3 ssh-add ssh-agent 4 [root@CentOS-8-LinuxIV ~]# ssh-add 5 Enter passphrase for /root/.ssh/id_rsa: 6 Identity added: /root/.ssh/id_rsa (root@CentOS-8-LinuxIV) 7 [root@CentOS-8-LinuxIV ~]# ssh 192.168.39.6 8 Last login: Sat Nov 9 18:26:58 2019 from 192.168.39.3 9 [root@CentOS-6 ~]$