赞
踩
这种加密方式是大家都知道的,发送方和接收方都是一样的。
加解密的钥匙都是同一把,怎么样安全的保存这个密钥,这个密钥在需要加密的机器之前都是共享?很难保证这个密钥不被泄漏。
生成一对公私钥,私钥自己保管,公钥可以给其他人。
公私钥对是成对存在的,这连个密钥互不相同,两个密钥可以互相加密和解密。
一个用于加密,一个用于解密。具体哪个为私钥,哪个为公钥就看使用者自己管理。
注意:
①使用公钥进行加密,私钥解密,基本用于数据加密(相当于一对钥匙,对公钥加密,私钥需要对公钥解密)(解密时一个人知道)
使用私钥加密公钥解密:用于数据认证(验证)解密时多个人知道,数据安全性不高。
ssh都是基于公钥加密。
公私钥都是客户端生成,要连接服务器,就要把公钥给服务器,就能免密登录。存放在家目录下面的.ssh下,没有的话需要自己进行创建。
密钥认证:公钥和私钥是一对文件,文件里面是一段字符串,告诉加密算法加密的时候,使用的参数:salt 盐值
public key 公开
private key 私有的
- [root@nginx-kafka01 ssh]# cd ~/.ssh
- [root@nginx-kafka01 .ssh]# ls
- authorized_keys config id_rsa id_rsa.pub known_hosts
- [root@nginx-kafka01 .ssh]# pwd
- /root/.ssh
know_hosts是存放客户机使用ssh第一次连接服务器时产生公钥存放的位置,它会将服务器上sshd守护进程的公钥复制到本地存放到本地,每行存放一台服务器的公钥,用来验证服务器的身份。如果出现多个用户登录冲突的话,可以将该文件删除。然后重新进行连接,就会重新生成这个文件。存放一个ip地址的公钥(当默认yes时会写入)保存在本地,可以有多个(有授权的情况下),没有授权就只有一个,第一次手动输入yes就可以保存,第二次发送的时候会对比是不是一样的,不一样的话就直接挂掉中间人。
1、密码登陆
2、密钥登陆(免密码登录)
密码登录认证原理:
client客户机向server发送登录请求,server服务器将自己的公钥发送给client(客户机)。
client使用这个公钥,将公钥进行加密,然后再发送给server。
server用私钥解密登录密码,验证合法性。
server返回验证结果为client。
这个流程中存有的一个问题,怎么保证收到的公钥就是目标server的公钥?
密码登录时需要注意:中间人攻击,所以如果一个攻击者中途拦截了client的登录请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息之后,用自己的私钥就可以进行解密了,这就窃取了client的登录信息了。
为了解决这个问题,client端第一次登录的时候,会进行一个登录公钥确认。
如果服务器重启了,就会删掉know_hosts:rm -rf know_hosts
查看公钥指纹:
ssh-keygen-if /etc/ssh/ssh_host_rsa_key.pub
server主机的pubkey保存在/etc/ssh目录下,默认使用ssh_host_ecdsa_key.pub
- [root@mysql-rpm ssh]# cd /etc/ssh
- [root@mysql-rpm ssh]# ls
- moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
- ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
公钥认证流程中,为什么要进行免密码登录:为了能对被连接的机器进行批量化处理。
登录原理详解:
client端生成秘钥对,将公钥追加在server端的~/.ssh/authorized_keys
客户端发送登陆请求,server收到请求之后,生成随机字符串发送给client
client用自己的私钥对字符串进行加密,发送给server。
server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串事发后一致。
返回结果给client(一致就允许登录,不一致就不允许)。
确认server服务端这个host主机摘要,确认成功之后(yes)就会将server端的pubkey保存在
~/.ssh/known_hosts里面,以后每次连接都会验证这个know_host里的key和收到的pubkey是否保持一致的。
使用公钥认证,免密码登录这种方式:windows连接到Linux,Linux连接到Linux上都是适用的。
ssh的公钥认证流程图:
首先需要准备两台机器:
A : 192.168.2.152 客户机
B:192.168.2.132 服务机
A机器的root用户 -》连接到B机器的root用户
密钥:公钥和私钥是一对文件,文件里面是一段字符串,告诉加密算法加密的时候,使用的参数。
public key 公开
private key 自己
1、在A客户机机器上生成密钥对
在192.168.2.152上使用root用户生成秘钥对,客户机的公钥会存放在用户的家目录下的.ssh/文件下的authorized_keys(/root/.ssh/authorized_keys)。
ssh-keygen:是生成公钥和私钥对的命令。
- #生成公钥,中间一直敲回车
- [root@nginx-kafka01 ssh]# ssh-keygen -t rsa
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa): y
- y already exists.
- Overwrite (y/n)? y
- Enter passphrase (empty for no passphrase): 敲回车
- Enter same passphrase again: 敲回车
- Your identification has been saved in y.
- Your public key has been saved in y.pub.
- The key fingerprint is:
- SHA256:lkDtYmNyA9pV93YhNzv+M0VWgIgXVbANDZgDOF5jDCM root@nginx-kafka01
- The key's randomart image is:
- +---[RSA 2048]----+
- | E +*ooo****..|
- | .o+.B.*..*.+.|
- | o +.= o .+ = o|
- | . o O... . o + |
- | = +S . .|
- | . ..|
- | o.|
- | o|
- | |
- +----[SHA256]-----+
进入用户的家目录下(cd /root/.ssh)
查看公钥:cat id_rsa.pub:
- [root@nginx-kafka01 .ssh]# ls
- authorized_keys config id_rsa (私钥) id_rsa.pub (公钥) known_hosts
-
- 查看公钥
- [root@nginx-kafka01 .ssh]# cat id_rsa.pub
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTWqYxhTLaNCHIoF3NxrarhuDr9BQ5V48DkTFMuqQbTtJoQvtRyN7Ly9Fxq18BfNsm5U17RT+xAi1+ojVj2ZSCiIUlzaH3gR1JjpLzG54JjUq6TWSibLsYfvvkVCWYxXF584Ke8Bs7CBQZz3g9fnfi6KHoPvSXlNtrkldAwFgmG7uHqjRVsu6EGPKWqcrrDxdrZnIxvuF52Q/erPHew7aAqaAgWzsIl18AYTgiYmaafqdQ8ZteO+atfdRCw1/QczmoSeYAeNofPk98oW19uSDib/7D5BUVfpb0WjnmtrMpYkSpNQbATY6fOHn1ONvqCYhxi776ivziUxgAhUxd8ctf root@localhost.localdomain
信用关系:
双向信任
单向信任
2、上传公钥到对方的服务器(B服务机器上)
将公钥上传到对方,要求对方的服务器运行时使用root用户登录。公钥的最后一行有指明需要服务器使用本机机器的root用户来登录:root@localhost.localdomain
如果想要单向通信通道:就直接在A机器上执行这条命令,那么它连接B机器就不需要密码登录。
双向通道:在两个机器上都执行这条命令,B机器上也执行这条命令,但是ip要改为A机器的(ssh-copy-id -p 22 -i id_rsa.pub root@192.168.2.152),登录双方机器的时候都不需要输入密码,方便进行各种操作(执行对方机器上的文件等)。
ssh-copy-id 复制 -i:指定端口文件 -p:port 指定端口号
- [root@nginx-kafka01 .ssh]# ssh-copy-id -p 22 -i id_rsa.pub root@192.168.2.132
- /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
- /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
- /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
- #首先在这里第一次上传公钥的时候是需要输入对方机器的密码,后面执行的时候就不需要输入了
- root@192.168.2.132's password:
- Number of key(s) added: 1
- Now try logging into the machine, with: "ssh -p '22' 'root@192.168.2.132'"
- and check to make sure that only the key(s) you wanted were added
3、验证登录是否需要密码
在这里执行登录B服务机的时候就不需要输入密码了。
- [root@nginx-kafka01 .ssh]# ssh -p '22' 'root@192.168.2.132'
- Last login: Wed Jul 27 17:00:06 2022 from 192.168.2.118
此时会在对方的机器上生成一个文件authorized_key;里面存放的是对方的公钥,存放用来进行合法身份验证。证明是Linux。
- root@nginx-kafka02 .ssh]# ls
- authorized_keys known_hosts
公钥和私钥是成对存在的,这两个密钥互不相同,两个密钥可以互相加密和解密。
不能根据一个密钥而推算出另外一个密钥。
公钥对外公开,私钥只有私钥的持有者才知道。
私钥应该由密钥持有者进行妥善保管
根据实现的功能不同,可以分为数据加密和数字签名。
1、确保公钥正确
2、确保~/.ssh/文件权限为600
3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限
ssh 192.168.119.137 -l sc -p 22 其中的 -l :指定用户名 ,-p:指定端口。
需要注意的是:登录是会默认会去寻找家目录下的~/.ssh/id_rsa去进行验证,所以尽量不要在生成key 的时候将它的默认路径更改。
当前客户机上的sc用户将生成的公钥放到服务器机上的家目录下,放在~/.ssh/know_hosts文件中
ssh命令登录:
-l:指定登录的用户名
-p:指定server的端口
-i:指定私钥文件,默认会在~/.ssh/去找私钥
-o:接特定设置选项
不接用户名的话,当前是什么用户,就会登录到对方的什么用户,比如当前是root用户,如果不指定的话,就会登录到对方的root用户。
无需输入yes,自动保存hostkey:
ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。