带有X509Certificate2的RemoteCertificateValidationCallback

时间:2010-01-28 16:33:40

标签: c#

    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;

我对上面代码的问题是RemoteCertificateValidationCallback只接受旧的X509Certificate而不是X509Certificate2类型作为参数。我需要X509Certificate2,因为我发送SOAP请求的第三方API需要版本2.

3 个答案:

答案 0 :(得分:5)

X509Certificate2类有一个构造函数,它将X509Certificate作为参数。所以你可以这样做:

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;
};

答案 1 :(得分:1)

我不明白为什么这是一个问题。 X509Certificate2继承自X509Certificate,因此可以转换为一个。

修改

此外X509Certificate2有一个带有文件名的构造函数,因此您不需要FileStream。另外,我没有看到你在任何地方使用buffer

答案 2 :(得分:0)

顶部的那三行代码甚至没有做任何事情。 FileStream永远不会加载到bufferX509Certificate2永远不会从任何地方加载!

X509Certificate2有一个构造函数重载,它以文件名作为参数。如果您想从文件加载证书,那就是您应该使用的。

此证书的非加载可能是您的回调无法正常工作的原因。将传输安全性用于SOAP服务也是非常不寻常的 - 如果这是其他PayPal API问题的后续,那么您根本不需要ServerCertificateValidationCallback,那就是传输安全性和大多数WCF使用消息安全。