2011-10-10 24 views
7

Utilizamos el código C# creamos X509Certificate2 con el archivo .p12, en el constructor insertamos la ruta al certificado, la contraseña del certificado. También nos marcamos como exportable, como se muestra a continuación:Exportar clave privada del objeto X509Certificate

X509Certificate2 x509Certificate2 = new X509Certificate2 
("...\\MyCerificate.p12", "[email protected]", X509KeyStorageFlags.Exportable); 

obtenemos la clave privada como formato AsymmetricAlgorithm por lo siguiente:

x509Certificate2.PrivateKey 

Ahora, queremos obtener la clave privada del certificado como El formato Base64, pero no tenemos idea de cómo hacerlo, y es muy importante para nosotros.

+0

¿Con qué intenta utilizar la salida Base64? ¿Es una necesidad estricta o una preferencia? –

Respuesta

2

Puede simplemente usar la propiedad PrivateKey de X509Certificate2. La implementación clave privada vuelto real depende del algoritmo utilizado en el certificado - por lo general se trata de RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

Después usted debe ser capaz de obtener la información de claves RSA de que es propiedad ExportParameters.

+0

y cuando conocemos la información clave (por ejemplo, RSA-PKCS1-KeyEx), ¿cómo podemos convertir la clave privada a base64? – RRR

-3

Si su único problema es conseguir que la clave privada codificada en Base64, sólo tiene que hacer así:

var privateKey = x509Certificate2.PrivateKey; 
var encoding = new System.Text.ASCIIEncoding(); 
var base64String = Convert.ToBase64String(encoding.GetBytes(privateKey.ToString())); 
+2

privateKey.ToString() devuelve el "System.Security.Cryptography.RSACryptoserviceProvider" ....., esta no es la clave privada ... – RRR

+0

@RRR es correcta. Encontrará que x509Certificate2.PublicKey.Key.ToString() devolverá el * mismo * valor haciéndolo de esta manera. Eso no puede ser correcto :) – rdev5

3

La cuestión importante es por qué base 64?

Si esto es para su propia aplicación, entonces puede mantener la clave privada como una cadena XML (mucho más fácil :-).

string xml = x509Certificate2.PrivateKey.ToXmlString (true); 

Si quieren base 64 (de nuevo sólo para su aplicación), puede exportar las claves (RSAParameters), entonces todos los concat byte[] y girar a la salida fusionada a una cadena base64.

Pero si quieres INTEROP con otras aplicaciones que requieren una clave privadabase 64, entonces necesita conocer el formato (dentro de la cadena debase 64). P.ej. en muchos casos, las claves privadas están codificadas en PEM (que es base64 con un encabezado/pie de página especial, consulte example para X509Certificate).

Si eso es lo que está buscando, primero deberá codificar la clave privada dentro de una estructura PKCS#8, luego convertirla en base64 y agregar el encabezado/pie de página. Puede encontrar algún código útil para hacerlo inside Mono.Security.dll (código de licencia MIT.X11 del proyecto Mono).

+0

Depende de otra aplicación que requiera obtener la clave privada de base64. Quiero permitir que el usuario inserte X509Certificate2 y extraer la clave privada como formato base 64, ¿sabe si .Net Framework expone alguna forma de hacerlo? – RRR

+0

NO, si lo hizo (realmente lo dudo) o si supiera que lo habría incluido en mi respuesta.Dicho esto, su problema persiste, no es un problema ** base64 **, es saber que está ** dentro ** que es importante interoperar con su otra aplicación. – poupou

Cuestiones relacionadas