通过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连接

Java代码:  
  1. package test;  
  2. import it.sauronsoftware.ftp4j.FTPClient;  
  3. import java.security.SecureRandom;  
  4. import java.security.cert.X509Certificate;  
  5. import javax.net.ssl.SSLContext;  
  6. import javax.net.ssl.SSLSocketFactory;  
  7. import javax.net.ssl.TrustManager;  
  8. import javax.net.ssl.X509TrustManager;  
  9. /** 
  10.  * 通过21端口进行显示FTPS连接 
  11.  * @说明  
  12.  * @author cuisuqiang 
  13.  * @version 1.0 
  14.  * @since 
  15.  */  
  16. public class Ftp4jTest {  
  17.     public static void main(String[] args) {  
  18.         try {  
  19.             TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {  
  20.                 public X509Certificate[] getAcceptedIssuers() {  
  21.                     return null;  
  22.                 }  
  23.                 public void checkClientTrusted(X509Certificate[] certs,  
  24.                         String authType) {  
  25.                 }  
  26.                 public void checkServerTrusted(X509Certificate[] certs,  
  27.                         String authType) {  
  28.                 }  
  29.             } };  
  30.             SSLContext sslContext = null;  
  31.             sslContext = SSLContext.getInstance("SSL");  
  32.             sslContext.init(null, trustManager, new SecureRandom());  
  33.             SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();  
  34.             FTPClient client = new FTPClient();  
  35.             client.setSSLSocketFactory(sslSocketFactory);  
  36.            client.setSecurity(FTPClient.SECURITY_FTPES);   
  37.             client.connect("192.168.1.122"21);  
  38.             client.login("123""123123");  
  39.             System.out.println(client.toString());  
  40.             System.out.println(client.currentDirectory());  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

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

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

Java代码:  
  1. package test;  
  2. import it.sauronsoftware.ftp4j.FTPClient;  
  3. import java.security.SecureRandom;  
  4. import java.security.cert.X509Certificate;  
  5. import javax.net.ssl.SSLContext;  
  6. import javax.net.ssl.SSLSocketFactory;  
  7. import javax.net.ssl.TrustManager;  
  8. import javax.net.ssl.X509TrustManager;  
  9. /** 
  10.  * 进行隐式FTPS连接 
  11.  * @说明  
  12.  * @author cuisuqiang 
  13.  * @version 1.0 
  14.  * @since 
  15.  */  
  16. public class Ftp4jTest {  
  17.     public static void main(String[] args) {  
  18.         try {  
  19.             TrustManager[] trustManager = new TrustManager[] { new X509TrustManager() {  
  20.                 public X509Certificate[] getAcceptedIssuers() {  
  21.                     return null;  
  22.                 }  
  23.                 public void checkClientTrusted(X509Certificate[] certs,  
  24.                         String authType) {  
  25.                 }  
  26.                 public void checkServerTrusted(X509Certificate[] certs,  
  27.                         String authType) {  
  28.                 }  
  29.             } };  
  30.             SSLContext sslContext = null;  
  31.             sslContext = SSLContext.getInstance("SSL");  
  32.             sslContext.init(null, trustManager, new SecureRandom());  
  33.             SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();  
  34.             FTPClient client = new FTPClient();  
  35.             client.setSSLSocketFactory(sslSocketFactory);  
  36.             client.setSecurity(FTPClient.SECURITY_FTPS);  
  37.             client.connect("192.168.1.122"990);  
  38.             client.login("123""123123");  
  39.             System.out.println(client.toString());  
  40.             System.out.println(client.currentDirectory());  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

打印内容相同

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

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

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

请您到ITEYE网站看原创,谢谢!

http://www.software8.co/wzjs/java/2862.html

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值