2010-07-13 54 views
7

Normalmente, cuando tomo un X509Certificate2 de mi almacén de claves, puedo llamar al .PrivateKey para recuperar la clave privada del certificado como AsymmetricAlgorithm. Sin embargo, he decidido usar Bouncy Castle y su instancia de X509Certificate solo tiene un getPublicKey();. No veo la forma de sacar la clave privada del certificado. ¿Algunas ideas?Obtener clave privada del Certificado BouncyCastle X509? C#

tengo la X509Certificate2 una de las ventanas de mi-MI almacén de claves a continuación, utilizar:

//mycert is an X509Certificate2 retrieved from Windows-MY Keystore 
X509CertificateParser certParser = new X509CertificateParser(); 
X509Certificate privateCertBouncy = certParser.ReadCertificate(mycert.GetRawCertData()); 
AsymmetricKeyParameter pubKey = privateCertBouncy.GetPublicKey(); 
//how do i now get the private key to make a keypair? 

¿Hay alguna forma de convertir un (clave privada de C#) AsymmetricAlgorithm a un AsymmetricKeyParameter (BouncyCastle clave privada)?

+1

¿Cómo estás de obtener el objeto X509Certificate? ¿Qué tipo de contenedor estás usando? – CriGoT

+0

Pregunta actualizada. –

+1

Hay una clave privada * no * en un certificado X509. –

Respuesta

12

No sé BouncyCastle mucho, pero me parece que lo más fácil es recrear la clave en función de los parámetros clave.

 

    public static AsymmetricKeyParameter TransformRSAPrivateKey(AsymmetricAlgorithm privateKey) 
    { 
     RSACryptoServiceProvider prov = privateKey as RSACryptoServiceProvider; 
     RSAParameters parameters = prov.ExportParameters(true); 

     return new RsaPrivateCrtKeyParameters(
      new BigInteger(1,parameters.Modulus), 
      new BigInteger(1,parameters.Exponent), 
      new BigInteger(1,parameters.D), 
      new BigInteger(1,parameters.P), 
      new BigInteger(1,parameters.Q), 
      new BigInteger(1,parameters.DP), 
      new BigInteger(1,parameters.DQ), 
      new BigInteger(1,parameters.InverseQ)); 
    } 
 

Puede llamar al código utilizando

 

AsymmetricKeyParameter bouncyCastlePrivateKey = TransformRSAPrivateKey(mycert.PrivateKey); 
 

Obviamente, esto supone que el certificado incluye una clave RSA pero el mismo resultado se puede lograr por DSA con DSACryptoServiceProvider y DSAParameters

+0

Funcionó como un maldito encanto, eres un caballero y un erudito. –

+0

¿Podría proporcionar el código del DSA que menciona? A lo intenté por mi cuenta, pero no funciona ... – vojta

19
Akp = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(this.Certificate.PrivateKey).Private; 
+4

¿esta debería ser la respuesta? – Sushant

1

Buscar .NET X509Certificate2:

X509Certificate2 cert = this.FindCertificate(certificateFriendlyName); 

analizarlo al certificado BouncyCastle y utilizar X509Certificate2Signature para obtener la firma:

var parser = new X509CertificateParser(); 
var bouncyCertificate = parser.ReadCertificate(cert.RawData); 
var algorithm = DigestAlgorithms.GetDigest(bouncyCertificate.SigAlgOid); 
var signature = new X509Certificate2Signature(cert, algorithm); 
Cuestiones relacionadas