2016-10-06 3 views
0

Ich benutze Delphi 10.1 Berlin und Indy 10.6.2, 32bit auf einem Windows Server 2012indy ssl delphi Server

ich einen Server basierend auf TIdHTTPServer implementiert. Funktioniert wie ein Charme für viele Jahre.

Jetzt möchte mein Kunde den Verkehr gesichert. SSL ist ein Bereich, über den ich wenig weiß.

Es gibt einige hilfreiche Hinweise im Web, die mir geholfen haben, CA-Zertifikate und Schlüsseldateien mit OpenSSL zu erstellen. Und aus mehreren Beispielen habe ich den folgenden Code zusammengefügt: TIdServerIOHandlerSSLOpenSSL. Die Cert/Key-Dateien befinden sich im exe-Verzeichnis, ebenso die OpenSSL-DLLs ssleay32 und libeay32.

Der Server antwortet auf http://localhost:8080, aber es gibt keine Antwort bei der Adressierung über https://localhost. Es verhält sich, als ob die TIdServerIOHandlerSSLOpenSSL nicht da ist. (Der IOHandler liest die Cert/Key-Dateien und es klagt, wenn ich die OpenSSL-DLLs entferne). Es ist, als hätte ich vergessen, irgendwo einen Schalter zu werfen.

Die Analyse der Windows-Netzwerkdiagnose (in IEdge) lautet: "Das Gerät oder die Ressource (localhost) ist nicht für die Annahme von Verbindungen am Port" https "eingerichtet."

Ich habe versucht, eine Nachricht über das Ereignis OnConnect zu protokollieren, aber diese Phase wird nie mit HTTPS erreicht.

Ich habe keine Ideen mehr und kann keine relevanten Vorschläge im Web finden.

Hier ist mein Code (die Komponenten sind alle in Code deklariert):

procedure TServerForm.FormCreate(Sender: TObject); 
var 
    ServerSSLIOHandler: TIdServerIOHandlerSSLOpenSSL; 
    rootdir   : string; 
begin 
    inherited; 

    rootdir:=ExtractFilePath(Application.ExeName); 

    ServerSSLIOHandler:=TIdServerIOHandlerSSLOpenSSL.Create(self); 
    ServerSSLIOhandler.SSLOptions.RootCertFile:=rootdir+'ca.cert.pem'; 
    ServerSSLIOhandler.SSLOptions.CertFile:=rootdir+'localhost.cert.pem'; 
    ServerSSLIOhandler.SSLOptions.KeyFile:=rootdir+'localhost.key.pem'; 
    ServerSSLIOhandler.SSLOptions.Method:=sslvSSLv23; 
    ServerSSLIOhandler.SSLOptions.Mode:=sslmServer; 
    ServerSSLIOhandler.OnGetPassword:=NIL; 
    ServerSSLIOhandler.OnVerifyPeer:=OnVerifyPeer; 

    HTTPServer:=TIdHTTPServer.Create(self); 
    HTTPServer.IOhandler:=ServerSSLIOHandler; 
    HTTPserver.Bindings.Add.Port:=443; 
    HTTPserver.Bindings.Add.Port:=8080; 
    HTTPServer.Active:=True; 
    HTTPServer.AutoStartSession:=True; 
    HTTPServer.SessionTimeOut:=1200000; 
    HTTPserver.OnQuerySSLPort:=OnQuerySSLPort; 
    HTTPServer.OnCommandGet:=HTTPServerCommandGet; 
    ... 
end; 

procedure TServerForm.OnQuerySSLPort(APort: Word; var VUseSSL: Boolean); 
// This will not be called when the request is a HTTPS request 
// It facilitates the use of the server for testing via HTTP://localhost:8080 (i.e. without SSL) 
begin 
    VUseSSL := (APort<>8080); 
end; 

function TServerForm.OnVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth, AError: Integer): Boolean; 
begin 
    result:=AOk; 
end; 
+0

Je nachdem, was Sie mit dem Server tun müssen, können Sie die [SecureBridge-Komponente von Devart.com.] (Https://www.devart.com/sbridge/) ausprobieren. Sie können damit einen sicheren FTP- oder SSH-Server einrichten. – ByteArts

+0

Wenn das OnConnect-Ereignis nicht ausgelöst wird, stellt der Browser keine Verbindung zum Server her. Das hat nichts mit SSL selbst zu tun. Verwenden Sie 'netstat', um sicherzustellen, dass der Server Port 443 tatsächlich öffnet und abhört. Wenn dies der Fall ist und der Browser keine Verbindung zu diesem Port herstellt, ist der Browser fehlerhaft. Edge hat Probleme bei der Verwendung von SSL auf localhost. Versuchen Sie, die tatsächliche IP-Adresse Ihres PCs anstelle von localhost in der URL anzugeben. Oder konfigurieren Sie Edge, um localhost in die Internetzone zu stellen. Eine Google-Suche zeigt viele Probleme und Vorschläge zu diesem Thema. –

+0

Sie müssen möglicherweise auch Port 80 anstelle von 8080 öffnen, wenn Edge versucht, auf HTTP zurückzugreifen, wenn HTTPS fehlschlägt. Außerdem sollten Sie den Server nicht aktivieren, bevor Sie seine Eigenschaften und Event-Handler zugewiesen haben. Sobald Sie 'Active: = true' festgelegt haben, ist es für Unternehmen geöffnet, sodass Sie nicht riskieren möchten, dass Clients eine Verbindung herstellen, bevor Sie tatsächlich für sie bereit sind. –

Antwort

0

Danke. Remys Bemerkung über OnConnect und sein Vorschlag, netstat zu verwenden, machten den Trick. I.e. es führte mich zu entdecken, dass das Problem woanders war. In der Vergangenheit musste ich von Port 80 wegziehen, weil er von einem Windows-Dienst verwendet wurde. Von da an habe ich eine Portnummer (8080) in einer Ini-Datei angegeben und wie folgt gehandelt. Code:

prt:=parameters.ReadInteger('settings','port',80); 
if prt<>HTTPserver.DefaultPort 
    then begin HTTPserver.Active:=false; 
       HTTPserver.Bindings.Clear; 
       HTTPserver.DefaultPort:=prt; 
       HTTPserver.Active:=true; 
     end; 

Da dieses Stück Code war immer noch da, offensichtlich nur das angegeben Port (8080) aktiv war. netstat offenbarte dies sofort. Glaubst du, dass ich sehr glücklich bin mit deiner schnellen Antwort?

Verwandte Themen