一、下载最新版本 OpenSSH
从https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
下载最新版本openssh-8.2p1.tar.gz,将版本存放到某个目录下,没有特定要求,比如我放在了/home/ssh目录下
二、编译安装 OpenSSH
tar xzvf openssh-8.2p1.tar.gz
cd openssh-8.2p1
./configure --prefix=/usr --sysconfdir=/etc/ssh 配置文件路径必须是/etc/ssh
三、把老版本的ssh放到另外一个目录,这步是关键,这样就不用卸载旧版本
mkdir /etc/sshbak 新建文件夹
mv /etc/ssh/* /etc/sshbak/ 备份原文件
四、编译源码包
make&&make install
五、编译安装成功后,进行配置
cp /home/ssh/openssh-8.2p1/opensshd.init /etc/init.d/sshd 复制启动文件
注意:这里的opensshd.init脚本是在openssh安装包中,与你安装包存放路径有关,如果不是放在/home/ssh,则需要做修改
chmod +x /etc/init.d/sshd 添加执行权限
修改配置文件 /etc/ssh/sshd_config
#Port 22 去掉注释#
#PermitRootLogin prohibit-password
去掉注释并改为 PermitRootLogin yes
可以使用下面两条命令
sed -i 's/#Port 22/Port 22/' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
注意:必须去掉注释,不然重启后ssh无法连接
六、必须重启ssh服务
service sshd restart 或者 /etc/init.d/sshd restart
使用ssh -V 命令查看,这里ssh的版本已升级为8.2。
最关键的一步就是把老的ssh文件夹移到其他地方,然后新的ssh的目录仍然放在/etc/ssh下面,这样的升级过程中ssh就不会断开。
七、问题汇总
当然在安装的过程中并不是都那么顺利,会出现各种问题
1.在运行./configure的时候提示libcrypto not found
错误,那可能是缺少依赖
安装依赖
apt install libzip-dev libssl-dev libxml2 openssl-devel
如果apt install
命令使用不了,可以尝试使用yum -y install
此命令
如果由于网络问题无法下载依赖包的话,可以尝试更新重装openssl,然后运行./configure要指定ssl的路径,操作可以参考第2和第4步。
2.openssl library not found
可能openssl不是默认路径urs/local/ssl
,设置下实际路径,不然会报错,一般可以在usr/local路径下查找;也可以使用openssl version -a
查找对应ENGINESDIR:
的路径
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-ssl-dir=ssl的实际路径
3.如果运行./configure出现 zlib.h missing
,则需要安装zlib源码文件
下载解压,编译安装
wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local
make
make install
4.出现关于openssl版本低的问题:OpenSSL library version... configure: error: OpenSSL >= 1.0.1
,则更新升级openssl
下载解压,编译安装
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz --no-check-certificate
tar -zxvf openssl-1.1.1.tar.gz
cd /openssl-1.1.1
./config shared zlib --prefix=/usr/local/openssl
make && make install
备份原来的openssl
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
配置链接新版本
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
配置库搜索路径并测试
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf 配置动态库链接
/sbin/ldconfig -v
openssl version -a 查看版本
如果执行openssl version报错,可能是库文件位置不对,需做软连接
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
或者是
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
5.ssh升级之后连接报algorithm negotiation failed
的错误,这时需要手动添加加密算法到/etc/ssh/sshd_config
文件中
查询ssh -Q cipher
,查询结果因系统而异
将查询到的结果拼接起来写入到/etc/ssh/sshd_config中
echo "Ciphers 3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com" >> /etc/ssh/sshd_config
如果还是连接出错,再添加下面两段
echo "KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org" >> /etc/ssh/sshd_config
echo "MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96" >> /etc/ssh/sshd_config
6.登录ssh出现Access denied
,或是重启ssh服务出现/usr/sbin/sshd: error while loading shared libraries: libcrypto.so.1.1: failed to map segment from shared object: Permission denied
问题,可通过关闭SELinux解决
getenforce 查看状态
setenforce 0 临时关闭,但重启会失效
vim /etc/selinux/config
设置SELINUX=disabled,重启机器生效
7.suse系统升级之后连接出现Permission denied (publickey,keyboard-interactive)
的问题,网上查询结果都是说密钥认证的问题,但手动生成密钥未能解决问题。后经多番排查,发现是启动脚本的问题
原先步骤中复制启动脚本的路径为
cp /home/ssh/openssh-8.2p1/opensshd.init /etc/init.d/sshd
需更改为
cp /home/ssh/openssh-8.2p1/contrib/suse/rc.sshd /etc/init.d/sshd