6 Stimmen

RemoteCertificateValidationCallback mit X509Certificate2

    X509Certificate2 certificate = new X509Certificate2();
    FileStream fileStream = File.Open(@"C:\openssl\bin\cert_key.p12", FileMode.Open, FileAccess.Read);
    byte[] buffer = new byte[fileStream.Length];

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(certificate.ValidateRemoteCertificate);
    Client.ClientCredentials.ClientCertificate.Certificate = certificate;

Das Problem, das ich mit dem obigen Code habe, ist, dass der RemoteCertificateValidationCallback nur den älteren X509Certificate nicht X509Certificate2-Typ als Parameter akzeptiert. Ich brauche X509Certificate2, weil die API eines Drittanbieters, an die ich eine SOAP-Anforderung sende, Version 2 benötigt.

6voto

λ Jonas Gorauskas Punkte 5981

Die Klasse X509Certificate2 hat einen Konstruktor, der ein X509Certificate als Parameter annimmt. Sie können also Folgendes tun:

RemoteCertificateValidationCallback callback = delegate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslError) {
    X509Certificate2 certv2 = new X509Certificate2(cert);
    // more code here that sends soap request
    return false;
};

1voto

Klaus Byskov Pedersen Punkte 111081

Ich wüsste nicht, warum das ein Problem sein sollte. X509Certificate2 erbt von X509Certificate und kann daher auf eins gesetzt werden.

EDITAR:

Außerdem X509Certificate2 hat einen Konstruktor, der einen Dateinamen annimmt, so dass Sie die FileStream . Ich sehe auch nicht, dass Sie die buffer irgendwo?

0voto

Aaronaught Punkte 118136

Diese drei Codezeilen am Anfang machen gar nichts. Die FileStream wird niemals in buffer und die X509Certificate2 nie wirklich von irgendwoher geladen wird!

En X509Certificate2 hat eine Konstruktorüberladung, die einen Dateinamen als Argument annimmt. Diese sollten Sie verwenden, wenn Sie ein Zertifikat aus einer Datei laden wollen.

Dieses Nicht-Laden des Zertifikats ist wahrscheinlich der Grund, warum Ihr Callback nicht funktioniert. Es ist auch sehr ungewöhnlich, dass Transportsicherheit für einen SOAP-Service verwendet wird - wenn dies eine Folge der anderen PayPal-API-Fragen ist, dann brauchen Sie nicht die ServerCertificateValidationCallback überhaupt nicht, das ist für die Transportsicherheit und die meisten WCF verwenden Nachrichtensicherheit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X