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.
答案 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
永远不会加载到buffer
,X509Certificate2
永远不会从任何地方加载!
X509Certificate2
有一个构造函数重载,它以文件名作为参数。如果您想从文件加载证书,那就是您应该使用的。
此证书的非加载可能是您的回调无法正常工作的原因。将传输安全性用于SOAP服务也是非常不寻常的 - 如果这是其他PayPal API问题的后续,那么您根本不需要ServerCertificateValidationCallback
,那就是传输安全性和大多数WCF使用消息安全。