read - x509certificate2 c# example
¿La mejor manera de iniciar RSACryptoServiceProvider desde x509Certificate2? (3)
¿Cuál es la mejor manera de iniciar un nuevo objeto RSACryptoServiceProvider
desde un X509Certificate2
que saqué de un almacén de claves? El certificado está asociado con las claves públicas (para el cifrado) y privadas (para el descifrado).
FromXmlString
estoy usando el método FromXmlString
, pero debe haber una mejor manera.
Gracias
La respuesta de Blowdart es ciertamente correcta. Sin embargo, para mayor claridad, debo señalar que si desea que su instancia RSACryptoServiceProvider contenga las claves pública y privada del certificado X509 (suponiendo que el certificado tenga una clave privada). Compruebe la propiedad HasPrivateKey del certificado.
RSACryptoServiceProvider rsa;
if (cert.HasPrivateKey)
rsa = (RSACryptoServiceProvider)cert.PrivateKey;
else
rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
En el caso de RSA cuando solo está presente la clave pública, los Parámetros de RSA serán solo Exponent y Módulo, todos los demás serán nulos; Si, por otro lado, la clave privada está presente, los Parámetros RSA contendrán D, DP, DQ, Exponent, InverseQ, Módulo, P y Q.
La forma recomendada es usar la clase base RSA
y llamar a certificate.GetRSAPrivateKey()
.
RSA publicKeyProvider = certificate.GetRSAPrivateKey();
Desde .NET 4.6, ya no se recomienda la conversión a RSACryptoServiceProvider
como lo sugiere @blowdart. Esto es aún más un problema ya que hay varias versiones de .NET (como .NET Core).
Al realizar la conversión a RSACryptoServiceProvider
esa forma, es muy RSACryptoServiceProvider
que obtenga esta excepción de conversión (según la plataforma y las bibliotecas utilizadas):
No se puede convertir el objeto de tipo ''System.Security.Cryptography.RSACng'' para escribir ''System.Security.Cryptography.RSACryptoServiceProvider''
La razón es que la implementación real podría ser diferente de cada plataforma, en Windows RSACng
se utiliza.
Aquí hay un enlace que describe este problema (busque la respuesta de Jeremy Barton).
RSACryptoServiceProvider publicKeyProvider =
(RSACryptoServiceProvider)certificate.PublicKey.Key;
y
RSACryptoServiceProvider privateKeyProvider =
(RSACryptoServiceProvider)certificate.PrivateKey;
La propiedad de clave en la propiedad de clave pública o privada del certificado es de tipo AsymmetricAlgorithm.