Hallo,
per TRestClient/TRestRequest greifen wir auf eine Schnittstelle eines Kunden zu, derzeit noch per HTTP. Wenn unser Schnittstellen-Programm produktiv gehen soll, dann soll es aber per HTTPS arbeiten. Dazu stellt uns der Betreiber der Schnittstelle dann ein "Zertifikat" zur Verfügung. Damit habe ich bisher keine Erfahrung. Leider habe ich auch auf mehrfache Anfrage dieses Zertifikat nocht nicht erhalten und kann mir so noch keine Vorstellung davon machen, was das eigentlich genau ist (vermutlich eine Datei, so stelle ich mir das vor). Ich wurde lediglich gefragt, ob wir ein Zertifikat in unsere Anwendung einbinden könnten. Ich wüsste aber nicht wie man in Delphi Seattle ein solches einbindet (irgendwo in den Projektoptionen oder so).
Nun bin ich der Spur
http://docwiki.embarcadero.com/RADSt...oraussetzungen nach gegangen, und habe mir eine TIdHTTP und eine TIdSSLIOHandlerSocketOpenSSL-Komponente aufs Formular gepappt, aber welche Properties muss ich nun wie füllen?
Delphi-Quellcode:
object IdHTTP: TIdHTTP
IOHandler = IdSSLIOHandlerSocketOpenSSL
AllowCookies = True
ProxyParams.BasicAuthentication = False
ProxyParams.ProxyPort = 0
Request.ContentLength = -1
Request.ContentRangeEnd = -1
Request.ContentRangeStart = -1
Request.ContentRangeInstanceLength = -1
Request.Accept = '
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
Request.BasicAuthentication = False
Request.UserAgent = '
Mozilla/3.0 (compatible; Indy Library)'
Request.Ranges.Units = '
bytes'
Request.Ranges = <>
HTTPOptions = [hoForceEncodeParams]
Left = 120
Top = 408
end
object IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL
MaxLineAction = maException
Port = 0
DefaultPort = 0
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 120
Top = 460
end
Letztere hat ein Property SSLOptions und darin ein "CertFile"- und ein "RootCertFile"-Property, da könnte ich mir vorstellen, dann ein "Zertifikat", wie ich es erhalten soll, einzutragen. Aber wie verbandel ich das ganze mit dem Rest der Anwendung? Wirklich was erhellendes habe ich im Netz dazu nicht gefunden. Und mit der
Indy-Doku komme ich auch nicht klar (viele Links auf der Webseite sind tot), da finde ich kein rudimentäres Beispiel, das die Verwendung von TIdHTTP oder TIdSSLIOHandlerSocketOpenSSL zeigt.
Hat jemand ein Beispiel an der Hand wie man mit TIdHTTP/TIdSSLIOHandlerSocketOpenSSL Zertifikate nutzt?
Danke. Gruß, Markus
Ich komme noch mal zurück auf meine eigene Frage. Das Problem wurde nämlich bis jetzt noch nicht gelöst. Die Schnittstelle selbst ist zwar seit Jahren im Einsatz, aber bisher halt über HTTP, ohne Zertifikat. Mein Problem ist immer noch, ich weiß nicht ob und wenn ja, was ich tun muss, um das Zertifikat, das mir die IT-Abteilung des Kunden zur Verfügung gestellt hat, zu „kommunizieren“. Das Zertifikat steckt in einer Datei mit der Endung „.CER“. Es sieht so aus:
Code:
-----BEGIN CERTIFICATE-----
[ca. 2700 Zeichen]
-----END CERTIFICATE-----
Letztlich habe ich dann in der Registry einen Eintrag der Art:
Code:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates\addressbook\Certificates\[40 Zeichen]]
"Blob"=hex:[Hex-Werte]
Die Schnittstelle selbst arbeitet mit den Komponenten „TRestClient“, „TRestRequest“ und „TRestResponse“. Wie gesagt, seit Jahr und Tag per HTTP ohne Probleme.
Wenn ich jetzt einfach die
URL die ich habe, umstelle von:
Code:
http://1.1.1.1/dings/v1.1
auf:
Code:
https://1.1.1.1/dings/v1.1
und dann das „Execute“ des TRESTRequest absetzte erhalte ich:
Code:
Modul: REST-Anforderung fehlgeschlagen: Unspecified certificate from client
Was bedeutet die Fehlermeldung nun konkret? Was ist da „unspezifiziert“?
Erschwerend kommt hinzu, dass ich von meinem Entwicklungsrechner aus per VPN mit der Kundeninfrastruktur verbunden bin. Aus Erfahrung weiß ich, dass es bei einigen Dingen schon einen Unterschied gemacht hat, ob man direkt im entsprechenden Zielnetzwerk unterwegs ist oder eben von „außen“ per VPN kommt.
Leider kann mir die Kunden-IT auch nicht wirklich weiter helfen.
Es wurde z. B. empfohlen mal mit einer PowerShell eine Abfrage an die Schnittstelle abzusetzen, um sozusagen das prinzipielle Funktionieren des Zertifikates zu testen:
Code:
Invoke-WebRequest -
Uri "https://1.1.1.1/dings/v1.1" -Certificate 'Cert:\CurrentUser\[40-Zeichen]'
Das liefert mir aber:
Code:
> PS C:\WINDOWS\system32> Invoke-WebRequest -
Uri "https://1.1.1.1/dings/v1.1" -Certificate 'Cert:\CurrentUser\[40-Zeichen]'
> Invoke-WebRequest : Der Parameter "Certificate" kann nicht gebunden werden. Der Wert
> "Cert:\CurrentUser\[40-Zeichen]" kann nicht in den Typ
> "System.Security.Cryptography.X509Certificates.X509Certificate" konvertiert werden. Fehler: "Das angegebene Pfadformat
> wird nicht unterstützt."
> In Zeile:1 Zeichen:85
> + ... Certificate 'Cert:\CurrentUser\[40-Zeichen] ...
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
> + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
Da bin ich mit meinem Latein am Ende.
Ich setze noch Delphi 10 Seattle ein. Lässt sich mein Problem durch Umstieg auf die aktuelle Version lösen?
Oder kann mir jemand aus eigener Erfahrung bestätigen, dass man, um ein Zertifikat (wie ich es oben beschrieben habe) in seinem eigenen Code zu nutzen gar nichts tun muss? Und das Zertifikat muss einfach auf dem Rechner, auf dem die HTTPS-Abfrage gestellt wird, vorhanden sein?
Danke im Voraus für etwas Erhellung. Gruß, Markus