Vielen herzlichen Dank für deine Hilfe!
Ich habe nur den Konstruktor geändert, damit läuft das kleine Programm sowohl mit RSA- als auch mit ECDsa-Zertifikat. Kleine Ursache, große Wirkung!
byte[] rawCert = File.ReadAllBytes(certpath);
X509Certificate2 certificate = new X509Certificate2(rawCert, "David", X509KeyStorageFlags.PersistKeySet);
Danke für die Antwort und sorry für die fehlenden Informationen.
Hier der Code, der mit einem RSA-Zertifikat funktioniert:
using System;
using System.IO;
using System.Net.Http;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static String retvalue;
static void Main(string[] args)
{
Console.WriteLine("https://localhost/mbbsim/test4.php?params=show mit SSL und Zertifikat aufgerufen");
retvalue = new String(GetValue());
Console.WriteLine(retvalue);
Console.ReadKey();
}
static string GetValue()
{
var retstring = "";
//string certpath = "C:\\temp\\CAItest\\signed.p12";
string certpath = "C:\\Austausch\\SSL\\XXXXXX_Client_EXAM.p12";
Console.WriteLine(certpath);
X509Certificate2 certificate = new X509Certificate2(certpath, "David", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
Console.WriteLine("neues X509certificate2 erzeugt");
// Fehler in der Server-Zertifikatskette ignorieren
var handler = new HttpClientHandler();
Console.WriteLine("neuen HttpClientHandler angelegt");
handler.ClientCertificates.Add(certificate);
Console.WriteLine("certificate hinzugefügt");
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
Console.WriteLine("ClientCertificateOption.Automatic definiert");
handler.ServerCertificateCustomValidationCallback =
(httpRequestMessage, cert, cetChain, policyErrors) =>
{
return true;
};
Console.WriteLine("Callback eingerichtet");
try
{
var client = new HttpClient(handler);
Console.WriteLine("neues HttpClient Objekt erzeugt");
var webRequest = new HttpRequestMessage(HttpMethod.Get, "https://localhost/mbbsim/test4.php?params=show");
var response = client.Send(webRequest);
var reader = new StreamReader(response.Content.ReadAsStream());
retstring = reader.ReadToEnd();
}
catch (System.Net.Http.HttpRequestException e)
{
// Win32Exception: Die Anmeldeinformationen, die dem Paket übergeben wurden, wurden nicht erkannt
retstring = "Fehler " + e.Message;
if (e.InnerException != null)
Console.WriteLine("Inner exception: {0}", e.InnerException);
}
return retstring;
}
}
}
Bei Verwendung des hier auskommentierten EC-Zertifikats "signed.p12" kommt es zur Exception mit der Info, dass die Anmeldeinformationen nicht erkannt wurden
Ich habe eine Anwendung, die einen REST-Webservice über https aufruft. Der Client authentifiziert sich dabei mit einem X509-Zertifikat.
Bislang wurde ein Zertifikat mit RSA-Schlüsseln verwendet und es hat wunderbar funktioniert.
Jetzt wurde das Zertifikat auf Elliptic Curves-Schlüssel umgestellt und ich bekomme den Aufruf nicht mehr zum Laufen, egal ob ich Zertifikat und Schlüssel im PEM-Format benutze oder ein Zertifikat im p12-Format einsetze, das sowohl Zertifikat als auch den privaten Schlüssel enthält.
Ich habe es sowohl mit der System.Security.Cryptography.X509Certificates.HttpClient-Klasse versucht als auch mit Bouncy Castle. Ich setze Visual Studio mit .NET Framework 4.8.1 ein.
Ich kann den Webservice problemlos von Python und von Java (mit Bouncy Castle) aufrufen, sowohl mit RSA- als auch mit Elliptic Curves-Zertifikat.
Wer kann mir ein Code-Snippet zukommen lassen? Im Internet finde ich nichts und das Snippet, das ich von ChatGPT erhalten habe, funktioniert nicht.