Ich versuche, eine Verbindung zu einer API herzustellen, die ein selbstsigniertes SSL-Zertifikat verwendet. Ich verwende dazu die .NET-Objekte HttpWebRequest und HttpWebResponse. Und ich bekomme eine Ausnahme, dass:
Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden.
Ich verstehe, was das bedeutet. Und ich verstehe, warum .NET meint, es sollte mich warnen und die Verbindung schließen. Aber in diesem Fall möchte ich trotzdem nur eine Verbindung zur API herstellen, Man-in-the-Middle-Angriffe sind verdammt.
Wie füge ich eine Ausnahme für dieses selbstsignierte Zertifikat hinzu? Oder ist der Ansatz, HttpWebRequest / Response anzuweisen, das Zertifikat überhaupt nicht zu validieren? Wie würde ich das machen?
quelle
Wenn Sie die Zertifikatsüberprüfung nur ganz deaktivieren möchten, können Sie den ServerCertificateValidationCallback im ServicePointManager wie folgt ändern:
Dadurch werden alle Zertifikate (einschließlich ungültiger, abgelaufener oder selbstsignierter) validiert.
quelle
Beachten Sie, dass Sie in .NET 4.5 die SSL-Validierung per HttpWebRequest selbst überschreiben können (und nicht über einen globalen Delegaten, der alle Anforderungen betrifft):
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.servercertificatevalidationcallback.aspx
quelle
Fügen Sie das selbstsignierte Zertifikat den vertrauenswürdigen Stammzertifizierungsstellen des lokalen Computers hinzu
Sie können das Zertifikat importieren, indem Sie die MMC als Administrator ausführen.
Gewusst wie: Anzeigen von Zertifikaten mit dem MMC-Snap-In
quelle
Der Umfang des in der Antwort von Domster verwendeten Validierungsrückrufs kann mithilfe des Absenderparameters für den
ServerCertificateValidationCallback
Delegaten auf eine bestimmte Anforderung beschränkt werden . Die folgende einfache Bereichsklasse verwendet diese Technik, um vorübergehend einen Validierungsrückruf zu verkabeln, der nur für ein bestimmtes Anforderungsobjekt ausgeführt wird.Die obige Klasse kann verwendet werden, um alle Zertifikatfehler für eine bestimmte Anforderung wie folgt zu ignorieren:
quelle
Bauen Sie einfach auf der Antwort von devstuff auf, um Betreff und Emittenten einzuschließen ... Kommentare willkommen ...
quelle
So fügen Sie eine mögliche Hilfe für eine andere Person hinzu: Wenn Sie möchten, dass der Benutzer aufgefordert wird, das selbstsignierte Zertifikat zu installieren, können Sie diesen Code verwenden (von oben geändert).
Erfordert keine Administratorrechte und wird auf den vertrauenswürdigen Profilen der lokalen Benutzer installiert:
Dies scheint für unsere Anwendung gut zu funktionieren, und wenn der Benutzer Nein drückt, funktioniert die Kommunikation nicht.
Update: 11.12.2015 - StoreName.Root in StoreName.My geändert - My wird anstelle von Root im lokalen Benutzerspeicher installiert. Root auf einigen Systemen funktioniert nicht, selbst wenn Sie "als Administrator ausführen"
quelle
Beachten Sie, dass der ServicePointManager.ServerCertificateValidationCallback nicht bedeutet, dass die CRL-Prüfung und die Validierung des Servernamens nicht durchgeführt werden, sondern lediglich eine Möglichkeit bietet, das Ergebnis zu überschreiben. Es kann also noch eine Weile dauern, bis Ihr Dienst eine CRL erhält. Erst danach wissen Sie, dass einige Überprüfungen fehlgeschlagen sind.
quelle
Ich hatte das gleiche Problem wie das OP, bei dem die Webanforderung genau diese Ausnahme auslösen würde. Ich hatte alles richtig eingerichtet, dachte ich, das Zertifikat wurde installiert, ich konnte es problemlos im Maschinenladen finden und an die Webanforderung anhängen, und ich hatte die Überprüfung von Zertifikaten im Anforderungskontext deaktiviert.
Es stellte sich heraus, dass ich unter meinem Benutzerkonto ausgeführt wurde und das Zertifikat im Computerspeicher installiert wurde. Dies führte dazu, dass die Webanforderung diese Ausnahme auslöste. Um das Problem zu lösen, musste ich entweder als Administrator ausgeführt werden oder das Zertifikat im Benutzerspeicher installieren und von dort aus lesen.
Es scheint, dass C # das Zertifikat im Maschinenspeicher finden kann, obwohl es nicht mit einer Webanforderung verwendet werden kann, und dass dies dazu führt, dass die Ausnahme des OP ausgelöst wird, sobald die Webanforderung ausgegeben wird.
quelle
Zunächst einmal - ich entschuldige mich, weil ich die von @devstuff beschriebene Lösung verwendet habe. Ich habe jedoch einige Möglichkeiten gefunden, dies zu verbessern.
Hier ist meine Modifikation:
Zertifikate setzen:
Delegate-Methode übergeben
client.pfx
wird mit KEY und CERT als solche generiert:quelle