簡體   English   中英

我無法使用具有自定義SSLContext的Apache FTPSClient通過FTPS連接到FTP服務器-獲取“無法識別的SSL消息,純文本連接?”

[英]I cannot connect to my FTP server by FTPS with Apache FTPSClient with custom SSLContext - getting “Unrecognized SSL message, plaintext connection?”

我正在編寫程序以通過FTPS連接到FTP服務器。

源代碼:

String protocol = "TLS";
String host = "192.168.5.165";
String username = "usr";
String password = "111";
String trustStorePath = "C:/TEMP/truststore";
String trustStorePassword = "111111";
int port = 990;

FTPSClient client = new FTPSClient(protocol);

KeyStore trustStore = loadStore("JKS", new File(trustStorePath), trustStorePassword);
X509TrustManager trustManager = TrustManagerUtils.getDefaultTrustManager(trustStore);

SSLContext ctx = SSLContext.getInstance("TLSv1.1");
ctx.init(null, new TrustManager[] {trustManager}, null);

FTPSSocketFactory socketFactory = new FTPSSocketFactory(ctx);
client.setSocketFactory(socketFactory);

client.addProtocolCommandListener(new PrintCommandListener(new 
PrintWriter(System.out)));
client.connect(host, port);

我將服務器的證書導入了trustStore 但是運行此代碼后,我得到此錯誤:

220 Wing FTP Server ready... (UNREGISTERED WING FTP SERVER)
AUTH TLS
234 AUTH command OK. Initializing TLS connection.

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

  at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710)
  at sun.security.ssl.InputRecord.read(InputRecord.java:527)
  at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
  at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
  at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
  at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
  at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:269)
  at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:211)
  at org.apache.commons.net.SocketClient.connect(SocketClient.java:183)
  at org.apache.commons.net.SocketClient.connect(SocketClient.java:203)
  at edtesb.remsenergy.FTPSTest.test(FTPSTest.java:63)

我做錯了什么?

在我看來,您已經對其進行了過度設計。

我不確定我是否能完全理解您的代碼做什么,但是我相信您無意間對連接進行了雙重加密。


如果您確實要連接到隱式FTPS端口990,請使用

FTPSClient client = new FTPSClient(protocol, true);

或默認為protocol="TLS" ,這也可以做到:

FTPSClient client = new FTPSClient(true);

client.connect(host); // 990 is default, with FTPSClient with isImplicit=true

盡管隱式FTPS已過時,但最好通過連接默認的FTP端口21使用顯式FTPS(如果服務器支持,大多數情況下):

FTPSClient client = new FTPSClient();

client.connect(host);

如果需要自定義SSLContext ,只需使用相應的FTPSClient重載,例如:

FTPSClient client = new FTPSClient(ctx);

client.connect(host);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM