2010-01-28 60 views
5
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只接受舊x509證書不X509Certificate2類型作爲參數。我需要X509Certificate2,因爲我發送SOAP請求的第三方API需要版本2.RemoteCertificateValidationCallback與X509Certificate2

回答

1

我不明白爲什麼這是一個問題。 X509Certificate2繼承自X509Certificate,因此可以鑄成一個。

編輯:

此外X509Certificate2有一個構造函數的文件名,所以你不需要FileStream。我還沒有看到你在任何地方使用buffer

0

上面這三行代碼甚至沒有做任何事情。 FileStream永遠不會被加載到buffer,並且X509Certificate2永遠不會從任何地方加載!

X509Certificate2有一個構造函數重載,它將文件名作爲其參數。如果你想從一個文件加載一個證書,那就是你應該使用的。

證書的這種非加載可能是爲什麼你的回調不起作用。將傳輸安全性用於SOAP服務也非常不尋常 - 如果這是其他PayPal API問題的後續工作,則根本不需要ServerCertificateValidationCallback,這是爲了傳輸安全性,大多數WCF都使用消息安全性。

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; 
}; 
相關問題