Laden...

WebException (Could not create SSL/TLS secure channel) bei https web API Aufruf (two-way-authentific

Erstellt von timbu42 vor 4 Jahren Letzter Beitrag vor 4 Jahren 5.099 Views
T
timbu42 Themenstarter:in
31 Beiträge seit 2017
vor 4 Jahren
WebException (Could not create SSL/TLS secure channel) bei https web API Aufruf (two-way-authentific

Hallo Zusammen,

ich möchte von .net (C#) aus eine https web API aufrufen, die
eine two-way-authentification vorsieht.

Vorweg: wenn ich es über den Browser teste, funktioniert es (Zertifikat in Mozilla Einstellungen hinzugefügt).
Also prinzipiell ist es schon möglich, ich denke damit habe ich viele Fehler (serverseitige, fehlerhaftes Zertifikat, falsches Passwort, ...) ausgeschlossen.

Untenstehender Code liefert mir aber leider immer wieder folgende WebException (letzte Code-Zeile):

"Die Anfrage wurde abgebrochen: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden.."
oder auf englisch: "The request was aborted: Could not create SSL/TLS secure channel."

Betriebssystem ist Windows 7 (habe es aber auch mit Win 10 getestet),

Hat jemand eine Idee woran das liegen könnte / was ich noch beachten sollte / wie ich "debuggen" kann, um mehr zu erfahren?
Die Fehlermeldung ist ja leider sehr ungenau.

Googeln hat leider auch nicht viel zu Tage gebracht als die diversen Einstellungen (siehe Quelltext), die
noch nicht geholfen haben.

Vielen Dank im Voraus,
Tim


//
// Den Request bauen
string url = @"https://myCompany.de/testapi/v1/generic/myAPI";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";


//
// Zertifikat
string fileInCert = @"C:\temp\myCertificate.pfx";
X509Certificate2 certificate = new X509Certificate2(fileInCert, "myPasswd12345");
X509CertificateCollection certificates = new X509CertificateCollection(new X509Certificate[1] { certificate });

//
// Diverse Einstellungen
request.AllowAutoRedirect = true;
ServicePointManager.CheckCertificateRevocationList = false;
ServicePointManager.ServerCertificateValidationCallback = ((s, cert, chain, ssl) => true);
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;


//
// Basic Auth Credentials
request.Credentials = new NetworkCredential("myUsername", "myPasswd67890");


//
// Request abschicken
HttpWebResponse response = (HttpWebResponse)request.GetResponse();


16.828 Beiträge seit 2008
vor 4 Jahren

IIRC hat der Mozilla einen eigenen Certstore.
Wenn Du also dort Zertifikate hinzufügst interessiert das nur den Firefox - nichts anderes auf dem System.

Per default verwendet Mozilla auch den eigenen CA Store, weshalb es auch eine Enterprise Setting Option gibt, dass der OS CA Store verwendet wird.

Damit .NET Zertifikate sieht, musst Du den OS CA Store verwenden (gilt nicht für .NET Applikationen in Isolationsumgebungen wie Containern); alternativ manuell validieren.
Manuelles Validieren ist übrigens auch für HTTP Public Key Pinning notwendig, wenn gewünscht (empfohlen).

T
timbu42 Themenstarter:in
31 Beiträge seit 2017
vor 4 Jahren

Vielen Dank schon mal für die Antwort!

Was mich noch wundert:

Geht es um "mein" Zertifikat, das mich als Client am Server validiert (dazu wurde serverseitig mein Public Key hinterlegt) ? Das füge ich ja in die X509CertificateCollection certificates hinzu (zweiter Block im Code).

Oder geht es um das Server-Zertifikat? Das sollte eigentlich egal sein, da ich mittels
ServicePointManager.ServerCertificateValidationCallback = ((s, cert, chain, ssl) => true);
einfach alle akzeptiere...

VG Tim

PS: Autsch, dumm, ich hatte durch das ganze Ausprobieren und weitere Zeilen hinzufügen die Zeile auskommentiert, welche die Collection dem request hinzufügt... jetzt bekomme ich die Meldung "The remote server returned an error: (405) Method Not Allowed." was glaube ich im Moment ok ist...

Der Vollständigkeit halber: es fehlte "request.ClientCertificates = certificates;"

16.828 Beiträge seit 2008
vor 4 Jahren

ServicePointManager.ServerCertificateValidationCallback = ((s, cert, chain, ssl) => true);
damit sagst Du, dass Du jedes Zertifikat akzeptierst. Das ist genau das, was man prinzipiell nicht machen sollte.

Siehe dazu Mobile App Security with Kerry W. Lothrop | The Xamarin Show. Kerry hat dazu mehrere Talks und Videos - ist in allen .NET Anwendungen gleich (eben das Pinning).

HTTP 405 ist kein AuthN Fehler (mehr).
405 kommt eigentlich wenn man zB ein PUT ausführt, das in der Web.Config/WebServer aber nicht erlaubt.