当前位置: 移动技术网 > IT编程>开发语言>Java > 如何基于FTP4J实现FTPS连接过程解析

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

2020年10月17日  | 移动技术网IT编程  | 我要评论
ftps:一种多传输协议,相当于加密版的ftp。当你在ftp服务器上收发文件的时候,你面临两个风险。第一个风险是在上载文件的时候为文件加密。第二个风险是,这些文件在你等待接收方下载的时候将停留在ftp

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

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网