¿Cuál es la diferencia entre X509Certificate2 y X509Certificate en .NET?
-
19-09-2019 - |
Pregunta
¿Cuál es la diferencia entre los dos?
Solución
El X509Certificate se introdujo en v1.0 .NET / 1,1 y era (relativamente) limitada en su funcionalidad. Se puede utilizar para obtener información acerca de un certificado existente (fecha de validez, emisor, etc.). Tenía métodos simples / operaciones (es decir, la lectura de un cert de disco).
La X509Certificate2 es una subclase de X509Certificate con funcionalidad adicional.
- Representa un certificado X509 real.
- Era nuevo en la versión 2.0 de .NET Framework.
- Esta clase le da acceso a toda la V2 y V3 (propiedades autoridad identificador de clave y clave de uso).
- Es compatible con la carga de un certificado de un almacén de certificados.
Otros consejos
Para completarlo, aquí es una copia de la sección correspondiente de la sitio vinculado a 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:
muyVersión 1.1 de las Directrices tenía poco que no sea el X509Certificate clase que le permite manipular certificados. En De hecho, la clase X509Certificate v1.1 dio soporte únicamente básica: sólo dio acceso a los campos X509 versión 1 (como la válida desde y válida para las fechas clave, tema y pública), pero no la versión 2 campos (como el identificador de clave autoridad) ni versión 3 campos (como la tecla uso). No hubo apoyo para cargar un certificado de un certificado almacenar, ni tiene las facilidades de acceso certificado listas de revocación o listas de certificados de confianza. Microsoft mejoró esto con los Servicios Web Enhancement (WSE) extender el kit de herramientas clase de certificado y que ofrecen clases para acceder a los almacenes de certificados. Estas clases se pueden encontrar ahora en la biblioteca de marco .NET 3.0 / 2.0.
El primer gran cambio es una nueva clase llamada X509Certificate2 cuales deriva de X509Certificate. Los métodos para acceder a la X509 campos de certificado están en desuso y ahora tiene la clase propiedades para acceder a esos campos. Además, si el certificado tiene una clave privada asociada entonces la clase da acceso a esta clave. Hay métodos que le permiten proporcionar una contraseña si lo privado clave está protegido por una. La contraseña se pasa a través de un SecureString parámetro que es un tipo especial que se asegura de que cuando el objeto Ya no se está utilizando la memoria que ocupaba será escrito más de lo que que la contraseña no puede ser leído por otro proceso en la máquina. cuerdas seguras y otras formas de datos protegidos serán cubiertos en una sección posterior.
Desde X509Certificate2 deriva de X509Certificate Esto significa que usted puede llamar a los métodos estáticos y CreateFromeCertFile CreateFromSignedFile través de la clase X509Certificate2. Sin embargo, Estos métodos devuelven un objeto X509Certificate y no se puede bajar echado a un objeto X509Certificate2. La clase tiene X509Certificate sido mejorada en la versión 3.0 / 2.0: proporciona propiedades de acceso algunos de los campos X509; proporciona métodos de importación y exportación inicializar un objeto de una matriz de bytes o generar una matriz de bytes de el certificado y tiene constructores que crearán un objeto desde un archivo (DER ASN.1) ya partir de una matriz de bytes. Curiosamente, el X509Certificate2 clase tiene un constructor que puede crear una objeto X509Certificate2 de un objeto X509Certificate. Tenga en cuenta que A pesar de que un objeto X509Certificate sólo puede mostrar los campos de TI X509v1 se pueden crear a partir de un certificado de X509v3 y por lo que si se crea una X509Certificate2 objeto de un objeto que será X509Certificate acceder a los campos X509v3.
Para convertir un certificado X.509 de "X509Certificate" a "X509Certificate2", intentar algo como esto:
X509Certificate X509 = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
Para aquellos que le gustaría leer el certificado y usar esto para autenticar uno simplemente crear un X509Certificate2 y pasar el X509Certificate en ella del constructor.
Para un montaje firmado (el exe) el código sería un código como éste, y omitir la validación de error 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);
}
}
Es evidente que eres de 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 mediante el envío de la propiedad y el valor que requieren lleno. 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 solicitud de certificado de este modo:
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 ... Usted puede leer todo acerca de las propiedades que provienen del nuevo formato y que haya obtenido su servicio web público, algo que la mayoría no lo hacen ISN como se acaba de ser autorizado' t lo suficientemente bueno ya (si es que alguna vez lo fue)