Ü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.