ssh服务采用“非对称密钥系统”:主要通过两把不一样的公钥和私钥来进行加密与解密的过程

公钥(Public Key):提供给远程主机进行数据加密

私钥(Private Key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。

 

基于密码认证:

原理:

1、Server建立公钥:每次启动sshd服务器,Server会主动查找自己的/etc/ssh/ssh_host*文件。因为这些文件就是Server建立起来的公钥和私钥,一般采用rsa加密方式

上传本地公钥到服务器 服务器公钥和私钥_上传本地公钥到服务器

 

.pub结尾的是公钥,key结尾的是私钥,公钥可以共享出去,私钥是server自己保留,一把公钥,使用唯一的一把私钥解密,所以私钥一定要有私密性。

2、Client端主动连接要求:若客户端要连接ssh服务器,这时候server要与client协商使用哪种密钥对

3、Server端会传输768bit公钥文件给客户端:server公钥需要server私钥解密,因此被截取了,如果没有得到server私钥解密,也是无法查看到内容的,所以公钥明文传输,这里公钥是建立ssh请求时,自动传输的,不需要手工传输

4、Client端记录/比对Server端的公钥,Client端第一次连接,会将server公钥记录在$HOME/.ssh/known_hosts文件中。若存在记录,则Client端会比对差异,同时Client端会根据Server公钥产生256bit的私钥

5、Client端利用Server发送过来的公钥,将验证的密码加密发送给Server,Server利用自己的私钥进行解密,同时验证密码是否正确(下图的code用户验证密码),验证通过就建立了连接,就可以数据传输了。

 

操作:(操作之前,第一点是保证server和client端的连通性)

Server端:

上传本地公钥到服务器 服务器公钥和私钥_配置文件_02

rpm -qa 查看sshd软件是否安装,CentOS上的ssh服务软件是openssh,一般server端是默认安装了sshd-server和ssh-client。

上传本地公钥到服务器 服务器公钥和私钥_配置文件_03

systemctl status sshd.service查看sshd服务是否启动?enable 表示开机自动启动sshd服务,active(running)表示sshd服务正在运行,pid为1028。安装完openssh-server后,可以通过systemctl start sshd.service来启动sshd服务

上传本地公钥到服务器 服务器公钥和私钥_Server_04

server端的ipv4地址为192.168.1.100

上传本地公钥到服务器 服务器公钥和私钥_客户端_05

vim /etc/ssh/sshd_config修改Port端口号为60001,PermitRootLogin为yes(这个是允许root通过ssh服务登录)sshd_config是sshd服务的server端配置文件

上传本地公钥到服务器 服务器公钥和私钥_客户端_06

修改完sshd_config配置文件之后,需要将sshd服务重新启动一下,同时关闭selinux防火墙和firewall防火墙,防止防火墙拦截60001端口连接

 

Client端:

上传本地公钥到服务器 服务器公钥和私钥_客户端_07

client查看是否存在openssh-client工具

上传本地公钥到服务器 服务器公钥和私钥_上传本地公钥到服务器_08

client的ip地址为192.168.1.101,同时ping server(192.168.1.100)是连通的

上传本地公钥到服务器 服务器公钥和私钥_上传本地公钥到服务器_09

正确的ssh连接格式: ssh username@ipaddress -p portnumber,username是ssh登录server端需要的用户名,如果缺省,则表示使用当前用户登录,如果这里使用的用户名server本地端和域中都没有,那么ssh是拒绝连接的。192.168.1.100是server端的ip地址, -p是端口号,默认是22端口(上面server的sshd_config文件Port 没有改过来,失误)

ssh root@192.168.1.100时,反馈can't be established,提示established,不允许建立连接。这里的不允许建立连接实际上是ssh应用层不允许建立连接,实质上tcp三次握手已经建立连接,但是应用层ssh不允许。

原因:ECDSA key fingerprint is SHA256:XXXXXXXXX。这里是提示我们之所以established是让我们核对server端的SHA256:xxxx。在这里我们需要验证sha256:xxx是否是我们需要连接的sshd server ?我们要验证该server就是我需要的server端,而不是被劫持的连接。那么怎么验证呢?需要在server端验证ecdsa私钥

上传本地公钥到服务器 服务器公钥和私钥_配置文件_10

在server端进入/etc/ssh/目录,使用ssh-keygen -lf 验证私钥ssh_host_ecdsa_key,可以看到SHA256:xxxx 与client反馈的SHA256是一致的,说明这就是我需要连接的server

server端会根据客户端的不同,协商使用哪种私钥验证。这里是使用ECDSA 也可以使用ED25549和RSA来验证,也可以自己写算法添加到配置文件中来验证,同时也不是仅仅只有一种SHA256验证方式,还有md5,sha512等等方式

下面使用windows 软件验证看看:

上传本地公钥到服务器 服务器公钥和私钥_Server_11

上传本地公钥到服务器 服务器公钥和私钥_Server_12

上传本地公钥到服务器 服务器公钥和私钥_配置文件_13

可以看到最后一个rsa私钥对接上了,Windows端就是使用了rsa私钥验证,同时使用md5校验出来的

核对过SHA256,确定连接的是自己的server后,最后回复yes,确定建立连接

上传本地公钥到服务器 服务器公钥和私钥_上传本地公钥到服务器_14

在这里需要说明一下,client连接上要server端要么是通过密码,要么是通过公钥认证方式登录上的。这里是密码验证登录,所以server端第一修改Port 端口为60001,第二PermitRootLogin为yes,第三开启PasswordAuthentication 为yes(server端配置文件ssd_config中修改)否则server端是拒绝连接的,比如PasswordAuthentication为no

client通过ssh登录到server上之后,client会创建$HOME/.ssh目录,在目录里创建known_hosts文件,文件中记录了server此次登录的公钥,下一次登录时,client直接在该文件中查找192.168.1.100:60001是否存在公钥,存在的话,会直接用该公钥加密密码等date,然后发送出去,server接收到加密文件后会通过对应私钥来解密,核对密码正确,则允许登录

clinet端 known_host文件内容:

上传本地公钥到服务器 服务器公钥和私钥_配置文件_15

server端 ecdsa公钥文件内容:

上传本地公钥到服务器 服务器公钥和私钥_Server_16

到这里ssh密码验证登录结束

 

END