首页 > 其他分享 >Apache Commons Net 共享SSLSession问题解决

Apache Commons Net 共享SSLSession问题解决

时间:2024-10-30 20:58:22浏览次数:4  
标签:String Commons session SSLSession Apache import net final socket

    某些服务器会默认开启TLS会话恢复,如FileZilla Server 1.0及以后的版本(相对于1.0以前版本就是先当与勾选了Require TLS session resumption on data connect when using PORT P)。Apache Commons Net目前是不支持TLS会话恢复的,所以我们只能通过重写FTPSClient来实现。不然你就会经常看到报错如:425 Unable to build data connection: TLS session of data connection not resumed.

package net.evecom.iaplatform.common.ftp;

import org.apache.commons.net.ftp.FTPSClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSessionContext;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.Socket;
import java.util.Locale;

/**
 * <p>
 * <B>Description: 共享SSLSession  FTPS客户端</B>
 * </P>
 *
 * @author Ryan Huang
 * @version 1.0
 */
public class SharedSSLFTPSClient extends FTPSClient {

    public SharedSSLFTPSClient(String protocol, boolean isImplicit) {
        super(protocol, isImplicit);
    }

    private static final Logger logger = LoggerFactory.getLogger(SharedSSLFTPSClient.class);

    @Override
    protected void _prepareDataSocket_(final Socket socket) throws IOException {
        if (socket instanceof SSLSocket) {
            // Control socket is SSL
            final SSLSession session = ((SSLSocket) _socket_).getSession();
            final SSLSessionContext context = session.getSessionContext();
            context.setSessionCacheSize(0); // you might want to limit the cache
            try {
                final Field sessionHostPortCache = context.getClass()
                        .getDeclaredField("sessionHostPortCache");
                sessionHostPortCache.setAccessible(true);
                final Object cache = sessionHostPortCache.get(context);
                final Method method = cache.getClass().getDeclaredMethod("put", Object.class,
                        Object.class);
                method.setAccessible(true);
                String key = String.format("%s:%s", socket.getInetAddress().getHostName(),
                        String.valueOf(socket.getPort())).toLowerCase(Locale.ENGLISH);
                method.invoke(cache, key, session);
                key = String.format("%s:%s", socket.getInetAddress().getHostAddress(),
                        String.valueOf(socket.getPort())).toLowerCase(Locale.ENGLISH);
                method.invoke(cache, key, session);
            }
            catch (NoSuchFieldException e) {
                // Not running in expected JRE
                logger.warn("No field sessionHostPortCache in SSLSessionContext", e);
            }
            catch (Exception e) {
                // Not running in expected JRE
                logger.warn(e.getMessage());
            }
        }

    }

}

注意:对于JDK1.8,使用上述方法即可解决。但是如果使用JDK11,需要在连接前指定协议ftpsClient.setEnabledProtocols(new String[]{"TLSv1.2"});。因为JDK11默认使用TLSv1.3,但是目前TLSv1.3不支持共享SSLSession.
参考地址:https://docs.spring.io/spring-integration/reference/ftp/advanced-configuration.html

标签:String,Commons,session,SSLSession,Apache,import,net,final,socket
From: https://www.cnblogs.com/IamHzc/p/18516621

相关文章

  • 不使用docker-compose不使用zookeeper启动ApacheKafka3.8.0单机运行KRAFT模式
    dockerrun-d-v/kafka_data:/opt/kafka-logs-eKAFKA_ENABLE_KRAFT=yes-eKAFKA_PROCESS_ROLES=broker,controller-eKAFKANODEID=1-eKAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093-eKAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.1......
  • Java使用apache.commons.io框架下的FileUtils类实现文件的写入、读取、复制、删除
    ApacheCommonsIO是Apache开源基金组织提供的一组有关IO(Input/Output)操作的小框架,它是ApacheCommons项目的一部分,专注于提供简单易用的API,用于处理输入和输出操作。ApacheCommonsIO是一个功能强大的JavaIO工具库,提供了丰富的API来简化文件和流的操作。通过使用......
  • 手把手教你部署Apache DolphinScheduler —— 钉钉告警
    在之前的文章中,我们已经介绍了ApacheDolphinScheduler海豚调度的基本概念和工作流程,以及Shell任务和SQL任务的实践。感兴趣的朋友可以下滑到最下面,点击感兴趣的文章阅读!今天,让我们来学习ApacheDolphinScheduler中的另一个重要功能:钉钉告警。钉钉群添加机器人在钉钉群添加机器......
  • 如何在 Ubuntu 20.04 上使用 Let‘s Encrypt 保护 Apache
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介Let’sEncrypt是一个证书颁发机构(CA),它简化了获取和安装免费TLS/SSL证书的过程,从而在Web服务器上启用了加密的HTTPS。它通过提供一个软件客户端Certbot来简化......
  • 如何在 CentOS 7 上使用 Let‘s Encrypt 保护 Apache
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介Let’sEncrypt是一个证书颁发机构(CA),为传输层安全性(TLS)加密提供免费证书,从而在Web服务器上启用加密的HTTPS。它通过提供一个软件客户端Certbot简化了证书的创建......
  • Netty、Go、Apache Tomcat、grpc-go、jetty、nghttp2、Apache Traffic Server是什么
    这些都是与网络编程和服务器应用相关的技术,下面我将分别简要介绍它们:Netty:Netty是一个异步事件驱动的网络应用程序框架,用于快速开发高性能、高可靠性的网络服务器和客户端程序。它支持多种协议,包括HTTP、HTTPS、FTP、SMTP等,广泛应用于游戏、移动、物联网、大数据等领域。......
  • Apache Seata(incubating) 首个版本重磅发布!
    作者:Seata社区2.1.0是Seata进入Apache基金会的第一个ReleaseVersion。此次发布将io.seata包名更改为org.apache.seata。除了按原有的Roadmap技术演进外,2.1.0进行了大量兼容性工作,实现了API、数据和协议的兼容。用户无需修改原有的API和配置,即可实现到Apache版......
  • 大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(已更完)Druid(正在更新…)章节内容上节我们完成了如下的内容:Apa......
  • Apache ShenYu介绍与部署
    一、概述 ApacheShenYu(incubating)是一个异步的,高性能的,跨语言的,高性能,多协议,易扩展,响应式的API网关。兼容各种主流框架体系,支持热插拔,用户可以定制化开发,满足用户各种场景的现状和未来需求,经历过大规模场景的锤炼。支持丰富的协议:Http、SpringCloud、gRPC、Dubbo、S......
  • 宝塔可以同时安装apache和nginx
    宝塔面板是一个服务器管理软件,可以帮助用户快速、简单地管理服务器。宝塔面板支持一键安装Apache、Nginx、MySQL、PHP等,并且可以提供各种管理功能,如网站、数据库的管理等。宝塔面板不支持同时安装Apache和Nginx,因为这两个软件都是用来处理HTTP服务的,你只能选择安装其中之一。如......