/*
*
* Copyright (C) 2006 Enterprise Distributed Technologies Ltd
*
* www.enterprisedt.com
*/
import java.io.File;
import com.enterprisedt.net.ftp.FTPClientInterface;
import com.enterprisedt.net.ftp.FTPConnectMode;
import com.enterprisedt.net.ftp.FTPTransferType;
import com.enterprisedt.net.ftp.ssl.SSLFTPClient;
import com.enterprisedt.net.ftp.ssl.SSLFTPStandardValidator;
import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;
public class UseFTPSWithClientServerValidation {
public static void main(String[] args) {
// we want remote host, user name and password
if (args.length < 4) {
System.out.println(
"Usage: run remote-host username password server-cert-file client-cert-file clientpassphrase");
System.exit(1);
}
// extract command-line arguments
String host = args[0];
String username = args[1];
String password = args[2];
String serverCertFilename = args[3];
String clientCertFilename = args[4];
String clientKeyPassphrase = args[5];
String filename = "UseFTPSWithClientServerValidation.java";
// set up logger so that we get some output
Logger log = Logger.getLogger(UseFTPSWithClientServerValidation.class);
Logger.setLevel(Level.INFO);
SSLFTPClient ftp = null;
try {
// create client
log.info("Creating FTPS (explicit) client");
ftp = new SSLFTPClient();
// disable standard SSL closure
log.info("Setting configuration flags");
ftp.setConfigFlags(SSLFTPClient.ConfigFlags.DISABLE_SSL_CLOSURE);
// NOTE: The DISABLE_SSL_CLOSURE flag is included in this example
// for the sake of compatibility with as wide a range of servers as
// possible. If possible it should be avoided as it opens the
// possibility of truncation attacks (i.e. attacks where data is
// compromised through premature disconnection).
// set remote host
log.info("Setting remote host");
ftp.setRemoteHost(host);
// load root certificates/server certificate
log.info("Loading server certificate from " + serverCertFilename);
ftp.getRootCertificateStore().importPEMFile(serverCertFilename);
// Disable host-name checking (only recommended when testing)
log.info("Disable host-name checking (only recommended when testing)");
ftp.setCustomValidator(new SSLFTPStandardValidator(false));
// load client's private key and certificate
log.info(
"Loading client key and certificate from "
+ clientCertFilename
+ " with password "
+ clientKeyPassphrase);
ftp.loadClientCertificate(clientCertFilename, clientKeyPassphrase);
// connect to the server
log.info("Connecting to server " + host);
ftp.connect();
// switch to SSL on control channel
log.info("Switching to FTPS (explicit mode)");
ftp.auth(SSLFTPClient.AUTH_TLS);
// log in
log.info(
"Logging in with username="
+ username
+ " and password="
+ password);
ftp.login(username, password);
log.info("Logged in");
ftp.setConnectMode(FTPConnectMode.PASV);
ftp.setType(FTPTransferType.ASCII);
putGetDelete(filename, ftp);
log.info("Successfully transferred in ASCII mode");
// Shut down client
log.info("Quitting client");
ftp.quit();
log.info("Example complete");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Put a file, get it back as a copy and delete the local copy and the
* remote copy
*
* @param name original filename
* @param ftp reference to FTP client
*/
private static void putGetDelete(String name, FTPClientInterface ftp)
throws Exception {
ftp.put(name, name);
ftp.get(name + ".copy", name);
ftp.delete(name);
File file = new File(name + ".copy");
file.delete();
}
}
|