Hallo,
ich hab da ein kleines Problem. Eins vorweg: Ich verwende
Indy 9 da der Protierungsaufwand bei einigen großen Projekten nicht machbar ist derzeit. Leider siehts mit der Parallelinstallation beider Indys auch nicht so rosig aus, darum bleibt es vorerst bei der 9er Version.
Auf der Serverseite habe ich einen Apache laufen, mod_ssl usw. ist alles schick konfiguriert und ein VHost eingerichtet, welcher nur auf Port 443 lauscht und nur SSL-Verbindungen annimmt. Zweitens habe ich auf dem Server mit dem aktuellen OpenSSL ein Zertifikat für die Subdomain/VHost erzeugt. Rufe ich die Subdomain im Browser auf, läuft das normale Procedere, d.h. Browser beklagt sich über den unbekannten Zertifikatsaussteller, danach steht die SSL-Verbindung. Browser-SSL-Info sagt "TLS v1.0 256 bit AES (1024 bit DHE_RSA/SHA)" wird verwendet. Soweit so gut.
Jetzt habe ich mit Delphi (7 Pro) ein kleines Testprojekt erstellt. Einen IdHTTP und einen IdSSLIOHandlerSocket aufs Formular, IdHTTP1.IOHandler auf IdSSLIOHandlerSocket1 eingestellt und IdSSLIOHandlerSocket1.OnVerifyPeer zugewiesen.
Die SSL-DLLs habe ich von
http://indy.fulgan.com/SSL/ runtergeladen und ins Projekt-EXE-Verzeichnis gelegt.
Die folgende Routine ruft dann das Test-Dokument vom Server ab:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdSSLOpenSSLHeaders.Load;
with HTTPs do begin
Host:= 'subdomain.intranet.local';
Port:= 443;
if Connected then Disconnect;
Connect;
Memo1.Lines.Add(Get('https://subdomain.intranet.local/index.html'));
Disconnect;
end;
end;
Klappt soweit auch,
HTML-Seite wird abgerufen und im Memo angezeigt. Jetzt kommt der Schlamassel: Setze ich IdSSLIOHandlerSocket1.SSLOptions.VerifyMode:= [sslvrfPeer] (oder irgendeine andere Kombination anstatt IdSSLIOHandlerSocket1.SSLOptions.VerifyMode:= []), dann knallt es jedesmal mit einer
Access Violation. Setze ich IdSSLIOHandlerSocket1.SSLOptions.Method:= sslvTLSv1, dann kommt zusätzlich noch eine EIdOSSLConnectionError
Exception. OnVerify wird nicht ausgelöst. Testweise habe ich OnVerify so gestaltet:
Delphi-Quellcode:
function TForm1.SSLVerifyPeer(Certificate: TIdX509): Boolean;
begin
with Certificate do begin
Memo1.Lines.Add(FingerprintAsString);
end;
end;
Wenn OnVerify nicht funktioniert, dann kann ich den nächsten Schritt nicht gehen, das Zertifikat zu prüfen. Damit wäre der ganze SSL-Aufwand nutzlos, ich könnte genauso gut ungesicherte Verbindungen nutzen.
Sind es mal wieder inkompatible SSL-DLLs? Zumindest die Verbindung und der Abruf als solches funktionieren ja, nur das Prüfen des Zertifikates nicht
Grüße
Cody
EDIT: Ich bin schon mal einen Schritt weiter: Wenn ich in der o.g. ButtonClick-Routine unmittelbar nach dem ersten Connect ein Memo1.Lines.Add(SSL.SSLSocket.PeerCert.Fingerprint AsString) ausführe, dann bekomme ich die Daten des Serverzertifikates. Scheinbar knallt es nur bei den Eventhandlern. Bug in
Indy 9 oder BimB (Bug in my Brain)???