一、telnet安装
二、安装升级openssl1.1.1g
三、安装openssh8.3p1
四、重启测试
五、关于重启后测试连接报错详解(如何使用旧算法)
5.1 密钥协商算法不一致的问题
5.2 公钥算法不一致的问题
每次漏洞扫描,必有openssh漏洞,而且都要求升级到最新,下面写一下配置过程。
一、telnet安装
1.本地源搭建[root@test ~]# cat /etc/yum.repos.d/aa.repo[aa]name=aabaseurl=file:///mntenable=1gpgcheck=0[root@test ~]# yum clean all[root@test ~]# yum makecache2.安装telnet[root@test ~]# yum -y install telnet telnet-server xinetd3.配置telnet在centos6版本中telnet安装后需要配置/etc/xinetd.d/telnet这个文件,centos7版本开始已经不需要了[root@test xinetd.d]# cat /etc/securetty |grep pts //添加三个telnet的登陆终端类型pts/0pts/1pts/2[root@test xinetd.d]# systemctl start xinetd.service && systemctl enable xinetd.service[root@test ~]# systemctl start telnet.socket && systemctl enable telnet.socketCreated symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.4.登陆验证Kernel 3.10.0-693.el7.x86_64 on an x86_64test login:rootPassword:Last login: Mon Sep 7 14:38:29 from 192.168.48.1[root@test ~]#
二、安装升级openssl1.1.1g
1.安装依赖包[root@test ~]# yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel[root@test ~]# yum install -y pam* zlib*2.安装openssl(这里使用两种方式,默认安装和指定文件安装)a.查看当前版本[root@test ~]# openssl versionOpenSSL 1.0.2k-fips 26 Jan 2017[root@test ~]# ssh -VOpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017b.解压[root@test ~]# ll openssl-1.1.1g.tar.gz-rw-r--r-- 1 root root 9801502 9月 7 15:17 openssl-1.1.1g.tar.gz[root@test ~]# tar zxvf openssl-1.1.1g.tar.gzc.备份[root@test openssl-1.1.1g]# mv /usr/bin/openssl /usr/bin/openssl_bak[root@test openssl-1.1.1g]# mv /usr/include/openssl /usr/include/openssl_bakd.安装方法一:直接默认安装[root@test openssl-1.1.1g]# ./config --shared //构建共享库注意:配置选项可以查看安装包中的INSTALL文件如果不指定--prefix将默认部署到/usr/local/include目录如果不指定--openssldir将默认部署到/usr/local/ssl目录如果不指定--libdir=DIR将模式安装到--prefix指定的目录中,如果没有指定--prefix目录[root@test openssl-1.1.1g]# make && make install[root@test openssl-1.1.1g]# ln -s /usr/local/bin/openssl /usr/bin/openssl //如果没有指定安装目录,则这一步需要操作[root@test openssl-1.1.1g]# ln -s /usr/local/include/openssl /usr/include/openssl //如果没有指定安装目录,则这一步需要操作[root@test openssl-1.1.1g]# echo "/usr/local/lib64" >> /etc/ld.so.conf //增加lib库搜索路径[root@test openssl-1.1.1g]# ldconfig方法二:如果指定安装目录,则可以按照如下步骤操作,这个和上面默认安装都已经测试过,没问题的./config --prefix=/usr/include/openssl --openssldir=/usr/local/ssl --sharedln -s /usr/include/openssl/bin/openssl /usr/bin/opensslecho "/usr/include/openssl/lib" >> /etc/ld.so.confldconfige.检查升级是否成功[root@test openssl-1.1.1g]# openssl versionOpenSSL 1.1.1g 21 Apr 2020
三、安装openssh8.3p1
0.默认openssh版本[root@test ~]# ssh -VOpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 20171.解压[root@test ~]# tar zxvf openssh-8.3p1.tar.gz[root@test ~]# chown -R root.root openssh-8.3p12.备份[root@test ~]# cp -a /etc/ssh /etc/ssh_bak[root@test ~]# rm -rf /etc/ssh/*3.安装[root@test openssh-8.3p1]# ./configure --prefix=/usr \ //指定安装目录--sysconfdir=/etc/ssh \ //指定配置文件目录--with-ssl-dir=/usr/local/lib64 \ //指定Libre/OpenSSL的位置--with-zlib \ //开启--with-md5-passwords \ //开启md5加密--with-pam //开启pam支持#--with-openssl-includes=/usr/local/include/openssl \ //注意这个选项再这个版本中已经不受支持,现在只需要使用--with-ssl-dir指定lib位置即可//如果上面openssl采用方法二的指定目录安装的话则需要修改./configure --prefix=/usr --sysconfdir=/etc/ssh --with-openssl-includes=/usr/include/openssl --with-zlib --with-md5-passwords --with-pam[root@test openssh-8.3p1]# make && make install4. 修改配置文件修改PermitRootLogin yes 即可5.拷贝sshd启动脚本,启停测试[root@test openssh-8.3p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd[root@test openssh-8.3p1]# chmod +x /etc/init.d/sshd[root@test redhat]# mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak//不以systemd管理,用传统sysV init启动管理[root@test redhat]# chkconfig --add sshd[root@test redhat]# chkconfig sshd on注意:正在将请求转发到“systemctl enable sshd.socket”。[root@test redhat]# /etc/init.d/sshd restartRestarting sshd (via systemctl): [ 确定 ][root@test redhat]# systemctl stop sshd[root@test redhat]# systemctl start sshd && systemctl enable sshdCreated symlink from /etc/systemd/system/sockets.target.wants/sshd.socket to /usr/lib/systemd/system/sshd.socket.[root@test redhat]# systemctl status sshd● sshd.service - SYSV: OpenSSH server daemon //能看的是以sysv方式管理Loaded: loaded (/etc/rc.d/init.d/sshd; bad; vendor preset: enabled)Active: active (running) since 一 2020-09-07 16:14:04 CST; 4s agoDocs: man:systemd-sysv-generator(8)Process: 28902 ExecStop=/etc/rc.d/init.d/sshd stop (code=exited, status=0/SUCCESS)Process: 28915 ExecStart=/etc/rc.d/init.d/sshd start (code=exited, status=0/SUCCESS)Main PID: 28923 (sshd)CGroup: /system.slice/sshd.service└─28923 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups9月 07 16:14:04 test systemd[1]: Starting SYSV: OpenSSH server daemon...9月 07 16:14:04 test sshd[28923]: Server listening on 0.0.0.0 port 22.9月 07 16:14:04 test sshd[28923]: Server listening on :: port 22.9月 07 16:14:04 test systemd[1]: Started SYSV: OpenSSH server daemon.9月 07 16:14:04 test sshd[28915]: Starting sshd:[ 确定 ]6.版本检查[root@test redhat]# ssh -VOpenSSH_8.3p1, OpenSSL 1.1.1g 21 Apr 2020
四、重启测试
[root@test redhat]# reboot重启后xshell连接提示"找不到匹配的key exchange算法"通过google查询:1.解决办法两种方法一:直接升级到最新的客户端,直接exchange算法方法二:使用下面文章的解决方案https://www.openssh.com/legacy.html(或者参考第五节内容)
重启后xshell连接提示"找不到匹配的key exchange算法"

我们来看一下xshell版本为xshell5

它的安全选项里面算法里面有哪些,可以看到没有DH密钥交换算法,所以需要升级到最新版本。

我这里没有xshell6,使用SecureCRT测试下:(也是报错,报错内容也是缺少DH密钥交换算法)

CRT的安全选项也看看:

直接再下载最新版的putty做测试,可以看到有密钥交换算法,证明是可以登陆的,登陆测试下

可以看到已经成功登陆,openssl版本和openssh版本和预期也一致:

五、关于重启后测试连接报错详解(如何使用旧算法)
上面问题再百度中一直没有查询到原因,google了一下,解释参考内容https://www.openssh.com/legacy.html
OpenSSH实现了与符合标准的SSH实现兼容所需的所有加密算法,但是由于发现某些较旧的算法较弱,因此默认情况下并非全部启用。此页面描述了OpenSSH拒绝与仅支持旧算法的实现进行连接时的操作。
当SSH客户端连接到服务器时,双方会提供彼此的连接参数列表。这些算法由ssh_config配置文件提供,包括以下内容:
KexAlgorithms:用于生成每个连接密钥的密钥交换方法
HostkeyAlgorithms:SSH服务器接受向SSH客户端进行身份验证的公钥算法
Ciphers:加密连接的密码
MACs:用于检测流量修改的消息身份验证代码
5.1 密钥协商算法不一致
如果客户端和服务器无法在一组相互的参数上达成一致,则连接将失败。OpenSSH(7.0及更高版本)将产生如下错误消息:
Unable to negotiate with legacyhost: no matching key exchange method found.
Their offer: diffie-hellman-group1-sha1
在这种情况下,客户端和服务器无法就密钥交换算法达成共识。服务器仅提供一种方法 diffie-hellman-group1-sha1。OpenSSH支持此方法,但是默认情况下不启用它,因为它很弱并且在所谓的Logjam攻击的理论范围内。
在用户身份验证期间,有几个相关选项会起作用。
PubkeyAcceptedKeyTypes(ssh / sshd):客户端将尝试并由服务器接受以进行公钥身份验证的公钥算法(例如通过.ssh/authorized_keys)
HostbasedKeyTypes(ssh)和HostbasedAcceptedKeyTypes(sshd):客户端将尝试并由服务器接受以用于基于主机的身份验证的密钥类型(例如,通过.rhosts或 .shosts)
解决这些故障的最佳方法是在另一端升级软件和/或用较安全的现代类型替换弱密钥类型。OpenSSH仅禁用我们积极建议不要使用的算法,因为已知它们是弱算法。
所以对于这种错误,解决方法如下:
1. 可以使用命令行方式启用密钥交换算法
ssh -oKexAlgorithms = +diffie-hellman-group1-sha1 user@legacyhost
2. 在配置文件中启用密钥交换算法
ssh_config文件添加KexAlgorithms +diffie-hellman-group1-sha1+表示将算法添加到客户端的默认设置,而不是替换默认设置
5.2 公钥算法不一致
另一种类型公钥算法不一致报错:
Unable to negotiate with legacyhost: no matching host key type found. Their offer: ssh-dss
ssh -oHostKeyAlgorithms = +ssh-dss user@legacyhost或者修改配置文件添加HostKeyAlgorithms +ssh-dss
根据服务器配置,其他参数可能无法协商,可以启用ciphers或者MACS选项。也可以用查询ssh支持的算法:
ssh -Q cipher#列出支持的密码ssh -Q mac#列出支持的MACssh -Q key#列出支持的公钥类型ssh -Q kex#列出支持的密钥交换算法
也可以通过-G选项来查询连接到特定主机时ssh实际使用的配置:
ssh -G user@somehost.example.com
现在用这个方法解决报错,不适用最新版本的客户端软件:
1.首先可以查看当前openssh需要什么交换协议,我们看看目前版本支持的密钥交换协议有哪些
1.查询当前OpenSSH版本支持的交换协议[root@test ~]# ssh -Q kexdiffie-hellman-group1-sha1diffie-hellman-group14-sha1diffie-hellman-group14-sha256diffie-hellman-group16-sha512diffie-hellman-group18-sha512diffie-hellman-group-exchange-sha1diffie-hellman-group-exchange-sha256ecdh-sha2-nistp256ecdh-sha2-nistp384ecdh-sha2-nistp521curve25519-sha256curve25519-sha256@libssh.orgsntrup4591761x25519-sha512@tinyssh.org2.查看当前正在使用的密钥交换算法[root@test ssh]# sshd -T |grep kexkexalgorithms curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
2.修改配置文件sshd_conf
根据北章节所说的解决办法,添加算法diffie-hellman-group1-sha1上面的都是openssh认为的安全算法,现在需要添加过时算法再配置文件中使用(+算法这种)格式[root@test ssh]# cat sshd_config |grep kexalgorithmskexalgorithms +diffie-hellman-group1-sha1 //配置文件中新增
3. 登陆验证
XSHELL5已经可以登陆:

SecureCRT正常登陆:





