¿Cuál es la diferencia entre los dos?
94
¿Cuál es la diferencia entre los dos?
El certificado x509 se introdujo en .NET v1.0 / 1.1 y estaba (comparativamente) limitado en su funcionalidad. Se puede utilizar para obtener información sobre un certificado existente (fechas válidas, emisor, etc.). Tenía métodos / operaciones simples (es decir, leer un certificado desde el disco).
El X509Certificate2 es una subclase de X509Certificate con funcionalidad adicional.
X509Certificate2
también tiene un miembro para la clave privada, que no es parte del certificado en sí, pero es conveniente tenerlo asociado con la clase que representa el certificado X.509.En aras de la integridad, aquí hay una copia de la sección relevante del sitio vinculado en la respuesta de @ dommer, ya que es posible que el sitio ya no esté activo y solo en la caché de Google durante quién sabe cuánto tiempo:
fuente
Para convertir un certificado X.509 de "X509Certificate" a "X509Certificate2", intente algo como esto:
fuente
Para aquellos que deseen leer el certificado y usarlo para autenticarse, simplemente crearán un X509Certificate2 y pasarán el X509Certificate en su constructor.
Para un ensamblado firmado (el exe), el código sería un código como este, 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, su clase no se llama MyClass sino un objeto comercial que esperaría del servicio web.
Puede enviar una clase a su acción enviando la propiedad y el valor que necesita. Ahora puede asegurarse de que la solicitud que recibió es de un cliente móvil o de Windows válido leyendo el certificado de solicitud de la siguiente manera:
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 su servidor web para que acepte certificados de cliente ... Puede leer todo sobre las propiedades que provienen del nuevo formato y ha asegurado su servicio web público, algo que la mayoría no logra, ya que solo estar autorizado no es suficiente más (si alguna vez lo fue)
fuente