Force HttpWebRequest zum Senden des Client-Zertifikats
Ich habe ein p12 Zertifikat, das ich so lade:
X509Certificate2 certificate = new X509Certificate2(certName, password,
X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
It ist richtig geladen, in der Tat, wenn ichcertificate.PrivateKey.ToXmlString(true);
Es wird eine vollständige XML ohne Fehler zurückgegeben. Aber wenn ich es mache
try
{
X509Chain chain = new X509Chain();
var chainBuilt = chain.Build(certificate);
Console.WriteLine("Chain building status: "+ chainBuilt);
if (chainBuilt == false)
foreach (X509ChainStatus chainStatus in chain.ChainStatus)
Console.WriteLine("Chain error: "+ chainStatus.Status);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
it schreibt:
Chain building status: False
Chain error: RevocationStatusUnknown
Chain error: OfflineRevocation
so wenn ich tue:
ServicePointManager.CheckCertificateRevocationList = false;
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
ServicePointManager.Expect100Continue = true;
Console.WriteLine("connessione a:" + host);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(host);
req.PreAuthenticate = true;
req.AllowAutoRedirect = true;
req.ClientCertificates.Add(certificate);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
string postData = "login-form-type=cert";
byte[] postBytes = Encoding.UTF8.GetBytes(postData);
req.ContentLength = postBytes.Length;
Stream postStream = req.GetRequestStream();
postStream.Write(postBytes, 0, postBytes.Length);
postStream.Flush();
postStream.Close();
WebResponse resp = req.GetResponse();
der Server meldet, dass das Zertifikat nicht gesendet / gültig ist.
Meine Frage ist
Wie kann ich das Zertifikat auch mit falschem Kettenaufbau senden? Gibt es eine andere Klasse, die ein Zertifikat bereitstellt, das die Zertifikatsprüfung vor dem Senden nicht überprüft?Danke vielmals. Antonino