如何基于FTP4J实现FTPS连接过程解析

FTPS:

一种多传输协议,相当于加密版的FTP。当你在FTP服务器上收发文件的时候,你面临两个风险。第一个风险是在上载文件的时候为文件加密。第二个风险是,这些文件在你等待接收方下载的时候将停留在FTP服务器上,这时你如何保证这些文件的安全。你的第二个选择(创建一个支持SSL的FTP服务器)能够让你的主机使用一个FTPS连接上载这些文件。这包括使用一个在FTP协议下面的SSL层加密控制和数据通道。一种替代FTPS的协议是安全文件传输协议(SFTP)。这个协议使用SSH文件传输协议加密从客户机到服务器的FTP连接。

FTPS是在安全套接层使用标准的FTP协议和指令的一种增强型FTP协议,为FTP协议和数据通道增加了SSL安全功能。FTPS也称作“FTP-SSL”和“FTP-over-SSL”。SSL是一个在客户机和具有SSL功能的服务器之间的安全连接中对数据进行加密和解密的协议。

当使用FTPS与服务器连接时,有两种方法:显式和隐式。

简单来说:

显示又叫FTPES, FTPS客户端跟FTPS服务器必须显式使用一种同样的加密方法。如果客户端不要求加密,服务器也允许非加密通讯。

隐式 就是客户端直接通过TSL/SSL加密与服务器联系,如果服务器无响应,则停止通讯。

FTP4J 支持 FTPS/FTPES secured connection,其中使用FTPES还是原来的21端口,使用FTPS使用的是990端口,使用SFTP的是22端口,以下说的不包含SFTP内容。

可以查看Serv-U域详细信息查看服务邦定的端口,默认情况下是以下内容:

如果我们使用flashfxp进行连接,则使用不同连接方式时要进行选择,普通FTP连接使用21端口,不用选择:

我们通过21端口进行显示FTPS连接:

package test;
import it.sauronsoftware.ftp4j.FTPClient;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
 * 通过21端口进行显示FTPS连接
 * @说明
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
public class Ftp4jTest {
	public static void main(String[] args) {
		try {
			TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {
				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}
				public void checkClientTrusted(X509Certificate[] certs,
						String authType) {
				}
				public void checkServerTrusted(X509Certificate[] certs,
						String authType) {
				}
			} };
			SSLContext sslContext = null;
			sslContext = SSLContext.getInstance("SSL");
			sslContext.init(null, trustManager, new SecureRandom());
			SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
			FTPClient client = new FTPClient();
			client.setSSLSocketFactory(sslSocketFactory);
			client.setSecurity(FTPClient.SECURITY_FTPES);
			client.connect("192.168.1.122", 21);
			client.login("123", "123123");
			System.out.println(client.toString());
			System.out.println(client.currentDirectory());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

代码会打印连接信息和当前目录

使用990端口进行隐式FTPS连接:

package test;
import it.sauronsoftware.ftp4j.FTPClient;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
 * 进行隐式FTPS连接
 * @说明
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
public class Ftp4jTest {
	public static void main(String[] args) {
		try {
			TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {
				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}
				public void checkClientTrusted(X509Certificate[] certs,
						String authType) {
				}
				public void checkServerTrusted(X509Certificate[] certs,
						String authType) {
				}
			} };
			SSLContext sslContext = null;
			sslContext = SSLContext.getInstance("SSL");
			sslContext.init(null, trustManager, new SecureRandom());
			SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
			FTPClient client = new FTPClient();
			client.setSSLSocketFactory(sslSocketFactory);
			client.setSecurity(FTPClient.SECURITY_FTPS);
			client.connect("192.168.1.122", 990);
			client.login("123", "123123");
			System.out.println(client.toString());
			System.out.println(client.currentDirectory());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

打印内容相同

进行显示还是隐式连接的最大不同是指定了连接方式:

这个情况官方也给出了详细的说明:

The ftp4j library supports both FTPS (FTP over implicit TLS/SSL) and FTPES (FTP over explicit TLS/SSL).
The setSecurity() method can be used to turn on the feature:
client.setSecurity(FTPClient.SECURITY_FTPS); // enables FTPS
client.setSecurity(FTPClient.SECURITY_FTPES); // enables FTPES
Both methods must be called before connecting the remote server.
If the security is set to SECURITY_FTPS, the default port used by the connect() method changes to 990

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java连接ftp服务器实例代码

    废话不多说了,直接给大家贴java代码了. import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.ftp.FtpClient; public class MyFtp { static FtpClient myFtp; static String hostname; static String username; static String password; /** * @author cutel

  • PHP连接sftp并下载文件的方法教程

    前言 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全:它通过加密 SSH 传输处理所有操作. 下面这篇文章主要介绍了关于PHP连接sftp并下载文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 首先我们要知道如何在命令行下连接,了解了之后就清楚大概的原理了 命令行连接的方式如下 sftp -P port user@host 如果端口号默认是22的话就不需要端口号的

  • java使用apache commons连接ftp修改ftp文件名失败原因

    今天被ftp上中文名修改坑了好久 项目用的是 apache commons 里的 FtpClient 实现的对ftp文件的上传下载操作,今天增加了业务要修改ftp上的文件名,然后就一直的报错,问题是它修改名字的方法只返回一个boolean,没有异常,这就很蛋疼了,找了好久才发现是中文的名字的原因 改名 直接上代码 package net.codejava.ftp; import java.io.IOException; import org.apache.commons.net.ftp.FTPC

  • python查看FTP是否能连接成功的方法

    本文实例讲述了python查看FTP是否能连接成功的方法.分享给大家供大家参考.具体如下: #!/usr/local/bin/python #-*- coding: UTF-8 -*- #################################################################### # python 查看FTP是否能连接成功 ##################################################################

  • serv_u要关闭被动模式(PASV),使用PORT模式才能连接FTP的解决办法

    问题表现: 使用 flashfxp 或传东西时必须要关闭被动模式,否则无法连接,连接FTP时客户端总是提示:"PORT 模式成功, 请更新你的站点配置文件"! 原因分析: 防火墙或者serv-u没有开放被动模式(PASV)的端口) 解决方法一:(只使用Port模式连接) 如图设置: 解决方法二:(可使用 PASV 和 Port 两种模式连接) 服务器如果启用了防火墙,需要在防火墙上打开一些端口给FTP的PASV模式使用,否则使用PASV模式无法登录. 一.在 Serv-U的本地服务器

  • Java语言实现简单FTP软件 FTP连接管理模块实现(8)

    本文为大家介绍了FTP连接管理模块的实现方法,供大家参考,具体内容如下 (1)FTP连接 运行FTP客户端后,首先是连接FTP服务器,需要输入FTP服务器的IP地址及用户名.密码以及端口号后点击连接按钮开始连接FTP服务器,连接流程图如下图所示. 点击"连接"按钮后,会调用com.oyp.ftp.FTPClientFrame类的linkButtonActionPerformed(ActionEvent evt)方法,其主要代码程序如下 /** * 连接按钮的事件处理方法 */ riva

  • php连接sftp的作用以及实例代码

    sftp 协议 使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议. 区别: sftp是ssh内含的协议(ssh是加密的telnet协议),只要sshd服务器启动了,它就可用,而且sftp安全性较高,它本身不需要ftp服务器启动. sftp = ssh + ftp(安全文件传输协议). 由于ftp是明文传输的,没有安全性,而sftp基于ssh,传输内容是加密过的,较为安全.目前网络不太安全,以前用telnet的都改用ssh2(SSH1已被破解). sft

  • Java FTPClient连接池的实现

    最近在写一个FTP上传工具,用到了Apache的FTPClient,为了提高上传效率,我采用了多线程的方式,但是每个线程频繁的创建和销毁FTPClient对象势必会造成不必要的开销,因此,此处最好使用一个FTPClient连接池.仔细翻了一下Apache的api,发现它并没有一个FTPClientPool的实现,所以,不得不自己写一个FTPClientPool.下面就大体介绍一下开发连接池的整个过程,供大家参考. 关于对象池 有些对象的创建开销是比较大的,比如数据库连接等.为了减少频繁创建.销毁

  • 如何基于FTP4J实现FTPS连接过程解析

    FTPS: 一种多传输协议,相当于加密版的FTP.当你在FTP服务器上收发文件的时候,你面临两个风险.第一个风险是在上载文件的时候为文件加密.第二个风险是,这些文件在你等待接收方下载的时候将停留在FTP服务器上,这时你如何保证这些文件的安全.你的第二个选择(创建一个支持SSL的FTP服务器)能够让你的主机使用一个FTPS连接上载这些文件.这包括使用一个在FTP协议下面的SSL层加密控制和数据通道.一种替代FTPS的协议是安全文件传输协议(SFTP).这个协议使用SSH文件传输协议加密从客户机到服

  • spring boot基于DRUID实现数据源监控过程解析

    这篇文章主要介绍了spring boot基于DRUID实现数据源监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高.今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但

  • 基于python调用psutil模块过程解析

    这篇文章主要介绍了基于python调用psutils模块过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用Python来编写脚本简化日常的运维工作是Python的一个重要用途.在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如ps,top,free等等.要获取这些系统信息,Python可以通过subprocess模块调用并获取结果.但这样做显得很麻烦,尤其是要写很多解析代码. 在Python中获取系统信息的另一个好办法是

  • 基于springboot处理date参数过程解析

    这篇文章主要介绍了基于springboot处理date参数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 最近在后台开发中遇到了时间参数的坑,就单独把这个问题提出来找时间整理了一下: 正文 测试方法 bean代码: public class DateModelNoAnnotation { private Integer id; private Date receiveDate; } controller代码: @RestContr

  • 基于SPRINGBOOT配置文件占位符过程解析

    这篇文章主要介绍了基于SPRINGBOOT配置文件占位符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.配置文件占位符 1.application.properties server.port=8088 debug=false product.id=ID:${random.uuid} product.name=da mao mao product.weight=${random.int} product.fristLinePrice

  • 如何基于SpringBoot部署外部Tomcat过程解析

    这篇文章主要介绍了SpringBoot以war包形式部署到外部Tomcat过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringBoot 项目打包时能打成 .jar 与 .war包文件,.jar使用 java -jar xx.jar 就可以启动,而 .war 可以部署到tomcat的 webapps 中,随tomcat的启动而启动. SpringBoot 本身是内置tomcat的,如果想部署到外部tomcat, 就要做一些改变.

  • Python socket处理client连接过程解析

    socket只能处理一个client连接,如果需要并发处理多个链接则需要使用socketserver,下面是代码示例以及注释 server端 import socketserver #之前的socket只能同时处理一个客户端,当需要并发处理client发送的信息是需要使用到socketserver,下面创建一个类,继承socketserver其对应实例就有并发能力 class My_Tcp_Handler(socketserver.BaseRequestHandler): #下面的handler

  • Python基于DB-API操作MySQL数据库过程解析

    Python提供了一个标准数据库API,称为DB-API,用于处理基于SQL的数据库. 与任何底层数据库的交互都可以使用DB-API,因为DB-API在代码与驱动程序之间提供了一个抽象层,可以根据需要替换底层数据库,而无需丢弃现有的代码. DB-API与底层数据库交互示例: ①代码 ⇆ ②使用DB-API ⇆ ③数据库驱动程序 ⇆ ④底层数据库(如MySQL等) 使用DB-API操作MySQL数据库例子 1.Windows安装MySQL数据库驱动程序MySQL-Connector/Python

  • Mybatis-plus基于redis实现二级缓存过程解析

    1. mybatis-plus开启二级缓存 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://192.168.222.155:3306/sys?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&

  • 如何基于java实现Gauss消元法过程解析

    补充知识: 正定矩阵 奇异矩阵 严格对角占优 要理解Gauss消去法,首先来看一个例子: 从上例子可以看出,高斯消去法实际上就是我们初中学的阶二元一次方程组,只不过那里的未知数个数$n=2$ $n>2$时,Gauss消去法的思路实际上和解二元一次方程组是一样的,方法如下: 将n方程组中的n−1个方程通过消元,形成一个与原方程组等价的一个新方程组,新方程组中的n−1个方程仅包含n−1个未知数. 故问题就转化为了求解n−1元的方程组,这样我们可以继续消元,以次类推,直到最后一个方程组为一元一次方程组

随机推荐