生成密钥对的三种方式,用于key验证

一.本文环境

  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 ~]$

 

 

posted on 2019-11-10 15:31  林之森火  阅读(5765)  评论(0编辑  收藏  举报

导航