2010-01-28 9 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; 

El problema que tengo con el código anterior es que el RemoteCertificateValidationCallback sólo acepta la X509Certificate mayor no X509Certificate2 tipo como un parámetro. Necesito X509Certificate2 porque la API de terceros a la que envío la solicitud SOAP requiere la versión 2.RemoteCertificateValidationCallback con X509Certificate2

Respuesta

1

No veo por qué eso es un problema. X509Certificate2 hereda de X509Certificate y, por lo tanto, puede convertirse en uno.

EDIT:

Además X509Certificate2 tiene un constructor que toma un nombre de archivo de modo que no es necesario el FileStream. Además, ¿no te veo usando el buffer en cualquier lugar?

0

Esas tres líneas de código en la parte superior ni siquiera están haciendo nada. ¡El FileStream nunca se carga en buffer, y el X509Certificate2 nunca se carga desde ningún lugar!

El X509Certificate2 tiene una sobrecarga de constructor que toma como nombre un nombre de archivo. Eso es lo que deberías usar si quieres cargar un certificado de un archivo.

Esta no carga del certificado es probablemente la razón por la que su devolución de llamada no está funcionando. También es muy inusual que la seguridad del transporte se use para un servicio SOAP: si esto es una continuación de las otras preguntas de la API de PayPal, no necesita el ServerCertificateValidationCallback, eso es para la seguridad del transporte y la mayoría de WCF usa seguridad de mensajes.

5

La clase X509Certificate2 tiene un constructor que toma un X509Certificate como parámetro. Para que pueda hacer esto:

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