Cos’è FTPS?

Che cosa si intende per FTPS (noto anche come FTP SSL)? In sostanza si tratta di una variante del noto protocollo FTP alla quale viene aggiunta la gestione dei certificati al fine di ottenere un FTP “sicuro”. Originariamente il certificato usato era di tipo SSL, di recente si usa per lo più TLS.

Per ottenere una comunicazione sicura sono disponibili due modalità Implicita ed Esplicita: la modalità Implicita lavora sulla porta 990 e può usare ancora la crittografia basata su SSL (quindi supporta anche sistemi obsoleti) mentre la versione Esplicita (FTPES) lavora sulla porta 21 ed usa esclusivamente crittografia basata su TLS quindi più recente e sicura.

Ma FTPS è…. SFTP? No, nel modo più assoluto! SFTP funziona in maniera completamente diversa rispetto a FTP e FTPS e, per onor di cronaca un trasferimento FTP funzionante su connessione stabilità via SSH è un’altra cosa ancora! Per farla breve FTPS non ha più tanta ragione di esistere. Al giorno d’oggi è bene usare SFTP. Se proprio fosse necessario usare FTPS almeno conviene usare la versione esplicita FTPES.

Usare FTPS con PHP

Il fatto che questa tecnologia esista da tempo fa si che la maggior parte dei client FTP supporti FTPS nelle due modalità previste. Sia che usiate un client grafico (Filezilla?) piuttosto che una utility a riga di comando (lftp?) non dovreste avere problemi.

Se dovete usare invece PHP…. beh, le cose cambiano! La modalità implicità non è affatto supportata pertanto si arriva ad ovviare usando delle chiamate cURL del tipo:

$fp = fopen($path, 'r');
$ftp_server = 'ftps://'.$server.'/'.$filename; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $ftp_server);
curl_setopt($ch, CURLOPT_USERPWD,$user.':'.$pass);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);

$output = curl_exec($ch);
$error_no = curl_errno($ch);
//var_dump(curl_error($ch));
curl_close($ch);

Esiste anche qualcuno che ha scritto una libreria su GitHub per risolvere questo problema.

E se non funziona con PHP?

Purtroppo quest’ultima soluzione dipende molto da come è configurato l’FTP server sul backend. A me è capitato di avere a che fare con un branco di immani teste di cazzo noto provider di servizi cloud italiano i cui incompetenti scappati di casa tecnici hanno deciso di punto in bianco di effettuare alcune modifiche che hanno reso la gestione tramite PHP… impossibile! Usando un qualsiasi client nessun problema mentre usando la libreria menzionata sembra tutto filare liscio ma, ogni tipo di upload, risulta corrotto nel 90% dei casi (più il file è grande più aumenta la probabilità). Penserete a questo punto che si tratti di un mio errore… beh se fosse così, questo errore ha funzionato in produzione per più di 2 anni finché qualche appassionato nel non capire un cazzo tecnico specializzato ha deciso di rendere tutto vano.

A nulla sono false le miriadi di insulti a loro e ai loro parenti mie accorate richieste di fornire dettagli tecnici atti a risolvere il problema. Come fare in questi casi? Beh ho provato usando una normale utility di sistema. Usando linux ad esempio ho subito fatto un tentativo con lftp. Come speravo ardentemente, il tutto funziona! Il problema è: come facciamo ad interfacciare PHP con questo benedetto FTPS implicito? Fortunatamente lftp prevede una modalità “command” che consente di elencare un set di comandi FTP standard separati da punto e virgola. Ad esempio:

lftp -e 'cd <directory>; put <nome_file>; bye' -u <utente>,<password> <URL>

In questo modo è possibile predisporre il commando che ci serve e farlo eseguire da PHP tramite una system.

N.B. : quello che di fatto dice a lftp che il tipo di connessione che desideriamo è di tipo FTPS implicito è il protocollo indicato nella <URL> che deve TASSATIVAMENTE del tipo ftps://.

E così, anche questa volta, ce l’ho fatta. Ho imparato qualcosa di nuovo e spero che anche i grandissimi imbecilli tecnici del provider (di cui non indovinerete mai l’esotico nome) muoiano tra indicibili sofferenze abbiamo imparato qualcosa.

FTPS

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *