vsftpd 3.0.3升级到3.0.5后的坑

news2024/11/18 12:23:37

 1、问题描述

vsftpd 3.0.3升级到3.0.5后,Java  ftps连接不成功,报以下错误:

javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake
	at java.base/sun.security.ssl.SSLSocketImpl.handleEOF(SSLSocketImpl.java:1715)
	at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1514)
	at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1421)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455)
	at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
	at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:259)
	at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:205)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:169)
	at org.apache.commons.net.SocketClient.connect(SocketClient.java:189)
	at com.legrand.common.util.FtpsUtil.ftpLogin(FtpsUtil.java:55)
	at com.legrand.common.util.FtpsUtil.main(FtpsUtil.java:301)
	Suppressed: java.net.SocketException: 你的主机中的软件中止了一个已建立的连接。
		at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:420)
		at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
		at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826)
		at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1035)
		at java.base/sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81)
		at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:407)
		at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314)
		at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:467)
		... 7 common frames omitted
Caused by: java.io.EOFException: SSL peer shut down incorrectly
	at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:483)
	at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
	at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160)
	at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
	at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506)
	... 9 common frames omitted
15:53:04.240 [main] INFO com.legrand.common.util.FtpsUtil - Failed to log in to FTP service: Remote host terminated the handshake

使用FlashFXP连接也不成功,报:TLSv1.2 协商失败,已断开

 

2、问题排查

2.1 Wireshark抓包

使用Wireshark抓包结果为:

 可以看到在ftps连接过程中报错:SSL routines::no ciphers available ,翻译过来就是没有可用的密码。

为什么没有可用的密码,是不是配置文件里没有配?

2.2 vsftpd.conf配置文件检查

打开vsftpd.conf  搜索ciphers,确实没有找到。

# Run in the foreground to keep the container running:
background=NO

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO

# Uncomment this to allow local users to log in.
local_enable=YES

## Enable virtual users
guest_enable=YES

## Virtual users will use the same permissions as anonymous
virtual_use_local_privs=YES

# Uncomment this to enable any form of FTP write command.
write_enable=YES

## PAM file name
pam_service_name=vsftpd_virtual

## Home Directory for virtual users
user_sub_token=$USER
local_root=/home/vsftpd/$USER

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
chroot_local_user=YES

# Workaround chroot check.
# See https://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/
# and http://serverfault.com/questions/362619/why-is-the-chroot-local-user-of-vsftpd-insecure
allow_writeable_chroot=YES

## Hide ids from user
hide_ids=YES

## Enable logging
# Active les messages de changement de r..pertoire
dirmessage_enable=YES
# Utilisation de log pour les uploads et downloads (par defaut /var/log/vsftpd.log)
xferlog_enable=YES
# Emplacement du fichier de log
xferlog_file=/var/log/vsftpd/vsftpd.log
#xferlog_file=/var/log/vsftpd.log
# Formatage de la log au standard wu-ftpd
xferlog_std_format=YES
# Utilisation de 2 fichiers de log diff..rents (Par d..faut /var/log/xferlog et /var/log/vsftpd.log)
dual_log_enable=YES


## Enable active mode
port_enable=YES
connect_from_port_20=YES
ftp_data_port=20

## Disable seccomp filter sanboxing
seccomp_sandbox=NO

## SSL
ssl_enable=yes
ssl_sslv2=no
ssl_sslv3=no
ssl_tlsv1=yes
allow_anon_ssl=YES
force_anon_data_ssl=YES
force_anon_logins_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
implicit_ssl=NO
require_ssl_reuse=NO

### Variables set at container runtime
pasv_address=
pasv_max_port=26100
pasv_min_port=21100
pasv_addr_resolve=NO
pasv_enable=YES
file_open_mode=0666
local_umask=077
#reverse_lookup_enable=NO
pasv_promiscuous=NO
port_promiscuous=NO

那么是不是vsftpd有对应的配置参数,只是我们没有加上去而已呢?

2.3 vsftpd.conf说明文档

找到vsftpd.conf的说明文档:Manpage of VSFTPD.CONF

果然找到了参数ssl_ciphers,该参数的作用是设置ssl连接通道加密的算法,默认值为:DES-CBC3-SHA

ssl_ciphers=DES-CBC3-SHA 设置到vsftpd.conf,重启,发现无法启动。

那么我们不禁要问:是不是ssl_ciphers设置不对,ssl_ciphers要设置成什么才合适?

2.4  cipher的介绍

相关文献可以看下openssl官网关于cipher的介绍/docs/manmaster/man1/ciphers.html。也可以在安装了openssl的linux下输入

man ciphers

 可以把命令结果输出到文件查看更方便些。

man ciphers > openssl.txt

也就是说 ssl_ciphers可以设置为ALL、HIGH、MEDIUM、LOW一组密码套件,如:ssl_ciphers=HIGH。也可以设置为如:ssl_ciphers=DHE-DSS-AES128-SHA256,单个密码套件

3、问题解决

最终选择设置为: ssl_ciphers=HIGH   #“高”加密密码套件。这目前指的是密钥长度大于128位的密码,以及一些密钥长度为128位的密码套件。

因为安全性更高,同时避免只设置单个密码套件客户端刚好不支持的情况。

重启vsftpd,是用FlashFXP连接成功,至此问题解决。

4、原因分析

vsftpd3.0.5 默认支持TLSv1.2+

TLS1.2新特性:

1)添加已验证加密支持
2) 添加对HMAC-SHA256密码套件的支持:
3) 删除IDEA和DES密码套件;
4)虽然大部分扩展的实际文档还是在其他地方,但TLS将扩展和协议的主规格说明书进行了集成5)客户端可以使用一种新的扩展( signature algorithms)来通报它愿意接受的散列和签名算法6)当使用TLS1.2套件或者以协商协议是TLS1.2为条件使用之前的套件时,在PRF中使用SHA256替MD5/SHA1组合。
7)允许密码套件定义其自身的PRF:
8) 使用单一散列代替用于数字签名的MD5/SHA1组合。默认使用SHA256,并且密码套件可以指定其自身使用的散列。签名散列算法以往是由协议强制指定,现在是散列函数式签名结构中的一部分而目在实施启用中可以选择最佳算法
9)密码套件可以显式指定Finished消息中的verify data成员的长度
 

总结:可以看出因为vsftpd3.0.5 默认支持TLSv1.2+,ssl_ciphers默认配置为DES-CBC3-SHA ,而TLSv1.2又删除了DES密码套件,故ftps连接时就报错:SSL routines::no ciphers available ,因此将ssl_ciphers设置为其他可用密码组件就可以了。

5、参考文档

关于vsftpd ssl的一些配置 - 爱码网

SSL证书中的TLS1.0和TLS1.2的区别是什么-SSL证书申请指南网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java日志处理

日志 日志就是Logging,它的目的是为了取代System.out.println() 输出日志,而不是用System.out.println(),有以下几个好处: (1)可以设置输出样式,避免自己每次都写“ERROR: ” var &#xff0…

故障分析 | 一次规律的 MySQL 主从延迟跳变

作者:李彬 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。爱好有亿点点多,吉他、旅行、打游戏… 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注…

WxGL应用实例:绘制高精度的3D太阳系模型

文章目录 1 坐标系的选择1.1 黄道坐标系1.2 三维空间直角坐标系 2 使用JPL星历表计算轨道2.1 日期时间2.2 特定时刻天体的位置2.3 天体运行轨道 3 太阳系模型3. 1 全家福3.2 时间、距离和半径的缩放3.3 黄道坐标系模型 天何所沓?十二焉分?日月安属&#…

拆解Open ODS View和HANA Composite Provider

这两个也不是新面孔了。 那么OODS和HCPR到底他俩怎么用?既然大家都是虚拟的,不占地方。那这俩infoprovider到底有啥区别? 首先就是目的不同。 HCPR是可以用Union和Join。也就是老的Multiprovider和InfoSet。Union就是说两个数据集的行能被…

UniLM模型简单介绍

目录 一、概要 二、深入扩展 2.1 预训练任务 2.2 模型精调 一、概要 如果将基于Transformer的双向语言模型(如BERT模型中的掩码语言模型)与单向的自回归语言模型(如BART模型的解码器)进行对比,可以发现&#xff0c…

常见的注册中心Nacos、Eureka

常见的注册中心 1.Eureka(原生,2.0遇到瓶颈,停止维护) 2.Zookeeper(支持,专业的独立产品。例如:dubbo) 3.Consul(原生,GO语言开发) 4.Nacos …

中国社科院与美国杜兰大学金融管理硕士项目——在职读研的日子里藏着我们未来无限可能

人生充满期待,梦想连接着未来。每一天都可以看作新的一页,要努力去成为最好的自己。在职读研的光阴里藏着无限的可能,只有不断的努力,不断的强大自己,未来会因为你的不懈坚持而发生改变,纵使眼前看不到希望…

算法---统计参与通信的服务器

题目 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其…

【C语言】调试工具GDB简述

一、说明 GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。本文介绍GDB启动调试的方式。 二、Ubuntu上安装gdb。 在root用户权限下: roo…

【通过蓝牙滚动文本和Android控制】

【通过蓝牙滚动文本和Android控制】 1. 概述2. MAX72193. 电路原理图4. MAX7219基本Arduino代码5. 88 LED矩阵滚动Arduino代码6. 用于通过蓝牙控制 88 LED 矩阵的安卓应用程序1. 概述 我们将做三个例子,第一个例子我们将解释MAX7219的基本工作原理,在第二个例子中,我们将看…

scala控制抽象之传名参数(名调用)

我们在用scala定义函数时,一般参数都是各种类型的值,这是常见的值调用 但偶尔也有需要把代码块作为参数传入的情况(名调用) 匿名函数经常可以作为函数的参数传入,非匿名函数也行(函数作为返回值返回就更常见…

都说软件测试不行了,真的是这样吗?

最近在各大平台经常会听到大家说这样的话: 现在公司都不招人,测试员根本找不到工作 简历石沉大海、面试机会也没有,软件测试是不是不行了 软件测试行情到底如何? 作为软件员在如今的情况下又该怎么做? 其实现在所…

ai生成文章 免费-自动生成文章

原创文章自动生成器 随着人工智能技术的快速发展,越来越多的创新产品得以应用到我们的日常工作中。其中,原创文章自动生成器是一种高效、智能的工具,它可以帮助企业快速生成符合要求的优质文章。在本文中,我将向您介绍原创文章自…

数据结构算法leetcode刷题练习(1)

给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一…

4.2 插值多项式的求法

学习目标: 我会采取以下几个步骤来学习插值多项式的求法: 学习预备知识:插值多项式的求法需要掌握一定的数学知识,例如多项式函数的定义、导数、微积分、线性代数等等。因此,学习插值多项式的求法前,需要先…

掘金AIGC时代,开发者更需要什么样的大模型?

当前,火热的AI大模型领域需要一些冷思考。 自去年年底ChatGPT掀起一轮AIGC热潮以来,国内科技企业扎堆发布大模型和类ChatGPT产品。截止2023年4月,已公开宣布发布或即将发布AI大模型的企业达数十家。多模态大模型的能力不断迭代,市…

2023年自动化测试真有那么重要吗?内卷严重,测试技能水涨船高......

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 学习自动化测试有…

应用现代化语境下的技术重塑:谁在帮助企业自我革命?

文丨智能相对论 作者丨沈浪 在数字经济时代,应用现代化正在成为一个共识。在IDC发布的《IDC FutureScape:全球云计算2022年预测-中国启示》报告中,应用现代化就位居首位。同时,IDC也预测,到2025年,数字经…

更新 WinForms | InitializeComponent 的现代代码生成

当你使用 Visual Studio 中的 WinForms Designer 来创建一个 WinForms 表单或用户控件时,它并没有像 XML 或 HTML 那样的特殊定义或文件格式来表示用户界面。从一开始,WinForms 使用的唯一格式就是程序代码。在 WinForms Visual Basic 项目中定义的表单或…

ONES 联合中国信通院发布《中国企业软件研发管理白皮书》

4月20日,由 ONES 与中国信通院联合发起的《中国企业软件研发管理白皮书》发布会暨「软件质效沙龙一北京站」正式举行。发布会上,ONES 与中国信通院云计算与大数据研究所的各位领导、行业专家及众多软件从业者一起,聚焦研发管理热点动态&#…