如何基于FTP4J實現(xiàn)FTPS連接過程解析
FTPS:
一種多傳輸協(xié)議,相當于加密版的FTP。當你在FTP服務器上收發(fā)文件的時候,你面臨兩個風險。第一個風險是在上載文件的時候為文件加密。第二個風險是,這些文件在你等待接收方下載的時候?qū)⑼A粼贔TP服務器上,這時你如何保證這些文件的安全。你的第二個選擇(創(chuàng)建一個支持SSL的FTP服務器)能夠讓你的主機使用一個FTPS連接上載這些文件。這包括使用一個在FTP協(xié)議下面的SSL層加密控制和數(shù)據(jù)通道。一種替代FTPS的協(xié)議是安全文件傳輸協(xié)議(SFTP)。這個協(xié)議使用SSH文件傳輸協(xié)議加密從客戶機到服務器的FTP連接。
FTPS是在安全套接層使用標準的FTP協(xié)議和指令的一種增強型FTP協(xié)議,為FTP協(xié)議和數(shù)據(jù)通道增加了SSL安全功能。FTPS也稱作“FTP-SSL”和“FTP-over-SSL”。SSL是一個在客戶機和具有SSL功能的服務器之間的安全連接中對數(shù)據(jù)進行加密和解密的協(xié)議。
當使用FTPS與服務器連接時,有兩種方法:顯式和隱式。
簡單來說:
顯示又叫FTPES, FTPS客戶端跟FTPS服務器必須顯式使用一種同樣的加密方法。如果客戶端不要求加密,服務器也允許非加密通訊。
隱式 就是客戶端直接通過TSL/SSL加密與服務器聯(lián)系,如果服務器無響應,則停止通訊。
FTP4J 支持 FTPS/FTPES secured connection,其中使用FTPES還是原來的21端口,使用FTPS使用的是990端口,使用SFTP的是22端口,以下說的不包含SFTP內(nèi)容。
可以查看Serv-U域詳細信息查看服務邦定的端口,默認情況下是以下內(nèi)容:

如果我們使用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();
}
}
}
打印內(nèi)容相同
進行顯示還是隱式連接的最大不同是指定了連接方式:
這個情況官方也給出了詳細的說明:
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
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java靜態(tài)內(nèi)部類實現(xiàn)單例過程
這篇文章主要介紹了Java靜態(tài)內(nèi)部類實現(xiàn)單例過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
詳解SpringBoot整合RabbitMQ如何實現(xiàn)消息確認
這篇文章主要介紹了SpringBoot整合RabbitMQ是如何實現(xiàn)消息確認的,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
java為什么使用BlockingQueue解決競態(tài)條件問題面試精講
這篇文章主要為大家介紹了java為什么使用BlockingQueue解決競態(tài)條件問題面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
Java算法實現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解
今天小編就為大家分享一篇關于Java算法實現(xiàn)調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)之前的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01

