2013-04-11 126 views
1

當我嘗試連接到SFTP服務器時,出現異常。我相信它是一個不安全的服務器,但連接也失敗了。我向管理員證實,服務器實際上是安全的,應該使用SFTP。代碼在我的本地機器上運行良好,作爲獨立的java程序運行,但在本地機器上的Websphere商業服務器上運行時無法運行。SFTP連接問題

代碼:

FTPSClient client = new FTPSClient(); 
//FTPClient client = new FTPClient(); 
//client.setKeyManager(km); 
System.setProperty("javax.net.debug", "all"); 
//client.setSocketFactory(SSLSocketFactory.getDefault()); 
client.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
client.setTrustManager(ACCEPT_ALL); 
client.enterLocalPassiveMode(); 
client.setWantClientAuth(false); 
client.setNeedClientAuth(false); 
//client.setEnabledCipherSuites(null); 
System.out.println("using 990'"); 
client.connect("obuftp.sears.com",21); 

異常(當WCS ENV內運行)

SystemOut  O 220-| Welcome to obuftp401p FTP over SSL (FTPS) Server | 
220-| We allow TLS connections on ports 21 and 990. | 
220-| If you see "503 Login with USER first." use SSL. | 
220 

SystemOut  O AUTH TLS 

SystemOut  O 234 Proceed with negotiation. 

SystemErr  R javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 
SystemErr  R  at com.ibm.jsse2.b.c(b.java:169) 
SystemErr  R  at com.ibm.jsse2.b.a(b.java:228) 
SystemErr  R  at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:242) 
SystemErr  R  at com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:437) 
SystemErr  R  at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:142) 
SystemErr  R  at com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:686) 
SystemErr  R  at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:240) 
SystemErr  R  at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:171) 
+0

我很喜歡,說:「使用990」中的println即使代碼繼續使用21非常好。 – 2013-04-11 15:52:28

+0

正如Mike在回答中指出的,「SFTP」是「SSH文件傳輸協議」,與FTP/FTPS無關。這可能是因爲你需要SFTP客戶端而不是FTPS。 – 2013-04-11 16:40:32

回答

3

請注意,安全的FTP是相當模糊的東西。

  1. SFTP是SSH協議的一部分
  2. FTPS是真正的 「FTP安全」 爲FTP協議的擴展

現在有2種FTPS的:隱(FTPS)和顯式(FTP/ES)。

  • FTPS被加密爲默認,通常工作在端口990
  • FTP/ES連接開始作爲常規FTP(默認端口21),並通過顯式「START TLS」或「START SSL」 FTP接通命令。

由於所有這些協議之間的混淆,導致很多問題。 我想這也是這種情況 - 你可能會發送「AUTH TLS」給期望SSL數據的服務器,或者你發送SSL數據到期望「AUTH TLS」的服務器。

可能client.connect("obuftp.sears.com",990);會就好...

你可以閱讀更多的https://en.wikipedia.org/wiki/FTPS