[gelöst] Proxy mit ssh für TLS

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Proxy mit ssh für TLS

Beitrag von Tintom » 01.11.2020 14:58:15

Hallo zusammen und danke für euer Feedback!
habakug hat geschrieben: ↑ zum Beitrag ↑
31.10.2020 20:43:52
Hallo,

ich hatte bis jetzt gedacht, dass TLS 1.2 seit API LEVEL 16 (Android 4.1) unterstützt wird [1][2]. ;-)
Es ist nur nicht "enabled by default", das ist es erst ab API Level 20 (Android 4.4W).

Gruss, habakug

[1] https://developer.android.com/reference ... ocket.html
[2] https://developer.android.com/studio/releases/platforms
Der Thread ist eine gute Doku für "bekomme ich nicht hin" :(
Im Ernst: Ich habe das so verstanden, dass der Client (in diesem Fall die App) dafür zuständig ist, TLS1.2 zu implementieren. Hier sind mir die Hände gebunden. Daher der Umweg über einen Proxy. Neben der o.g. App hat z.B. auch der androideigene Browser keine Chance mehr sich auf https-Seiten zu verbinden. Ich musste als Abhilfe dafür Fennec installieren.
eggy hat geschrieben: ↑ zum Beitrag ↑
31.10.2020 18:32:37
Ohne es ausprobiert zu haben und ohne zu wissen, ob das überhaupt mit Deinem Problem zu tun hat:
Ich hab die Fehlermeldung "Invalid HTTP request form (expected: relative, got: absolute)" mal gegen $suchmaschine geworfen und die warf einiges zurück, u.a.
https://github.com/mitmproxy/mitmproxy/issues/2321
vielleicht mal das "--set keep_host_header" ausprobieren?
Danke, über den Link bin ich gestern schon gestolpert, aber der hat bei mir auch nicht weiter geholfen. Ich habe noch einmal von vorn angefangen.

Mit mitmproxy als Reverseproxy hab ich nach ein paar Stunden und selbst signierten Zertifikaten es geschafft, dass curl per https-Anfrage an den Proxy eine Seite ausgeliefert bekommen hat. Für davdroid hat das aber nicht funktioniert.

Also weiter mit nginx, mit dem ich gefühlt besser zurecht komme.
wanne hat geschrieben: ↑ zum Beitrag ↑
01.11.2020 10:43:44
Wenn du so weit gehst, dass du eh nen Debian hast kannst du auch einfach nen richtigen Reverse Proxy hinsetzen und gut ist.

Code: Alles auswählen

apt install nginx
/etc/nginx.conf dadurch ersetzen:

Code: Alles auswählen

server {
        listen [::1]:80;
        location / {
                    proxy_pass https://server.name;
  }
}

Code: Alles auswählen

systemctl start nginx
systemctl enable nginx
Dann kannst du im davdroid http://[::1]/remote.php/dav/... (also den Servername durch [::1] ersetzen) als URL eintragen und fertig.
Mit der Config bekomme ich HTML 500 Errors auf dem Client und im Log von nginx. Bei proxy_pass habe ich die Nextcloud-Domain eingetragen. Richtig oder Falsch?

Wenn ich jetzt schon den nginx habe, wie müsste denn die Konfiguration aussehen, wenn ich sämtlichen https-Verkehr über den nginx laufen lasse?
Sprich: Normale http requests laufen von Android aus, Requests mit https würde ich (ggf. auch manuell) über den Proxy schicken, der auf localhost lauscht.

Nachtrag, sofern das weiterhilft: Requests mit https bekommen einen HTTP400 error.

wanne
Moderator
Beiträge: 7447
Registriert: 24.05.2010 12:39:42

Re: Proxy mit ssh für TLS

Beitrag von wanne » 01.11.2020 19:58:40

Bei proxy_pass habe ich die Nextcloud-Domain eingetragen. Richtig oder Falsch?
Richtig.
Kannst du mal mit slash am Ende probieren?
Alose

Code: Alles auswählen

                    proxy_pass https://server.name/;
Sprich: Normale http requests laufen von Android aus, Requests mit https würde ich (ggf. auch manuell) über den Proxy schicken, der auf localhost lauscht.
Die Idee ist, dass davdroid per http mit dem nginx spricht. (Das sollte ja problemlos funktionieren) Der spricht dann https mit dem nextcloud Server.
Das ist dann btw sogar sicher. Weil http mit localhost selber reden ist unproblematisch.
Deswegen auch im Davdroid auch http statt https und [::1] statt der nextcloud domain:
http://[::1]/remote.php/dav/...
Das soll nie mitbekommen, dass es die Originale Domain gab.
Eventuell willst du auch noch ein paar Header entfernen die davdroid auf https umsteigen lassen:

Code: Alles auswählen

proxy_hide_header Alternate-Protocol;
proxy_hide_header Strict-Transport-Security;
proxy_hide_header  Public-Key-Pins;
Eventuell willst du doch mal verraten, was das für ein Server ist. Dann können andere hier nach gucken was schief geht.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: Proxy mit ssh für TLS

Beitrag von Tintom » 02.11.2020 20:52:14

Hallo zusammen,
zuerst einmal sorry für meinen Post gestern mit den spärlichen Infos. Ich war frustriert, weil ich nach dem erfolgreichen chroot dachte „cool, jetzt noch einen Proxy und in 5 Minuten läuft das Ding wieder“ und zwei Tage später war ich immer noch nicht weiter.

Ich habe mich heute noch einmal mit frischem Kopf daran gemacht, das Loglevel des nginx auf debug gesetzt und versucht Anfragen von http://google.de auf https://google.de weiterzuleiten. Dann fiel mir im Log folgendes auf:

<...>
2020/11/02 09:05:47 [alert] 7045#7045: *7 socket() failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: google.de, request: "GET http://google.de/ HTTP/1.1", upstream: "https://[2a00:1450:4001:817::2003]:443/", host: "google.de"
<...>


nginx darf keinen Socket aufmachen. Grund ist das restriktive Android-System, das erlaubt sowas nur, wenn der Nutzer in der Gruppe inet ist. Diese muss man im Debian chroot erst anlegen:
addgroup --gid 3003 inet
Anschließend fügt man den Benutzer www-data hinzu (unter dem wird nginx bei Debian ausgeführt):
adduser www-data inet
Nach einem Neustart von nginx konnte ich meine Anfragen auf https://google.de weiterleiten.

Nun also weiter mit davdroid. Davdroid und nginx meldeten 404er Fehlermeldungen im Zusammenhang mit PROPFIND. Dafür muss man noch ein paar dav-spezifische Optionen (dav_methods und dav_ext_methods) in die Config schreiben [1]

Nachdem ich die Config angepasst habe, konnte ich mich mit der Nextcloudinstanz verbinden, allerdings konnte ich keine Daten verändern, die App wurde instabil, startete ständig neu und das Log war mit HTTP400-Fehlern gespickt. Zudem war das Log voll mit Einträgen wie:

2020/11/02 13:10:01 [info] 2302#2302: *99 client sent invalid method while reading client request line, client: 127.0.0.1, server: <SERVER>, request: "qm_�)k3�/*WF���ya�ARt޳"

Letzteres konnte ich mit der Option ignore_invalid_headers on; abstellen, bei der instabilen App war ich allerdings ein wenig ratlos. In meiner Verzweiflung habe ich dann die add_header Optionen [2] in die Config eingearbeitet und hatte zu meiner Verwunderung sofort einen stabilen davdroid Clienten.

Blieb noch das Problem der nicht veränderbaren Daten. Ich bemerkte, dass sobald ich im Webinterface oder in der App auf dem Telefon Termine anlegte, diese nur manchmal übertragen wurden. Im Log fielen mir zudem solche Verbindungsabbrüche auf:

2020/11/02 19:03:32 [info] 26706#26706: *23 client 127.0.0.1 closed keepalive connection (104: Connection reset by peer)

Die Ursache der Abbrüche konnte ich nicht nachvollziehen (Internetverbindung scheint okay), aber die Synchronisation funktioniert zumindest dann zuverlässig, wenn man mit einem Cache arbeitet. Ich habe also mit mkdir -p /var/cache/nginx/temp && chown www-data /var/cache/nginx/temp zwei Ordner angelegt und die Optionen root und client_body_temp_path in die Config hinzugefügt.

Jetzt funktioniert alles so wie ich es will: davdroid spricht mit dem Proxy im chroot unverschlüsselt, der Proxy leitet alles brav an die Nextcloud-Instanz weiter.

Puuh, fünf Minuten können manchmal ganz schön lang sein :wink:

Bleibt mir nur noch zu sagen: Vielen Dank an alle Beteiligten für eure Beiträge, insbesondere an wanne!

Noch einmal alles zusammengefasst:

Konfiguration Server:

Code: Alles auswählen

# addgroup --gid 3003 inet
# adduser www-data inet
# mkdir -p /var/cache/nginx/temp
# chown www-data /var/cache/nginx/temp

# cat <<EOF > /etc/nginx/conf.d/01_reverse.conf
server {
	listen 127.0.0.1:443;
	server_name <SERVER>;
	ignore_invalid_headers on;
	location / {
		proxy_pass https://<SERVER>/;
		dav_methods PUT DELETE MKCOL COPY MOVE;
		dav_ext_methods   PROPFIND OPTIONS;
	        add_header Referrer-Policy                      "no-referrer"   always;
	        add_header X-Content-Type-Options               "nosniff"       always;
	        add_header X-Download-Options                   "noopen"        always;
	        add_header X-Frame-Options                      "SAMEORIGIN"    always;
	        add_header X-Permitted-Cross-Domain-Policies    "none"          always;
	        add_header X-Robots-Tag                         "none"          always;
	        add_header X-XSS-Protection                     "1; mode=block" always;
		root /var/cache/nginx;
		client_body_temp_path /var/cache/nginx/temp;
	}
}
EOF

Konfiguration Client:

URL: http://localhost:<PORT>/remote.php/dav/
Benutzername <USER>
Passwort: <PASSWD>


<PORT> kann ein beliebiger Port sein, <SERVER> ist die Adresse der Nextcloud-Instanz, <USER> und <PASSWD> je nach Benutzer anpassen.


[1] https://wiki.archlinux.org/index.php/WebDAV#Nginx
[2] https://docs.nextcloud.com/server/stabl ... t-of-nginx

Antworten