Ich habe eine bestimmte Anwendung, die die Verwendung von Client-Zertifikaten für die gegenseitige Authentifizierung von HTTPS-Anfragen erfordert. Der Server verfügt über eine flexible Zertifikatüberprüfungsrichtlinie, die es ermöglicht, selbst signierte Clientzertifikate zu akzeptieren, die nicht im Zertifikatspeicher des Servers vorhanden sind. Dies funktioniert bekanntermaßen gut mit curl als Client.
Was ich durch Testen und Paket-Sniffing festgestellt habe, ist, dass Microsofts ASP.NET HttpClient
versucht, während des SSL-Handshakes übermäßig intelligent zu sein. Dieser bestimmte Client verwendet nur ein Clientzertifikat (aus der WebRequestHandler.ClientCertificates
-Auflistung), wenn es eine Vertrauenskette zu einem der vertrauenswürdigen Root des Servers hat. Was ich beobachtet habe ist, dass, wenn es keine Zertifikate mit einer Vertrauenskette gibt, der Client einfach kein Zertifikat während des Handshakes sendet.
Dies ist ein verständliches Standardverhalten, aber es ist zu restriktiv und es scheint keine Möglichkeit zu geben, es auszuschalten. Ich habe mit verschiedenen anderen WebRequestHandler
-Eigenschaften experimentiert, einschließlich AuthenticationLevel
und ClientCertificateOptions
, aber ohne Erfolg.
Gibt es eine Möglichkeit, HttpClient
zu zwingen, ein Clientzertifikat zu senden, wenn es in der ClientCertificates
-Auflistung verfügbar ist, obwohl es scheint, dass es auf der Serverseite nicht validiert wird? Ich bin offen für sowohl einfache als auch schmutzige (Reflection Hacks) Lösungen, da ich diesen Client wirklich brauche um zu arbeiten.
Tags und Links asp.net-web-api client-certificates .net-4.5