Einzelnen Beitrag anzeigen

mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Let's Encrypt Zertifikat für die Nutzung in TIdServerIOHandlerSSLOpenSSL

  Alt 12. Jun 2019, 19:19
Über den Web-Client (https://zerossl.com/) habe ich mir nun ein Let's Encrypt Zertifikat erstellt, und wie man im Screenshot (erster Anhang) sieht, umfasst die Zertifikatskette zwei Zertifikate, ein Intermediate Zertifikat von Let's Encrypt und ein Root-Zertifikat von DST.

Das Intermediate muss man als PEM Datei Indy bekannt machen - das Root-Zertifikat sollte der Browser bereits 'kennen' (es ist mitgeliefert, oder im Betriebssystem installiert).

Aktuelle Intermediate Certificate kann man laut Information auf https://letsencrypt.org/certificates/ downloaden. Für das zuvor bei zerossl erzeugte Zertifikat benötigt man dieses:

https://letsencrypt.org/certs/lets-e...signed.pem.txt (siehe zweites Bild im Anhang)

Dieses Intermediate Certificate ist cross-signiert von IdenTrust. Dadurch sollte es in allen gängigen Browsern akzeptiert werden ("In order to be broadly trusted right away, our intermediate is also cross-signed by another certificate authority, IdenTrust, whose root is already trusted in all major browsers.")

Damit sollte Indy funktionieren:

Delphi-Quellcode:
program IndyHttpsTest;

{$APPTYPE CONSOLE}

uses
  IdSSLOpenSSL,
  IdGlobal, IdHTTPServer,
  SysUtils, Classes, ShellAPI;

procedure Start;
var
  IOHandler: TIdServerIOHandlerSSLOpenSSL;
  Server: TIdHTTPServer;
begin
  // OpenSSL Handler erzeugen
  IOHandler := TIdServerIOHandlerSSLOpenSSL.Create;
  IOHandler.SSLOptions.CertFile := 'cert.pem'; // umbenanntes Domänen-Zertifikat von Let's Encrypt
  IOHandler.SSLOptions.KeyFile := 'key.pem'; // umbenannt, war domain-key.txt (von zerossl)
  IOHandler.SSLOptions.RootCertFile := 'cacert.pem'; // umbenannt, war lets-encrypt-x3-cross-signed.pem.txt
  IOHandler.SSLOptions.Mode := sslmServer;

  Server := TIdHTTPServer.Create;
  try
    Server.DefaultPort := 443;
    Server.IOHandler := IOHandler;
    Server.Active := True;

    // start the server
    WriteLn(Format('Server is listening on port %d', [Server.DefaultPort]));

    // launch browser
    ShellExecute(0, 'open', PChar('https://127.0.0.1'), '', '', 0);

    // terminate
    WriteLn('Hit any key to terminate.');

    ReadLn;
  finally
    Server.Active := False;
    Server.Free;
  end;
end;

begin
  try
    Start;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
Wenn man diese Anwendung startet, sollte sich der Standardbrowser öffnen und eine Warnung anzeigen. Da mein Beispiel-Zertifikat auf die Domäne "habarisoft.com" ausgestellt wird, und nicht für "127.0.0.1".

Chrome zeigt dann eine Warnung an (siehe Anlage 3):

Zitat:
This server could not prove that it is 127.0.0.1; its security certificate is from habarisoft.com. This may be caused by a misconfiguration or an attacker intercepting your connection.
In Chrome kann man sich das Zertifikat anzeigen lassen (Klicken auf das Warndreieck links vor dem Adress-Eingabefeld). Das Zertifikat und seine certificate chain sind gültig (Anlage 4 und 5). Nach diesem Test könnte man die drei Dateien nun auf den Produktivserver hochladen und dort im Webserver installieren.
Miniaturansicht angehängter Grafiken
cert.png   intermediate.png   warn.png   chrome1.png   chrome2.png  

Michael Justin
habarisoft.com

Geändert von mjustin (13. Jun 2019 um 06:13 Uhr)
  Mit Zitat antworten Zitat