Erzwingen, dass der ASP.NET-WebAPI-Client ein Clientzertifikat sendet, auch wenn keine Übereinstimmung mit der Zertifizierungsstelle vorliegt
Ich habe eine bestimmte Anwendung, die die Verwendung von Client-Zertifikaten für die gegenseitige Authentifizierung von HTTPS-Anforderungen erfordert. Der Server verfügt über eine flexible Zertifikatüberprüfungsrichtlinie, die es ihm ermöglicht, selbstsignierte Clientzertifikate zu akzeptieren, die nicht im Zertifikatspeicher des Servers vorhanden sind. Es ist bekannt, dass dies gut funktioniert, wenn Curl als Client verwendet wird.
Was ich durch Testen und Packet Sniffing festgestellt habe, ist das ASP.NET von MicrosoftHttpClient
versucht, während des SSL-Handshakes zu schlau zu sein. Dieser bestimmte Client verwendet nur ein Clientzertifikat (vomWebRequestHandler.ClientCertificates
collection), wenn es eine Vertrauenskette zu einem der vertrauenswürdigen Roots des Servers hat. Was ich beobachtet habe, ist, dass, wenn es keine Zertifikate mit Vertrauenskette gibt, der Client während des Handshakes einfach überhaupt kein Zertifikat sendet.
Dies ist ein verständliches Standardverhalten, das jedoch zu restriktiv ist, und es scheint keine Möglichkeit zu geben, es zu deaktivieren. Ich habe mit verschiedenen anderen experimentiertWebRequestHandler
Eigenschaften, einschließlichAuthenticationLevel
undClientCertificateOptions
aber ohne Erfolg.
Gibt es einen Weg zu zwingenHttpClient
um ein Client-Zertifikat zu senden, wenn es im Internet verfügbar istClientCertificates
Sammlung, obwohl es scheint, dass es auf der Serverseite nicht validiert wird? Ich bin offen für einfache und schmutzige (Reflection Hacks) Lösungen, da ich diesen Client wirklich brauche, um zu arbeiten.