如何基于FTP4J實現(xiàn)FTPS連接過程解析
FTPS:
一種多傳輸協(xié)議,相當(dāng)于加密版的FTP。當(dāng)你在FTP服務(wù)器上收發(fā)文件的時候,你面臨兩個風(fēng)險。第一個風(fēng)險是在上載文件的時候為文件加密。第二個風(fēng)險是,這些文件在你等待接收方下載的時候?qū)⑼A粼贔TP服務(wù)器上,這時你如何保證這些文件的安全。你的第二個選擇(創(chuàng)建一個支持SSL的FTP服務(wù)器)能夠讓你的主機使用一個FTPS連接上載這些文件。這包括使用一個在FTP協(xié)議下面的SSL層加密控制和數(shù)據(jù)通道。一種替代FTPS的協(xié)議是安全文件傳輸協(xié)議(SFTP)。這個協(xié)議使用SSH文件傳輸協(xié)議加密從客戶機到服務(wù)器的FTP連接。
FTPS是在安全套接層使用標(biāo)準(zhǔn)的FTP協(xié)議和指令的一種增強型FTP協(xié)議,為FTP協(xié)議和數(shù)據(jù)通道增加了SSL安全功能。FTPS也稱作“FTP-SSL”和“FTP-over-SSL”。SSL是一個在客戶機和具有SSL功能的服務(wù)器之間的安全連接中對數(shù)據(jù)進行加密和解密的協(xié)議。
當(dāng)使用FTPS與服務(wù)器連接時,有兩種方法:顯式和隱式。
簡單來說:
顯示又叫FTPES, FTPS客戶端跟FTPS服務(wù)器必須顯式使用一種同樣的加密方法。如果客戶端不要求加密,服務(wù)器也允許非加密通訊。
隱式 就是客戶端直接通過TSL/SSL加密與服務(wù)器聯(lián)系,如果服務(wù)器無響應(yīng),則停止通訊。
FTP4J 支持 FTPS/FTPES secured connection,其中使用FTPES還是原來的21端口,使用FTPS使用的是990端口,使用SFTP的是22端口,以下說的不包含SFTP內(nèi)容。
可以查看Serv-U域詳細(xì)信息查看服務(wù)邦定的端口,默認(rèn)情況下是以下內(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(); } } }
代碼會打印連接信息和當(dāng)前目錄
使用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)容相同
進行顯示還是隱式連接的最大不同是指定了連接方式:
這個情況官方也給出了詳細(xì)的說明:
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java中Map、Set、List的簡單使用教程(快速入門)
這篇文章主要給大家介紹了關(guān)于java中Map、Set、List簡單使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01java實現(xiàn)HmacSHA256算法進行加密方式
這篇文章主要介紹了java實現(xiàn)HmacSHA256算法進行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08多模塊maven的deploy集成gitlab?ci自動發(fā)版配置
這篇文章主要為大家介紹了多模塊maven項目deploy集成gitlab?ci自動發(fā)版的配置流程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02Spring?Boot?集成?Swagger2構(gòu)建?API文檔
這篇文章主要介紹了Spring?Boot?集成?Swagger2構(gòu)建?API文檔,通過使用?Swagger,我們只需要按照它所給定的一系列規(guī)范去定義接口以及接口的相關(guān)信息,然后它就能幫我們自動生成各種格式的接口文檔,方便前后端開發(fā)者進行前后端聯(lián)調(diào),下文需要的朋友可以參考一下2022-03-03Java8中List轉(zhuǎn)Map(Collectors.toMap) 的技巧分享
在最近的工作開發(fā)之中,慢慢習(xí)慣了很多Java8中的Stream的用法,很方便而且也可以并行的去執(zhí)行這個流,這篇文章主要給大家介紹了關(guān)于Java8中List轉(zhuǎn)Map(Collectors.toMap) 的相關(guān)資料,需要的朋友可以參考下2021-07-07使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法
目前在系統(tǒng)架構(gòu)設(shè)計中使用Redis實現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實現(xiàn)數(shù)據(jù)緩存的方法,具有一定的參考價值,需要的朋友可以參考下2018-11-11詳解Java中的增強 for 循環(huán) foreach
foreach 是 Java 中的一種語法糖,幾乎每一種語言都有一些這樣的語法糖來方便程序員進行開發(fā),編譯期間以特定的字節(jié)碼或特定的方式來對這些語法進行處理。能夠提高性能,并減少代碼出錯的幾率。2017-05-05