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

 更新时间:2020年10月17日 11:53:43   作者:cuisuqiang  
这篇文章主要介绍了如何基于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

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

相关文章

  • springboot命令行启动的方法详解

    springboot命令行启动的方法详解

    这篇文章主要介绍了springboot命令行启动的方法,本文通过两种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java静态内部类实现单例过程

    Java静态内部类实现单例过程

    这篇文章主要介绍了Java静态内部类实现单例过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解SpringBoot整合RabbitMQ如何实现消息确认

    详解SpringBoot整合RabbitMQ如何实现消息确认

    这篇文章主要介绍了SpringBoot整合RabbitMQ是如何实现消息确认的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Java8中方便又实用的Map函数总结

    Java8中方便又实用的Map函数总结

    java8之后,常用的Map接口中添加了一些非常实用的函数,可以大大简化一些特定场景的代码编写,提升代码可读性,快跟随小编一起来看看吧
    2022-11-11
  • Java中File类中常用方法详解

    Java中File类中常用方法详解

    这篇文章主要为大家详细介绍了File类中常用方法的程序演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • java为什么使用BlockingQueue解决竞态条件问题面试精讲

    java为什么使用BlockingQueue解决竞态条件问题面试精讲

    这篇文章主要为大家介绍了java为什么使用BlockingQueue解决竞态条件问题面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Spring的Xml和JavaConfig 扩展哪个好用

    Spring的Xml和JavaConfig 扩展哪个好用

    今天给大家介绍基于注解的Spring扩展,Spring的Xml和JavaConfig 扩展的配置方法,关于Spring的Xml和JavaConfig 扩展你会选哪个呢,带着这个问题一起通过本文学习下吧
    2021-05-05
  • Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    Java算法实现调整数组顺序使奇数位于偶数之前的讲解

    今天小编就为大家分享一篇关于Java算法实现调整数组顺序使奇数位于偶数之前的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 将Maven镜像源更改为阿里镜像的操作步骤

    将Maven镜像源更改为阿里镜像的操作步骤

    在软件开发中,Maven是一个流行的项目管理工具,它允许你从Maven中央仓库下载所需的依赖包,然而,由于地理位置或网络状况的差异,从默认的Maven中央仓库下载依赖包的速度可能会较慢,所
    2025-01-01
  • 详解Java对象结构与对象锁的升级

    详解Java对象结构与对象锁的升级

    这篇文章主要为大家详细介绍了Java对象结构与对象锁的升级,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论