FTP via TLS unter (K)ubuntu

  • Ich hab hier einen ganz harten Fall zu Knacken. Ich nutze eine TS-853a und der FTP-Server ist aktiviert und erlaubt nur explizite TLS verschlüsselte Zugänge. Der Port ist hier 5546 (aber das tut eigentlich nichts zur Sache denke ich).
    Folgendes Szenario. Unter Windows 10 am Home-PC (12 kg Trümmer, der sich nicht bewegt), ist die NAS als Netzwerkfestplatte eingebunden und nutzt den Samba-Zugriff. Über den zugeordneten Laufwerksbuchstaben habe ich dann zB für Thunderbird den Netzwerkkalender verbunden; aber auch andere Programme greifen so auf Netzwerkdaten zu. Der Zugang wird beim Booten von Windows direkt gemountet.


    Das ganze hätte ich jetzt auch so für mein Notebook, auf dem (K)ubuntu 16.04 läuft. Da der Zugang von überall erfolgen soll, muss ich also einen dauerhaften FTP-Zugang mounten. Das ist soweit auch möglich.
    Ich habe dafür curlftpfs installiert (https://wiki.ubuntuusers.de/curlftpfs/) und halte mich auch strikt an die Anleitung, die aber nicht so recht will.


    Erstes Problem ist war der Zugang meines Accounts, da das Passwort Sonderzeichen enthielt wie "$" und ":". Das brachte das Format USER:PASSWORT@Server... wohl aus dem Konzept. Die Zugangsdaten habe ich in der netrc-Datei hinterlegt und die Fehlermeldungen dbzgl. sind verschwunden.
    Was jetzt bleibt, ist der nicht funktionierende Zugang via TLS.


    Schritt 1:

    Code
    curlftpfs -o ssl_control ftp://Benutzername:Passwort@ftp-server.de:Port/pfad_auf_dem_server/ ~/mnt


    Es kann durchaus sein, dass hier folgende Meldung auftritt:

    Code
    "Error connecting to ftp: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none"


    Bei mir sieht das so aus:


    Code
    curlftpfs -o ssl_control ftp://MEIN-FTP-SERVER-MIT-DDNS.de:5546/ ~/ARCHIV

    Benutzer und Passwort sind wie gesagt in der Datei hinterlegt. der FTP Server wird über eine DDNS angesprochen mit dem Port 5546 und das Root-Verzeichnis vom Server soll unter ARCHIV gemountet werden.


    Ich erhalte auch die obige Fehlermeldung, dass das Zertifikat nicht vorliegt. Also halte ich mich an Schritt 2


    Schritt 2: Dann muss das Server-Zertifikat heruntergeladen:

    Code
    echo | openssl s_client -connect example.org:443 | openssl x509 -out ~/serverzertifikat.pem

    und dieses dann curlftpfs mitgegeben werden. Außerdem musst curlftpfs mitgeteilt werden, dass kein eigenes Client-Zertifikat existiert und es deshalb nicht geschickt wird (natürlich kann auch mit der Option cert=pfad_und_zertifikat eines mitgegeben werden).


    Gebe ich genau den obigen Befehl ein, erhalte ich die Zertifikate der Example-Seite und es wird eine Datei "serverzertifikat.pem" angelegt. Gebe ich aber stattdessen

    Code
    echo | openssl s_client -connect MEIN-FTP-SERVER:5546 | openssel x509 -out ~/Serverzertifikat.pem

    an, dann scheitert das ganze durch die Fehlermeldung

    Code
    139992656664216:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794: unable to load certificate139887466718872:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: TRUSTED CERTIFICATE


    Ich verwende die Firmware 4.2.1 für meine TS-853a und unter Sicherheit > Zertifikat und privater Schlüssel steht "Standard-Sicherheitszertifkat". Ich bin nur etwas ratlos, da Filezilla genau mit derselben Adresse, demselben Port und Zugangsdaten eine Verbindung aufbaut und beim ersten Mal das Zertifikat runterladen möchte (siehe Bild im Anhang). Warum also schafft es curlftpfs nicht?


    Ich bin noch auf diese Anleitung aufmerksam geworden (https://www.qnap.com/en/tutori…ow.php?op=showone&cid=218), aber muss ich das denn machen, wenn der NAS nicht sowieso schon ein Zertifikat vorliegt?


    FTP.PNG


    Okay. Erstes Problem beseitigt. Ich habe versucht, das Zertifikat über den FTPS-Zugang runterzuladen. Mit einer Verbindung über den HTTPS-Port habe ich zumindest schon mal das Zertifikat runterladen können.


    Allerdings bringt mir das nichts, wenn ich nun eine Verbindung aufbauen möchte mit

    Code
    curlftpfs -o ssl,cacert=~/Zertifikat.pem,no_verify_peer ftps://MEIN-FTP-DDNS:5546/ ~/ARCHIV


    dann, erhalte ich

    Code
    Error connecting to ftp: gnutls_handshake() failed: An unexpected TLS packet was received.


    Verwende ich statt ftps ftp, also

    Code
    curlftpfs -o ssl,cacert=~/Zertifikat.pem,no_verify_peer ftp://MEIN-FTP-DDNS:5546/ ~/ARCHIV

    dann erhalte ich die Meldung

    Code
    Error connecting to ftp: SSL: certificate subject name (TS Series NAS) does not match target host name 'MEIN-FTP-DDNS.com'


    Ich bin zwar einen Schritt weiter, aber viel brachte der auch nicht. Jemand Ahnung von Fuse und Curl mit TLS?


    EDIT 2017-03-16 16:15


    Ich habe weiter rumgespielt und in der netrc-Datei einen Fehler entdeckt. Nun habe ich folgenden Befehl eingeben und die dazugehörigen Verbose-Meldungen erhalten (Info: Verbindung ohne Zertifikat oder sonstiges):


    Code
    heeroyuy@LiMo1:~$ curlftpfs -v -o ssl ftps://FTP-DDNS.com:5546/ ~/ARCHIV
    *   Trying XX.XX.XXX.XX...
    * Connected to FTP_DDNS.com (XX.XX.XXX.XX) port 5546 (#0)
    * found 173 certificates in /etc/ssl/certs/ca-certificates.crt
    * found 697 certificates in /etc/ssl/certs
    * ALPN, offering http/1.1
    * gnutls_handshake() failed: An unexpected TLS packet was received.
    * Closing connection 0Error connecting to ftp: gnutls_handshake() failed: An unexpected TLS packet was received.


    Lade ich das Zertifikat runter und versuche eine Verbindung mit eben diesem, dann kommt dieselbe Meldung, nur mit dem zusätzlichen Hinweis, dass die .pem Datei nicht gelesen werden kann. Ernsthaft, was mache ich falsch?

  • Die Lösung ist so simpel:

    Code
    curlftpfs -o ssl,no_verify_peer,no_verify_hostname ftp://FTP-Server.com:Port/ ~/ARCHIV

    Kein Zertifikat notwendig, keine Kontrolle, läuft.