You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Sebb (JIRA)" <ji...@apache.org> on 2011/03/07 22:16:59 UTC

[jira] Reopened: (NET-287) Implicit SSL issue with EFT Server

     [ https://issues.apache.org/jira/browse/NET-287?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sebb reopened NET-287:
----------------------


> Implicit SSL issue with EFT Server
> ----------------------------------
>
>                 Key: NET-287
>                 URL: https://issues.apache.org/jira/browse/NET-287
>             Project: Commons Net
>          Issue Type: Bug
>         Environment: I am using Windows XP sp3, and am running the demo version of EFT Server. If it matters, I am using Eclipse to write and run the code.
>            Reporter: Ryan McV
>
> I am trying to write some code that will download a file from a FTPS Server. When I tested the code in explicit mode using the EFT Server, it works fine. However, when I switch over to implicit mode, I am able to connect and login, but when I try to download a file, It sends back a code 150 saying that it was about to open a data connection, but it never does. Here is the exchange:
> {noformat}
> Attempting to connect to localhost
> 220 GlobalSCAPE EFT Server (v. 6.0) * UNREGISTERED COPY *
> Connected to localhost.
> USER test
> 331 Password required for test.
> PASS 1234
> 230-This is an * UNREGISTERED COPY * of GlobalSCAPE EFT Server.
> 230-
> 230 Login OK. Proceed.
> SYST
> 215 UNIX Type: L8
> Remote System is UNIX Type: L8
> PASV
> 227 Entering Passive Mode (127,0,0,1,18,158).
> RETR test.txt
> 150 Opening ASCII mode data connection for test.txt.{noformat}
> after that, nothing happens and eventually the server times out.
> and here is the code:
> {noformat}import javax.net.ssl.*;
> import java.security.*;
> import java.io.FileNotFoundException;
> import java.io.FileOutputStream;
> import java.io.FileInputStream;
> import java.io.IOException;
> import java.io.OutputStream;
> import java.io.PrintWriter;
> import java.security.NoSuchAlgorithmException;
> import java.security.cert.CertificateException;
> import org.apache.commons.net.PrintCommandListener;
> import org.apache.commons.net.ftp.FTPConnectionClosedException;
> import org.apache.commons.net.ftp.FTPReply;
> import org.apache.commons.net.ftp.FTPSClient;
> public class FTPS_Test2 {
> 	/**
> 	 * @param args
> 	 */
> 	public static void main(String[] args) 
> 	{
> 		String server = "localhost";
> 		String username = "test";
> 		String password = "1234";
> 		String remotefile = "test.txt";
> 		String localfile = "test.txt";
> 		String protocl = "SSL";
> 		String keypass = "jkm127012";
> 		boolean error = false;
> 		
> 		FTPSClient ftps = null;
> 		
> 		//Initialization
> 		KeyStore ks = null; 
> 		try 
> 		{
> 			ks = KeyStore.getInstance("JKS");
> 		} 
> 		catch (KeyStoreException e1) 
> 		{
> 			System.err.println("KeyStore Exception");
> 			e1.printStackTrace();
> 		}
> 		
> 		FileInputStream fis = null;
> 		try
> 		{
> 			fis = new FileInputStream(".keystore");
> 			ks.load(fis, keypass.toCharArray());
> 			fis.close();
> 		} 
> 		catch (FileNotFoundException e) 
> 		{
> 			System.err.println("File Not Found");
> 			e.printStackTrace();
> 		} 
> 		catch (NoSuchAlgorithmException e) 
> 		{
> 			System.err.println("No Such Algorithm");
> 			e.printStackTrace();
> 		} 
> 		catch (CertificateException e) 
> 		{
> 			System.err.println("Certificate Exception");
> 			e.printStackTrace();
> 		} 
> 		catch (IOException e) 
> 		{
> 			System.err.println("IOException");
> 			e.printStackTrace();
> 		}
> 		
> 		TrustManagerFactory tmf = null;
> 		try 
> 		{
> 			tmf = TrustManagerFactory.getInstance("PKIX");
> 			tmf.init(ks);
> 		} 
> 		catch (NoSuchAlgorithmException e1) 
> 		{
> 			e1.printStackTrace();
> 		} 
> 		catch (KeyStoreException e) 
> 		{
> 			e.printStackTrace();
> 		}
> 		
> 		TrustManager tm[] = tmf.getTrustManagers();
> 		
> 		//FTPS Initialization
> 		try
> 		{
> 			ftps = new FTPSClient(protocl, true);
> 			ftps.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
> 		}
> 		catch (NoSuchAlgorithmException e)
> 		{
> 			System.err.println("FTPS Initialization Failed");
> 			e.printStackTrace();
> 			System.exit(1);
> 		}
> 		
> 		try
> 		{
> 			int reply;
> 			
> 			System.out.println("Attempting to connect to " + server);
> 			ftps.setTrustManager(tm[0]);
> 			ftps.connect(server, 990);
> 			System.out.println("Connected to " + server + ".");
> 			
> 			reply = ftps.getReplyCode();
> 			
> 			if(!FTPReply.isPositiveCompletion(reply))
> 			{
> 				ftps.disconnect();
> 				System.err.println("FTP server connection failed");
> 				System.exit(1);			
> 			}
> 			
> 		}
> 		catch (IOException e)
> 		{
> 			System.err.println("IOException");
> 			e.printStackTrace();
> 			
> 			if(ftps.isConnected())
> 			{
> 				try
> 				{
> 					ftps.disconnect();
> 				}
> 				catch (IOException f)
> 				{
> 					System.err.println("IOException");
> 				}
> 			}
> 		}	
> 		
> 		//Main
> 		try
> 		{
> 			ftps.setBufferSize(1000);
> 			
> 			if (!ftps.login(username, password))
> 			{
> 				ftps.logout();
> 				error = true;
> 			}
> 			
> 			
> 			System.out.println("Remote System is " + ftps.getSystemName());
> 			ftps.enterLocalPassiveMode();
> 			
> 			OutputStream output;
> 			output = new FileOutputStream(localfile);
> 			ftps.retrieveFile(remotefile, output);
> 			output.close();
> 			
> 			ftps.logout();
> 		}
> 		catch (FTPConnectionClosedException e)
> 		{
> 			error = true;
> 			System.err.println("Server Connection closed");
> 			e.printStackTrace();
> 		}
> 		catch (IOException e)
> 		{
> 			error = true;
> 			e.printStackTrace();
> 		}
> 		finally
> 		{
> 			if(ftps.isConnected())
> 			{
> 				try
> 				{
> 					ftps.disconnect();
> 				}
> 				catch (IOException f)
> 				{
> 					
> 				}
> 			}
> 		}
> 		
> 		System.exit(error ? 1 : 0);
> 	}
> } {noformat}
> I have tested the same code on different servers,and it works fine in implicit and explicit modes. However the EFT Server uses a certificate and a key file, and all the other servers just use a cerrtificate file. Is there some special code I have to use in that case? Or is there some setting in the server that I have to set? 
> Thanks in advance you for your help.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira