.net - clientcredentialtype - open certificates
¿Cuál es la diferencia entre X509Certificate2 y X509Certificate en.NET? (4)
¿Cuál es la diferencia entre los dos?
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.
Para aquellos que deseen leer el certificado y usarlo para autenticar uno, simplemente crearán un X509Certificate2 y pasarán 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, tu clase no se llama MyClass, sino un objeto comercial que esperarías 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ó proviene de un móvil o cliente de Windows válido al leer 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 los certificados del 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 hecho de ser autorizado no es lo suficientemente bueno más (si alguna vez fue)
Para convertir un certificado X.509 de "X509Certificate" a "X509Certificate2", pruebe algo como esto:
X509Certificate X509 = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
Para mayor completitud, aquí hay una copia de la sección relevante del sitio vinculada a la respuesta de @ dommer, ya que el sitio puede no estar activo y solo en el caché de Google por 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. De hecho, la clase v1.1 X509Certificate solo dio soporte básico: solo dio acceso a los campos de la versión 1 de X509 (como los campos válidos de y válidos para fechas, tema y clave pública) pero no de la versión 2 (como el identificador de clave de autoridad) ) 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 listas de revocación de certificados o listas de confianza de certificados. Microsoft mejoró esto con el conjunto de herramientas Web Services Enhancement (WSE) que amplía la clase de certificado y proporciona 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 se han desaprobado 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 uno. La contraseña se pasa a través de un parámetro SecureString, que es un tipo especial que garantiza que cuando el objeto ya no se use, la memoria que ocupará se escribirá para que la contraseña no pueda ser leída por otro proceso en la máquina. Las cadenas seguras y otras formas de datos protegidos se tratarán en una sección posterior.
Como X509Certificate2 deriva de X509Certificate, significa que puede llamar a los métodos estáticos CreateFromeCertFile y CreateFromSignedFile a través de la clase X509Certificate2. Sin embargo, estos métodos devuelven un objeto X509Certificate y no se puede convertir a un objeto X509Certificate2. La clase X509Certificate se ha 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 para inicializar un objeto de una matriz de bytes o generar una matriz de bytes del certificado y tiene constructores que crearán un objeto a partir de un archivo (ASN.1 DER) y de 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, por lo tanto, si crea un objeto X509Certificate2 a partir de un objeto X509Certificate, podrá acceder a los campos X509v3.