2009-07-25 19 views

Respuesta

72

El x509Certificate se introdujo en .NET v1.0/1.1 y tenía (comparativamente) limitaciones en su funcionalidad. Se puede usar para obtener información sobre un certificado existente (fechas válidas, emisor, etc.). Tenía métodos/operaciones simples (es decir, leer un certificado del disco).

El x509Certificate2 es una subclase de x509Certificate con funcionalidad adicional.

  • Representa un certificado X509 real.
  • Era nuevo en .NET Framework v2.0.
  • Esta clase le da acceso a todas las propiedades V2 y V3 (identificador de clave de autoridad y uso de clave).
  • Es compatible con la carga de un certificado de un almacén de certificados.
+6

'X509Certificate2' también tiene un miembro para la clave privada, que no es parte del certificado en sí, pero es conveniente asociarlo con el representante de la clase resentido el certificado X.509. – Bruno

18

Para completarlo, aquí es una copia de la sección correspondiente de la site linked to en respuesta @ de dommer, ya que el sitio ya no puede ser de arriba sólo en la caché de Google para quién sabe cuánto tiempo:

La versión 1.1 del framework tenía muy poco más que la clase X509Certificate para permitirle manipular certificados. En el hecho , la clase v1.1 X509Certificate dio solo soporte básico: solo dio acceso a los campos de la versión 1 de X509 (como el válido desde y válido para fechas, tema y clave pública) pero no los campos de la versión 2 (como el identificador de clave de autorización) ni los campos de la versión 3 (como el uso de la clave ). No hubo soporte para cargar un certificado desde un almacén de certificados , ni tiene las facilidades para acceder a las listas de revocación de certificados o las listas de confianza de certificados. Microsoft mejoró en esto con el kit de herramientas de mejora de servicios web (WSE) extendiendo la clase de certificado y proporcionando clases para acceder a los almacenes de certificados. Estas clases ahora se pueden encontrar en la biblioteca de framework .NET 3.0/2.0.

El primer gran cambio es una nueva clase llamada X509Certificate2 que deriva de X509Certificate. Los métodos para acceder a los campos del certificado X509 han quedado en desuso y ahora la clase tiene propiedades para acceder a esos campos. Además, si el certificado tiene una clave privada asociada, la clase da acceso a esta clave. Existen métodos que le permiten proporcionar una contraseña si la clave privada está protegida por una. La contraseña se pasa a través de un parámetro SecureString que es un tipo especial que asegura que cuando el objeto ya no se use la memoria que ocupará se escribirá así que la contraseña no puede leerse en otro proceso en la máquina. Las cadenas seguras y otras formas de datos protegidos se tratarán en una sección posterior de .

Desde X509Certificate2 deriva de X509Certificate Esto significa que usted puede llamar a la métodos CreateFromeCertFile estática y CreateFromSignedFile a través de la clase X509Certificate2.Sin embargo, estos métodos devuelven un objeto X509Certificate y no se puede lanzarlo a un objeto X509Certificate2. La clase X509Certificate tiene mejorado en la versión 3.0/2.0: proporciona propiedades para acceder a algunos de los campos X509; proporciona métodos de importación y exportación a inicializar un objeto de una matriz de bytes o generar una matriz de bytes desde el certificado y tiene constructores que crearán un objeto desde un archivo (ASN.1 DER) y desde una matriz de bytes. Curiosamente, la clase X509Certificate2 tiene un constructor que puede crear un objeto X509Certificate2 a partir de un objeto X509Certificate. Tenga en cuenta que aunque un objeto X509Certificate solo puede mostrar los campos X509v1 se puede crear a partir de un certificado X509v3 y si crea un objeto X509Certificate2 de un objeto X509Certificate tendrá podrá acceder a los campos X509v3.

2

para convertir un certificado X.509 de "X509Certificate" a "X509Certificate2", intentar algo como esto:

X509Certificate X509 = sslStream.RemoteCertificate; 
X509Certificate2 X5092 = new X509Certificate2(X509); 
0

Para aquellos que le gustaría leer el certificado y usar esto para autenticar a uno le simplemente cree un X509Certificate2 y pase el X509Certificate en su constructor.

Para un ensamblado firmado (el exe) el código sería de este tipo, y omito la validación de errores por simplicidad.

Module m = Assembly.GetEntryAssembly().GetModules()[0]; 
using (var cert = m.GetSignerCertificate()) 
using (var cert2 = new X509Certificate2(cert)) 
{ 
    var _clientHandler = new HttpClientHandler(); 
    _clientHandler.ClientCertificates.Add(cert2); 
    _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual; 
    var myModel = new Dictionary<string, string> 
    { 
     { "property1","value" }, 
     { "property2","value" }, 
    }; 
    using (var content = new FormUrlEncodedContent(myModel)) 
    using (var _client = new HttpClient(_clientHandler)) 
    using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result) 
    { 
     response.EnsureSuccessStatusCode(); 
     string jsonString = response.Content.ReadAsStringAsync().Result; 
     var json = new Newtonsoft.Json.JsonSerializer(); 
     var myClass = JsonConvert.DeserializeObject<MyClass>(json); 
    } 
} 

Obviamente eres clase no se llama MiClase pero algunos objetos de negocio que usted esperaría de servicio web.

Puede enviar una clase a su acción enviando la propiedad & que necesita. Ahora puede estar seguro de que la solicitud que ha recibido es de un cliente móvil o ventanas válida mediante la lectura de la petición de certificado, así:

public class MyController : ApiController 
{ 
    public IHttpActionResult Get() 
    {   
     X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate; 
     if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber)) 
     { 
      Response.StatusCode = 404; 
      return null; 
     } 
     //your code 
    } 

}

Lo que queda es configurar el servidor web para aceptar certificados de cliente. .. Puede leer todo sobre las propiedades que provienen del nuevo formato y ha asegurado su servicio web público, algo que casi no hace, ya que el solo ser autorizado ya no es suficiente (si alguna vez lo fue)

Cuestiones relacionadas