ssh 非对称加密
ssh服务端的配置文件目录
bash
复制代码
在/etc/ssh
ll /etc/ssh目录下有三对非对称的公钥和私钥
第一对:
-rw-r-----. 1 root ssh_keys 480 5月 9 19:33 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 5月 9 19:33 ssh_host_ecdsa_key.pub
第二对
-rw-r-----. 1 root ssh_keys 387 5月 9 19:33 ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 5月 9 19:33 ssh_host_ed25519_key.pub
第三对
-rw-r-----. 1 root ssh_keys 2578 5月 9 19:33 ssh_host_rsa_key
-rw-r--r--. 1 root root 554 5月 9 19:33 ssh_host_rsa_key.pub
服务端有这么多对公私钥,是为了适配不同的客户端链接所准备的
目录下的 sshd_config 是ssh服务端的配置文件
ssh_config 是ssh 客户端的配置文件
Linux一般是自带ssh 客户端以及服务器端的。Windows啥都不带
Linux服务器至少要有一对公私钥,ssh才能链接。
# 在服务端通过查看私钥生成的秘钥值,当客户端链接服务器端的时候,就可以凭借这个秘钥值来确定客户端链接的服务端就是可信任的。而不是被黑客所篡改的服务器Ip地址。
[root@SSHServer ~]# ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key
256 SHA256:0yrLcZOy3R0VfHEiClKUjfZvEMrImQChS1rJunoRBU8 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)
bash
复制代码
当你通过秘钥对链接后,会在客户端的家目录~/.ssh/下出现一个kown_hosts文件
[root@SSHCilent ~]# ll ~/.ssh/
总用量 4
-rw-r--r--. 1 root root 177 8月 1 19:23 known_hosts
这个文件就是公钥
这个就是你拿到的服务器端分配给客户端所使用的加密私钥的公钥。
bash
复制代码
在生产环境可能会有多态servers,我们难免每次都需要指纹认证,所以,可以使用一个参数不再指定指纹登录。
# 假设此时我们删掉 这个known_hosts文件,那么如之前所理解,当我们ssh的时候,还是得需要输入yes,
但是当我们加上 -o StrictHostKeyChecking=no 参数后,就不需要输入指纹验证了,客户端默认完全信任服务器端,这个在生产环境中
用的很多。
但是这并不意味着,客户端没有公钥了,你再去ssh目录下看,还是会看到kown_hosts文件,里面还是有服务器端发过来的公钥。
[root@SSHCilent ~]# rm -rf ~/.ssh/known_hosts
[root@SSHCilent ~]# ssh -o StrictHostKeyChecking=no 192.168.190.135
Warning: Permanently added '192.168.190.135' (ECDSA) to the list of known hosts.
root@192.168.190.135's password:
bash
复制代码
当然,虽然不用输入yes了。但是还是需要输入密码,这就涉及到了客户端免密登录
ssh实现免密登录
bash
复制代码
1. 首先,服务器端的ssh的服务器配置文件里有#PubkeyAuthentication yes 参数,默认是需要公钥认证的,
我们可以不适用密码认证,来直接使用公钥认证的方式就可以实现免密登录,
当我们将yes 改为No的时候,就说明我们实现了客户端到服务器端的免密登录
基于公钥的认证方式
bash
复制代码
# 免密登录只是基于公钥认证的一个附带属性,基于公钥方式的认证方式更安全
1.首先要将客户端的公钥上传到服务器
1.1 在客户端上通过ssh-keygen命令生成非对称加密秘钥
[root@SSHCilent ~]# ssh-keygen
Generating public/private rsa key pair.
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:iCDvofEJmCSIkeXll4or5YEoXR/60XIsk9/YBUNl6ns root@SSHCilent
The key's randomart image is:
+---[RSA 3072]----+
|.o. . ..o |
|+o o . . o |
|=.o o + + |
|=* + * * . o |
|O B + O S . . |
|.O = . B + o |
|o * . o + E |
| . . |
| |
+----[SHA256]-----+
[root@SSHCilent ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
2.客户端访问服务器端的时候,采用基于公钥的认证方式就可以了
2.1 上传公钥到服务器,(上传到哪里呢?服务器的ssh配置文件里有指定路径)
AuthorizedKeysFile .ssh/authorized_keys
上面这个参数就指定了客户端的公钥存放在服务器端的位置
[root@SSHServer ~]# pwd
/root
[root@SSHServer ~]# mkdir .ssh
[root@SSHServer ~]# cd .ssh/
[root@SSHServer .ssh]# touch authorized_keys
[root@SSHServer .ssh]# ls
authorized_keys
# 将客户端的秘钥传上去。
[root@SSHCilent .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD049kl6fFMRUGhXtlFIeNP1FXsJitAWuEOw5bNBRnCDAhkTr+OTbzcMEvc1fXDV3OIfKEQ2rS/Hmbd2XBsJV6Aw+k3lyIm0HBDvi6b2vHVrb0tFrpJcCtVr7lcKnkW0wu/9tkFht6rsHt35YDRUFQBQYmNu3IGB9FIgPCi74yuyvT1r+QrXK7PlmEL1NQEYLVL1dcO02OCv9CRmqzIfDokYMnPvjkYva64smh3HqlzS9FCEn9vnODiOG6HAy7WqXb4bg5+VOaoy2yngZUQoN+uA4iZRYtA5XEyZ4hBt1DFfqe7+ikF7r9ghJRWaH2/y262LzZEi7H/XF3tT0KRgTzTyJmc8KkLPxUqVRFv7Px2mep9OueamVdGi/wYwGD0Nec1fO7vp1wmBmIMBc+cchHpimsdQmpsC5npX0xOfEt/moVOBbeSqtI0ZlR49Lbj+21O7TFPGXjVeIm0xecM1fKUOv4ilJeoKmaXM4WyRxs+UIzuBkd61WBllh0xoLphXd0= root@SSHCilent
怎么传:
1.直接复制粘贴到服务端的authorized_keys文件里(很原始,不建议这样做)
2. 利用ssh-copy-id 上传(推荐)
[root@SSHCilent .ssh]# ssh-copy-id admin@192.168.190.135
此时再次ssh 登录,即可实现免密登录
[root@SSHCilent .ssh]# ssh admin@192.168.190.135 # 这里会输入一次密码,即admin的密码即可
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Aug 1 19:19:19 2024
[admin@SSHServer ~]$
# ssh可以远程执行命令
[root@SSHCilent .ssh]# ssh admin@192.168.190.135 pwd
/home/admin
[root@SSHCilent .ssh]# ssh admin@192.168.190.135 ls
ssh实用工具
bash
复制代码
scp命令
# 1.在客户端创建一个test 文件,将test文件上传到服务端
# : 冒号分割路径
[root@SSHCilent ~]# scp test root@192.168.190.135:~
test 100% 0 0.0KB/s 00:00
# 在服务器端可以看到上传上去了
[root@SSHServer ~]# ll
总用量 16
-rw-r--r--. 1 root root 0 8月 1 22:58 test
# 2. 也可以将服务端的文件下发到客户端
在服务器端家目录创建一个test1测试文件
然后再客户端执行scp 命令
[root@SSHCilent ~]# scp root@192.168.190.135:/root/test1 .
test1 100% 0 0.0KB/s 00:00
[root@SSHCilent ~]# ll
-rw-r--r--. 1 root root 0 8月 1 23:02 test1