HTTPS Server - Tutorial oder funktionierendes Sample?

Alle Fragen zur Netzwerkkommunikation
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Ich komme da im Moment nicht recht weiter.

Am Weitesten scheint mir das Sample unter Synapse\source\demo\httpsserv zu gehen, es ist aber für Delphi und der Code läuft bei mir nicht ohne Weiteres:

Code: Alles auswählen

procedure TTCPHttpThrd.Execute;
var
  timeout: integer;
  s: string;
  method, uri, protocol: string;
  size: integer;
  x, n: integer;
  resultcode: integer;
begin
  timeout := 1000;

  // Note: There's no need for installing a client certificate in the
  //       webbrowser. The server asks the webbrowser to send a certificate but
  //       if nothing is installed the software will work because the server
  //       doesn't check to see if a client certificate was supplied. If you
  //       want you can install:
  //
  //       file: c_cacert.p12
  //       password: c_cakey
  //
  Sock.SSL.CertCAFile := ExtractFilePath(ParamStr(0)) + 's_cabundle.pem';
  Sock.SSL.CertificateFile := ExtractFilePath(ParamStr(0)) + 's_cacert.pem';
  Sock.SSL.PrivateKeyFile := ExtractFilePath(ParamStr(0)) + 's_cakey.pem';
  Sock.SSL.KeyPassword := 's_cakey';
  Sock.SSL.verifyCert := True;

  try
    if (not Sock.SSLAcceptConnection) or
       (Sock.SSL.LastError <> 0) then
    begin
      MessageDlg('Error while accepting SSL connection: ' + Sock.SSL.LastErrorDesc, mtError, [mbAbort], 0);
      Exit;
    end;
  except
    MessageDlg('Exception while accepting SSL connection', mtError, [mbAbort], 0);
    Exit;
  end;
  
  ...
  
  
Ich hatte erst mal einige Mühe, OpenSSL eingebunden zu bekommen (es reicht wohl - zumindest unter Windows 10 - überraschender Weise nicht, wenn die OpenSSL Libraries im PATH eingebunden sind) und passende Zertifikate zu generieren, vor allem das s_cabundle.pem gibt mir Rätsel auf, weil es zwei Zertifikate enthält, aber der Code läuft auch sonst nicht ohne Weiteres: MessageDlg läuft unter Lazarus auf eine Exception die ich so interpretiere dass man MessageDlg nur aus dem HauptThread aufrufen darf. Wenn das richtig ist, müsste ich hier einiges ändern um die Messages in den Hauptthread zu schaffen. Außerdem scheint - anders als das im Kommentar ausdrücklich steht - der Client sehr wohl auch ein Zertifikat zu brauchen, jedenfalls wenn man dem Code unter dem Kommentar folgt.

Ich würde - wenns sonst nichts direkt ausgereift Verwertbares gibt - das Beispiel nach Lazarus übersetzen, unter WIndows und Linux testen, und den Code dann ins Wiki einpflegen, da klafft meiner Meinung nach ein Loch.

https://wiki.freepascal.org/Networking# ... er_example

zeigt einen HTTP Server, der im Inhaltsverzeichnis versprochene HTTPS Teil fehlt, es ist nur ein bisschen was da zum Thema HTTPS Client. Ich kann jedenfalls sagen, dass das Einhängen der SSL Units per uses keinesfalls ausreicht, um SSL Support ans Laufen zu bekommen.

Armin.
Zuletzt geändert von Nimral am Do 16. Dez 2021, 07:32, insgesamt 1-mal geändert.

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von sstvmaster »

Hier gibts auch noch Info wie man aus dem HTTP Server einen HTTPS Server macht.
- http://www.ararat.cz/synapse/doku.php/p ... ttpsserver

Und hier habe ich eine Version von synapse gefunden wo openssl 1.1 wurde. Damit sollten dann auch TLS 1.3 funktionieren.
- https://sourceforge.net/p/synalist/code ... ree/trunk/
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Danke für die beiden Links! Das schaut sehr nützlich aus!

Wegen dem MessageDlg Problem starte ich einen separaten Thread.

HG, Armin

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von theo »

Es gibt in "/fpcsrc/packages/fcl-web/examples/simpleserver/" eine Demo, die mir mindestens auf Linux besser scheint.
Ist allerdings ohne Synapse.

Ich habe mal das "komische Zeug" oben auskommentiert

Code: Alles auswählen

{ $DEFINE USEGNUTLS}
{ $DEFINE USEMICROHTTP}    
Mit

Code: Alles auswählen

./simpleserver -p 8081 
auf der Konsole geht das schon mal und loggt auch.
Wenn man Port 80 oder 443 bedienen will, muss man root sein. Das mit den SSL Cert. habe ich auch nicht begriffen, aber es könnte zu schaffen sein.

Siehe dort auch README.txt

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Warf »

Ich kann nur empfehlen was ich immer empfehle an dieser stelle, am besten die server nur als HTTP server zu entwickeln und dann hinter einen Reverse proxy zu setzen.

Ist generell einfacher, da man die komplette entwicklungszeit auf HTTP arbeiten kann, sicherer, da die großen webserver wie nginx deutlich besser getestet sind als die FPC software, sowie immer die neusten protokolle, z.B.TLS 1.3 unterstützen, und portabler, da man den server einfach als docker deployen kann. Außerdem macht das das einsetzen von middleware wie loadbalancern sehr viel einfacher.

Grundsätzlich gibt es keinen grund keinen reverse proxy zu verwenden, und wenn man einen verwendet löst sich das HTTPS problem auch von selbst

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Ich habe auf der Muss-Liste des Auftraggebers ganz oben stehen: eine Installationsfreie .exe, die auch von Fast-Laien installiert werden kann, sofern sie eine möglichst kurze Minimalliste von "Prerequisites" abarbeiten können. Außerdem habe ich genügend Zeit bekommen, dass ich möglichst viel mit eigenem Code machen kann, in der Hoffnung dass sich das später auszahlt dadurch, dass man nicht die Nickligkeiten von x zusammengestöpselten Diensten ertragen bzw. sich um sie herum arbeiten muss. Verträgt sich das mit einem Reverse-Proxy?

Ich glaube, ich kann mein Ziel durchaus erreichen, und es außerdem so machen dass ich SSL nach Bedarf an- und ausknipsen kann. Das werden die Clent-Entwickler, die ab Januar losgehen, bei der Fehlersuche zu schätzen wissen.

Im Moment kämpfe ich - wie immer wenn man sich in ein neues Thema einarbeitet - mit Anfangshürden, die schauen aber lösbar aus. Parallel versuche ich immer "Make Pascal Great Again", die bestehenden, meiner Meinung nach absolut ungenügenden Einsteigerdokus zu verbessern.
Zuletzt geändert von Nimral am Do 16. Dez 2021, 15:38, insgesamt 1-mal geändert.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

theo hat geschrieben:
Do 16. Dez 2021, 13:01
Es gibt in "/fpcsrc/packages/fcl-web/examples/simpleserver/" eine Demo, die mir mindestens auf Linux besser scheint.
Ist allerdings ohne Synapse.
Ich glaube, an denen bin ich vor etwa 2 Wochen vorbei gekommen, lief wegen einer Abhängigkeit zu fp_async nur mit Linux. Ich probiers aber gleich nochmal und sag dann Bescheid.

Ich brauche Linux und Windows gleichermaßen.

** Update**: nein, fp_async war ein anderes, nicht lauffähiges Sample. Der Simpleserver scheitert out of the Box an einer fehlenden libmicrohttpd-10.dll. Jetzt gehts wieder von vorne los: wo kommt das her, warum fehlt es, warum steht nix im Readme, gibt es das überhaupt (für WIndows und Linux).
2021-12-16 15_47_32-C__lazarus_fpc_3.2.2_source_packages_fcl-web_examples_simpleserver_simpleserver..png
2021-12-16 15_47_32-C__lazarus_fpc_3.2.2_source_packages_fcl-web_examples_simpleserver_simpleserver..png (15.41 KiB) 3735 mal betrachtet
Ein schneller Browse durch den Code hat immerhin gezeigt, dass da ebenfalls SSL möglich wäre, mal sehen ob ich irgendwas rausziehen kann was mir weiter hilft.

Armin.

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Ich habs gefunden:

https://www.gnu.org/software/libmicrohttpd/

Eigentlich Linux, aber es gibt auch eine Binary für Windows.

Ich könnte also, um das Problem einer nicht vorhandenen SSL dll zu umgehen, eine andere nicht vorhandene dll ins Spiel bringen, wobei es nicht unwahrscheinlich ist, dass ich danach die beiden SSL DLLs trotzdem noch verwalten muss :-)

--> scheint mir im Moment komplizierter, als dort weiterzumachen wo ich zuletzt war, und weniger ergiebig um später ein Tutorial für das Wiki abzuzweigen.

Danke dennoch für den Tipp!

Armin.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von theo »

Habe ich doch oben schon geschrieben:
Ich habe mal das "komische Zeug" oben auskommentiert

{ $DEFINE USEGNUTLS}
{ $DEFINE USEMICROHTTP}
viewtopic.php?p=125389#p125389

Einfach USEMICROHTTP in den defines auskommentieren.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Warf »

Nimral hat geschrieben:
Do 16. Dez 2021, 15:33
Ich habe auf der Muss-Liste des Auftraggebers ganz oben stehen: eine Installationsfreie .exe, die auch von Fast-Laien installiert werden kann, sofern sie eine möglichst kurze Minimalliste von "Prerequisites" abarbeiten können. Außerdem habe ich genügend Zeit bekommen, dass ich möglichst viel mit eigenem Code machen kann, in der Hoffnung dass sich das später auszahlt dadurch, dass man nicht die Nickligkeiten von x zusammengestöpselten Diensten ertragen bzw. sich um sie herum arbeiten muss. Verträgt sich das mit einem Reverse-Proxy?
Also kommt drauf an wie das mit minimale prerequisites aussieht, da das die existenz eines webservers (apache oder nginx) vorraussetzt.
Wenn ein solcher webserver exisitert, ist das ganze zwar nicht ganz eine exe, sondern benötigt noch eine konfigurationsdatei, ist aber dann in der benutzung trozdem einfach config in dern webser config ordner kopieren und dann einmal die exe doppelklicken, ist also für jeden Laien anwendbar.

Wenn der Kunde allerdings keinen webserver vorinstallieren will, ist das wohl keine option. Wobei du natürlich klarstellen solltest das das dann auf kosten von sicherheit (besser getestet, aktuelle TLS versionen), effizienz (besser optimiert, aktueller protokoll support wie HTTP/2 und TLS 1.3) und komplexität (da du features die sonst NGINX bereitstellst selbst einbauen musst) geht.
Letztenendes bezahlt er ja auch dann für die Mehrentwicklung und Wartung eines komplexeren systems.

Ansonsten, bezüglich dem eine exe, hast du sowieso das problem das du sehr wahrscheinlich SSL bibliotheken in form von DLLs mitliefern musst. Da würde grundsätzlich eine Installation sinnvoll. Alternativ könntest du ein selbstentpackendes zip bauen das in einen Temporären ordner entpackt mit allen dateien und co und dann den server startet. Ist aber keine schöne lösung und da leuchten dir wahrscheinlich die Virenscanner auf wie ein Weihnachtsbaum

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

@Theo: Ok, hatte ich überlesen, sorry :-) Jetzt geht es - irgendwie.

Ich hab das Programm gestartet, er wollte ein hart codiertes Verzeichnis c:\temp in das er dann eine Klartext-Kopie meines Zertifikates packt (ist das Absicht?), http geht, https geht leider nicht. Erwartungsgemäß mäkelt der Browser (probiert: Firefox, Chrome, Edge (Chromium), Internet Explorer 11) wegen dem self-signed Zertifikat. Danach stecke ich wieder mal fest, weil er Self-Signed Zertifikate verteilt welche die neueren Browser nicht haben wollen. Ich habe Zertifikate ausstellen lassen (-H) für localhost, meinen Computernamen friendly und meinen Computernamen als FQDN, das hat alles nichts geändert.

- Chrome und Edge (Chromium) beschweren sich, und dann fehlt die sonst übliche Option, das Zertifikat zu akzeptieren, und die Seite trotzdem zu besuchen
- Firefox (95.0) zeigt die übliche Warnungs-Seite, im Hintergrund läuft allerdings der HTTP Server in eine Exception, weswegen der Browser clientseitig hängt. Ich kann das Zertifikat nicht akzeptieren.
- Ausgerechnet Internet Explorer 11 funktioniert wie gewohnt, ich kann eine Ausnahme eintragen und er zeigt die index.html Seite an.

Jetzt rächt sich das rundum-sorglos Paket von simpleserver, normalerweise wüsste ich wo ich hinfassen müsste um Zertifikate zu erzeugen und damit herumzuspielen, so muss ich jetzt einige 1000 Zeilen fremden Code umackern um herauszufinden, wo das Zertifikat herkommt und ob man ihm irgendwie ein anderes, Microsoft und Google genehmeres Self-Signed Zertifikat unterschieben kann, ob man den Programmteil, der das Zertifikat generiert, anpassen kann, oder ob es bei Microsoft und Google ohne offizielles Zertifikat neuerdings auch für Entwickler nicht mehr geht (was ich bezweifle). Und warum Firefox den Server in eine Exception laufen lässt, ist auch noch ein Thema.

Das Server-Log auf dem Bildschirm ist leider keine Hilfe.

Mein Eindruck: der Server ist vermutlich ziemlich gut (er läuft nach der Firefox-Exception augenscheinlich weiter), aber er eignet sich nicht als Lernprojekt. Ich denke, ich mache mit der anderen Demo weiter, da ist der Code weniger komplex und ich finde mich bei Problemen eher zurecht.

Armin.
Dateianhänge
Mit Edge (Chromium) und Chrome ist Schluss - kein Weg, das Self-Signed Zertifikat zu akzeptieren, obwohl laut Doku eine Option dafür da sein sollte. Ist das Zertifikat irgendwie &quot;falsch&quot; Self-Signed?
Mit Edge (Chromium) und Chrome ist Schluss - kein Weg, das Self-Signed Zertifikat zu akzeptieren, obwohl laut Doku eine Option dafür da sein sollte. Ist das Zertifikat irgendwie "falsch" Self-Signed?
2021-12-16 20_45_21-(7) HTTPS Server - Tutorial oder funktionierendes Sample_ - Deutsches Lazarusfor.png (21.3 KiB) 3681 mal betrachtet
Firefox-Spezialproblem: bevor ich das Zertifikat akzeptieren kann, schmiert serverseitig etwas ab.
Firefox-Spezialproblem: bevor ich das Zertifikat akzeptieren kann, schmiert serverseitig etwas ab.
2021-12-16 20_14_39-Lazarus IDE v2.2.0RC2 - simpleserver (debugging ...).png (6.52 KiB) 3684 mal betrachtet
Der alte Internet-Explorer funktioniert wie erwartet... ich lasse die &quot;Webseite weiter laden&quot; und danach wird index.html angezeigt.
Der alte Internet-Explorer funktioniert wie erwartet... ich lasse die "Webseite weiter laden" und danach wird index.html angezeigt.
2021-12-16 20_06_48-Diese Website ist nicht sicher. - Internet Explorer.png (33.85 KiB) 3684 mal betrachtet

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von theo »

Bei mir geht's.
Habe der THTTPApplication die Cert.-Dateipfade direkt verklickert:

Code: Alles auswählen

  CertificateData.Certificate.FileName :='/home/theo/install/sslcert/RootCA.pem';
  CertificateData.PrivateKey.FileName:='/home/theo/install/sslcert/RootCA.key'; 
S.a. https://gist.github.com/cecilemuller/94 ... b26656c4f8

Dann starte ich so, als Superuser

Code: Alles auswählen

./simpleserver -p 443 -s -H localhost -d /home/theo/lazarus/3rd/simpleserver/public_html/
Natürlich mosert der Browser wegen der Zertifizierungsstelle, aber wenn man das akzeptiert, dann ist's gut.
Dateianhänge
httpslaz2.png
httpslaz2.png (74.5 KiB) 3669 mal betrachtet
httpslaz.png
httpslaz.png (65.2 KiB) 3672 mal betrachtet

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Auf meiner Windows Maschine klappts leider nicht, und es scheint mit dem Zertifikat zusammenzuhängen. Auch meine Fritzbox hat ein self-signed Zertifikat. Damit haben die Browser kein Problem. Die nachfolgenden Screenshots stammen aus Internet Explorer 11 und Edge (Chromium), Chrome macht genau das Selbe.

Mit der Fritzbox klappt es wie zu erwarten war:
2021-12-16 21_32_17-Datenschutzfehler - Persönlich – Microsoft​ Edge.png
2021-12-16 21_32_17-Datenschutzfehler - Persönlich – Microsoft​ Edge.png (64.08 KiB) 3663 mal betrachtet
mit dem Simpleserver nicht:
2021-12-16 21_37_43-Einstellungen.png
2021-12-16 21_37_43-Einstellungen.png (91.49 KiB) 3663 mal betrachtet
Wie man sieht, fehlt in den Chrome basierten Browsern die Option, das Zertifikat zu akzeptieren. Firefox habe ich für den Moment mal zu Seite gelegt, das scheint noch ein anderes Problem zu sein.

Für heute mache ich Schluss, ich probiers morgen Nachmittag ob ich mit selbst erzeugten Zertifikaten ggf. mehr Glück habe, und wenn ja, wie genau sie sich von den von SimpleServer erzeugten unterscheiden. Danke für die Anleitung und die Dateipfade!

HG, Armin.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von theo »

Hab's noch ein wenig besser hingekriegt.
Wenn man sich bei Firefox als Zertifizierungsstelle einträgt, sieht nachher alles recht normal aus.
Das "Schloss" ist dann zu.
Dateianhänge
httpslaz3.png
httpslaz3.png (32.73 KiB) 3641 mal betrachtet
httpslaz4.png
httpslaz4.png (36.19 KiB) 3641 mal betrachtet

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: HTTPS Server - Tutorial oder funktionierendes Sample?

Beitrag von Nimral »

Ich gebe mal den neuesten Stand durch.
Nimral hat geschrieben:
Mi 15. Dez 2021, 18:54
Ich hatte erst mal einige Mühe, OpenSSL eingebunden zu bekommen (es reicht wohl - zumindest unter Windows 10 - überraschender Weise nicht, wenn die OpenSSL Libraries im PATH eingebunden sind)
Das nehme ich zurück, und behaupte ab sofort dass Gegenteil. Ich hatte die Fehlermeldung "error:02001002:system library:fopen:No such file or directory" so interpretiert, dass die SSL DLLs nicht gefunden wurden, aber sie meint, dass die Zertifikate nicht gefunden wurden. Wenn die beiden (oder eine der beiden) SSL DLLs nicht gefunden werden, erfolgt sinniger Weise keine Fehlermeldung, erst wenn man SSL dennoch benützt (SSLAcceptConnection) bekommt man die irreführende Fehlermeldung "SSL/TLS support is not compiled". SSL.LibVersion gibt in diesem Fall "Without SSL support" und SSL.LibName "ssl_none" aus - es ist also kein Problem, den Computer schon beim Programmstart auf SSL Unterstützung zu testen und ein sprechendes Fehler-Log zu erzeugen.

Ansonsten fand SSL seine Libraries wie unter Windows üblich über die 3 Suchschritte "Programmverzeichnis" - "Windows\System32" - "%PATH%".

Gültige Zertifikate habe ich nach einigen weiteren Wirren (fehlende OpenSSL.conf Datei) mit der openssl Kommandozeile erzeugt bekommen.

Ich bin jetzt mit der einfacheren Demo aus Synapse (httpserv + SSL Erweiteruung wie im Synapse Wiki beschrieben) weiter gegangen, und habe damit einen funktionierenden HTTPS Server auf unterster Ebene gebaut. Für meine derzeitigen Zwecke (JSON ausliefern) reicht das vollauf.

Danke für die Hilfe!

Armin.

Antworten