FTPS Library Technische Informatie
Java Libaries
Apache Commons Net
Apache Commons Net ondersteunt FTPS. Spijtig ondersteunen ze niet een belangrijk optie van het protocol, namelijk de “TLS Session Reuse” tussen commando en gegevens kanalen.
Voor Java versie > JDK 1.5 bestaat er een fix (ingrijpen op SSL Session Cache van Java): Stackoverflow .
Dit fix breed uit de FTPSClient
class van Commons Net. Die uitbreiding maakt gebruik van de Java reflection functionaliteit om de intern cache van javax.net.ssl.SSLSession
in te vullen met telkens de zelfde SSL session zo dat die sessie wordt erbruikt voor de gegevens kanaal.
Voor Java versie na JDK 8u161, moet er een bijkomend globaal variabel wijziging komen:
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
Opletten dat dit fix gebruikt “reflection”. Dit betekent dat uw JVM policy moet dit toelaten. (Standaard JVM’s laten dit toe, maar als de JVM geleverd is met een andere product, een ERP of iets gelijkaardig, het zou mogelijk dat de standaard policy moet aangepast worden). Dit fix maakt ook assumpties over hoe de JVM intern werkt. Dit is niet gegarandeerd om zo te blijven (in praktijk is het redelijk stabiel). Er moet dus met elk upgrade van de JVM of de Apache library een test gebeuren om ervoor te zorgen dat FTPS connectie met TLS session reuse nog werkt. De nodige functionaliteit in Apache Commons Net is hier op te volgen: https://issues.apache.org/jira/browse/NET-408
De bovenvermelde fix is gekend te werken op de volgende JVM:
1.8
< 1.8.0_161
1.8.0_241
1.8.0_271
11
OpenJDK 11.0.2
12
12.0.1
15
OpenJDK 15.0.1
Meerdere versie van Apache Commons Net werken met de TLS Session Reuse patch. De laatste die getest is geweest is versie Apache Commons Net 3.6.
Voorbeeld van FTPS Client met Apache Commons Net
Een voorbeeld van hoe een FTPS client moet opgezet worden met Apache Commons Net, samen met de TLS Session Reuse patch, kan gevonden worden op de volgende URL: Patching TLS session resumption on Apache Commons Net FTPSClient
Andere code voorbeeld:
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
FTPSClient client = new MyPatchedFTPSClient();
client.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
client.connect("192.168.1.45");
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
// Handle error
return;
}
client.login("myuser", "mypassword");
// Volgende lijnen zijn nodig om de PASV connectie
// correct op te zetten
client.execPBSZ(0);
client.execPROT("P");
client.enterLocalPassiveMode();
FTPFile[] files = client.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
client.logout();
.Net Libraries
De aanbevolen library voor FTPS is de WinSCP .Net Assembly: https://nugetmusthaves.com/Package/WinSCP
Een andere library die zou ook moeten werken is de Rebex FTP SSL library: https://nugetmusthaves.com/Package/Rebex.Ftp
Dat laatste is niet een opensource library en is betalend.
Andere libraries zoals FluentFTP werken niet proper met FTPS omdat zij geen “TLS Session reuse” ondersteunen. Het onderliggend probleem is dat de Microsoft .Net implementatie van SSL ondersteunt geen session reuse tussen verschillende poorten. Wat nodig is voor FTPS (b.v. zelfde sessie tussen Control en data poorten).
Related pages
Voor vragen of opmerkingen kan u de MAGDA helpdesk contacteren
De MAGDA Gebruikersomgeving is een officiële website van de Vlaamse overheid
uitgegeven door Digitaal Vlaanderen