![]() |
SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Moin,
ich habe die Instandhaltung für ein altes Delphi XE8 Projekt mit SOAP-Client übernommen. Ich habe nur den SourceCode und die alte Exe aber leider nicht die passende IDE. Die Exe war mit Delphi XE8 compiliert worden und scheinbar hat mein Vorgänger Änderungen in der Original soap.SOAPHTTPTrans.pas vorgenommen, um den Client in Verbindung mit dem Windows CertStore zum Laufen zu bringen. Ich habe das Projekt jetzt unter Delphi 11 zum laufen bekommen aber leider öffnet der Client nun bei jedem Request den Dialog um ein Zertifikat aus dem CertStore=scsUser und CertType:'MY' auszuwählen, was bei Verwendung als CronJob natürlich nicht so nett ist. Ich kann leider verdammt wenig zu Delphi, SOAP und Zertifikaten finden. Ältere Beiträge sind auch nicht hilfreich, weil sich scheinbar irgendwann zwischen XE8 und Delphi 11 etwas grundlegendes geändert hat. Hat vielleicht hier jemand eine Idee, wie man den Client dazu bewegen kann, das richtige Zertifikat aus dem Windows CertStore zu übernehmen, ohne einen Dialog zu öffnen? Danke schonmal :-) |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
![]() Vieles baut auf Indy auf und dort hatte sich inzwischen Massig geändert. |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Danke.
Ich habe alle Versionen seit Delphi 1. Mein Problem sind die Änderungen, die mein Vorgänger in der Original soap.SOAPHTTPTrans.pas gemacht hat, denn die habe ich nicht bekommen. Es muss doch irgendwie möglich sein ein bestimmtes Zertifikat über die Seriennummer oder den Fingerprint zu definieren und automatisiert dem Request zuzuweisen, ohne das immer der blöde Dialog kommt. Wir können natürlich auch 24/7 jemanden daneben setzen :-) Es muss ja auch nicht der Store sein. Kann man nicht einfach wie unter Linux auf ein Zertifikat in einem bestimmten Pfad verweisen? |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Achso, klang so als wenn du die nur nicht ins aktuelle Delphi rein bekommst und dann fehlt die passende XE8. :oops:
Vielleicht hilft das? ![]() ![]() ![]() Nja, falls sich nichts direkt für diese Komponente findet: Da drin wird ja bestimmt sowas wie TIdHTTP oder TIdTCPClient benutzt, bzw. im aktuellen Delphi vielleicht auch THTTPRIO, TNetHTTPClient oder TNetHTTPRequest, und dafür sollten sich Beispiele finden lassen, wie man ihnen ein Zertifikat gibt. Dann nur noch schauen, wie man das wo am Besten in die SOAP-Komponente rein bekommt. [edit] neeeee, die gehen wohl direkt auf WinInet :stupid: Zitat:
![]() |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Ist das Zertifikat in einem Zertifikatsspeicher abgelegt, auf den das Konto des CronJobs Zugriff hat? (Eventuell kann man das testen, indem man sich als eben dieser Benutzer am System anmeldet) |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Mit der alten Exe, die unter XE8 compiliert wurde, läuft es auch so wie gewünscht. Das Programm zieht sich das Zertifikat ohne Auswahldialog aus dem Store. Die neue Exe mit Delphi 11 compiliert macht auch alles was sie soll, nur leider öffnet sie immer den Dialog und man muss das Zertifikat erst mit Mausklick bestätigen. Die Ursache liegt irgendwo in der soap.SOAPHTTPTrans.pas und THTTPReqResp, die von XE8 auf Delphi11 erhebliche Unterschiede aufweist. Hat vielleicht jemand einen SOAP Client gebaut, der sich automatisch und ohne das Auswahlfenster ein Zertifikat aus dem Store holt. Was mit XE8 funktionierte muss doch auch mit Delphi11 möglich sein? |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Mit Delphi11 würde ich den Teil des Codes vermutlich sowieso nicht zum laufen bekommen, weil die so viel geändert haben. Ich hatte die leise Hoffnung, dass mit einer neuen Delphi Version der direkte Zugriff auf den CertStore irgendwie einfacher geworden ist. |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
![]() |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
![]() Mit Zertifikaten aus dem Store ging es über das entsprechende Event aber auch vorher problemlos (HTTPRIO.HTTPWebNode.OnNeedClientCertificate). Ich wollte die Zertifikate aber nicht in den Store packen müssen. |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Vielen Dank schon mal für die guten Hinweise. Ich schaue mir die an und versuche sie in die vorhandenen Sourcen zu implementieren. Wenn jemand noch gute Ideen hat, gerne immer her damit. :-)
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Ich habe nur die Methode OnNeedClientCertificate hinzugefügt und zugewiesen und jetzt kommt die Abfrage nicht mehr. Ich habe bis auf einen Kommentar aber noch nicht einmal Code innerhalb der Methode geschrieben. Läuft... aber komisch ist das schon, oder? :-)
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Er meinte wohl, wenn du direkt das Zertifikat rein gibst, anstatt es im Store zu speichern.
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Bei My kann man sich mit Mail oder Name einloggen ... in Quality nicht. :stupid:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Danke, jetzt komme ich rein :-) |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Das war leider die einfallsloseste Variante, um das Ticket zu lösen. Mit etwas mehr Einfallsreichtum hätte man auch meinen Hinweisen folgend eine umfassende und deutlich schönere Lösung machen können. Aber ich bin schon froh, dass es nun das gibt. |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Nachtrag: über Code Completion wird mir HTTPRIO1.HTTPWebNode.ClientCertificate.Filename natürlich nicht angezeigt aber im Objektinspektor habe ich es schon mal gefunden. Danke |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Delphi-Quellcode:
Wie gesagt, schön finde ich die Lösung nicht, auch wenn sie viel neu implementiert haben. Dass es z.B. Interfaces gibt, wird aber leider an einigen Stellen, an denen es sehr sinnvoll wäre, vergessen. Und an das Handle der Verbindung kommt man weiterhin nicht heran, so dass andere Dinge weiter nur über dreckigere Wege gehen.
uses
Soap.SOAPHTTPTrans; procedure TForm21.Test; begin TClientCertExt(HTTPRIO1.HTTPWebNode.ClientCertificate).FileName := 'blub'; end; |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Vielen Dank!!!!
|
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Hi zusammen,
ich muss mal dieses etwas ältere Thema aufmachen, weil mir gerade auch zum ersten Mal ein Webservice über den Weg läuft, der mit Client-Zertifikaten arbeitet. Allerdings geht es bei uns um einen REST-, nicht um einen SOAP-Service. Sehe ich das richtig, dass die in D11 offenbar umgesetzte Lösung zwar für SOAP funktionieren würde, aber es für REST nichts vergleichbares gibt und man ein Zertifikat in den Zertifikatsspeicher laden müsste? Oder übersehe ich in den REST-Komponenten irgendwas? |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Das sollte auch mit Rest gehen. Die Umsetzung passierte in den Http-Komponenten dahinter.
In jedem Fall geht es manuell, wenn man via Pointer das Handle der Verbindung extrahiert und dort das Zertifikat manuell setzt. So habe ich es bei 10.4 gelöst. |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Danke dir für die schnelle Antwort. Mit dem TRESTClient geht das dann leider nicht so einfach, weil der zugehörige eigentliche HTTP-Client "doppelt" in "private"-Feldern steckt. Doppelt, weil im TRESTClient zunächst im private-Bereich ein eigenes TRESTHTTP steht und erst das hat dann, auch wieder im "private", das eigentliche THTTPClient. Ist auch immer ein großer und etwas verwirrender Spaß beim Debuggen. ;-) Aber da kommt man so einfach nicht dran, wenn man nicht mit einer gepatchen Version der REST.HttpClient-Unit arbeiten will.
Vielleicht würde die von dir erwähnte Variante mit dem Pointer auf das Handle der Verbindung gehen, aber irgendwie stehe ich da gerade ehrlich gesagt etwas auf dem Schlauch - an das Handle der Verbindung käme ich ja auch nicht, wenn das alles so private ist, oder? Naja, es wird wohl auch erstmal damit gehen, dass wir im konkreten Fall die Zertifikate in den Winodws-Zertifikatsspeicher kippen. Aber anders wäre schon schöner. ;-) Und die Linux-Seite habe ich mir noch gar nicht angeschaut. :gruebel: |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Das meinte ich mit Pointern. Die konkrete Implementierung liegt leider unter implementation in System.Net.HttpClient.Win.pas, so dass man mit RTTI usw. nicht so einfach weiter kommt (ja, man könnte den ClassType verwenden, aber am Ende habe ich es lieber manuell gemacht). Man kann aber im Debugger ausrechnen oder im Speicher manuell nachschauen, wie viele Bytes das Feld von der Adresse des Objekts entfernt ist. Dann kann man das Feld an der Adresse auslesen. So kommt man dann darüber an das Handle in diesem Objekt. Um an den HttpClient zu kommen, kann man auch so vorgehen oder es dort mit der RTTI machen, denn die sollte dort verfügbar sein.
Natürlich muss man solche Tricks gut dokumentieren und per IFDEF auf geprüfte Delphiversionen absichern, so dass es bei einer neuen Version an der Stelle einen Fehler gibt. Dann muss man die Position der Felder mit der Version zuerst prüfen. Ab Delphi 11 kann man dann einfach TRESTHTTPExt statt TRESTHTTP verwenden, wo man entsprechende Felder zum Übergeben des Zertifikats hat. Die entsprechende Funktionalität war bereits in Delphi 10.4 vorhanden, aber leider nicht erreichbar... |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Hm, TRESTHTTPExt kann ich bei mir nicht finden. Ist das ein Record Helper, den die erst in D11.3 eingebaut haben? Wir sind noch mit 11.2 unterwegs. Oder ich stelle mich zu blöd an.
Aber in D12 ist "ClientCertificatePath", "ClientCertificatePassword" und "ClientCertificateStream" tatsächlich eine public Eigenschaft vom TRESTClient - die scheinen da also etwas aufgeräumt zu haben. Insofern Danke, dass du damals das Ticket erstellt und mich gerade in die richtige Richtung geschubst hast. :-) |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
Zitat:
Delphi-Quellcode:
TRESTHTTPExt = class(TRESTHTTP)
private FClientCertificatePassword: string; FClientCertificatePath: string; FClientCertificateStream: TStream; procedure SetClientCertificatePath(const AValue: string); procedure SetClientCertificateStream(const AValue: TStream); public property ClientCertificateStream: TStream read FClientCertificateStream write SetClientCertificateStream; property ClientCertificatePath: string read FClientCertificatePath write SetClientCertificatePath; property ClientCertificatePassword: string read FClientCertificatePassword write FClientCertificatePassword; end; |
AW: SOAP THttpReqResp mit Certificate (Windows CertStore scsUser)
So, bei uns wurde das Thema mit den Clientzertifikaten nun auch noch ernster. Bis das bei uns alles wie gewünscht lief, waren allerdings noch so einige Eingriffe in den Delphi-Bibliotheken nötig. Unser Szenario war und ist dabei, dass wir aus dem System, das wir anbinden wollen, eine pfx-Datei geliefert bekommen haben. Ich habe für die ganzen Probleme, die dabei unter Windows und unter Linux aufgetreten sind, mal in QC neue Einträge erstellt:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz