Coldfusion 9 allows you to connect to a secure FTP server (cfftp: Opening and closing secure FTP server connections), however this doesn't seem to work if the FTP server is using FTP over implicit TLS/SSL. To get it working was quite a head-ache and hopefully I can save someone else many hours of swearing!
Firstly if you are getting the error:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Then you may just need to add the certificate to your ColdFusion server. To do this I recommend using CertMan which you can download from http://certman.riaforge.org/.
That didn't work for me I was still getting this error:
An error occurred while establishing an sFTP connection. Verify your connection attributes: username, password, server, fingerprint, port, key, connection, proxyServer, and secure (as applicable). Error: connection is closed by foreign host.
So, download JavaLoader and extract into your webroot and then download ftp4j and put the ftp4j-1.6.jar in the webroot (if you're using mappings then you can put them anywhere).
Now that's done, here is some sample code to connect and list the directory contents of the FTP Server.
<cfscript> paths = ; /* This points to the jar we want to load. Could also load a directory of .class files */ paths = expandPath("ftp4j-1.6.jar"); //create the loader loader = createObject("component", "javaloader.JavaLoader").init(paths); //at this stage we only have access to the class, but we don't have an instance FTPClient = loader.create("it.sauronsoftware.ftp4j.FTPClient").init(); //FTPClient.setSecurity(FTPClient.SECURITY_FTPES); // enables FTPES FTPClient.setSecurity(FTPClient.SECURITY_FTPS); // enables FTPS // if the security is set to SECURITY_FTPS, the default port used by the connect() method changes to 990. FTPClient.connect("ftps.someserver.com"); FTPClient.login("aliaspooryorik", "HardPasswordToGuess"); FTPClient.upload(CreateObject("java","java.io.File").init(ExpandPath("somefile.xml"))); writeDump(FTPClient.currentDirectory()); FTPClient.disconnect(true); </cfscript>