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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage