2010-06-09 22 views
5

estoy creando un certificado x509 usando makecert con los siguientes parámetros:Crear certificado x509 con la herramienta openssl/makecert

makecert -r -pe -n "CN = Cliente" -SS MyApp

Quiero usar este certificado para cifrar y descifrar datos con el algoritmo RSA. Miro al certificado generado en Windows Certificate Store y todo parece estar bien (Tiene una clave privada, clave pública es una clave RSA con 1024 bits y así sucesivamente ...)

Ahora uso este código C# para cifrar datos:

X509Store store = new X509Store("MyApp", StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly); 
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Client", false); 
X509Certificate2 _x509 = certs[0]; 

using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_x509.PublicKey.Key) 
{ 
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello"); 
    _encryptedData = rsa.Encrypt(dataToEncrypt, true); 
} 

Al ejecutar el método Encrypt, recibo una CryptographicException con el mensaje "Bad key".

Creo que el código está bien. Probablemente no estoy creando el certificado correctamente. ¿Algún comentario? Gracias

---------------- EDIT --------------
Si alguien sabe cómo crear el certificado usando OpenSsl, también es una respuesta válida para mí.

+0

Al crear su certificado, ¿cuál es el bit de los pares de clave privada/pública que especifique? probablemente tenga que especificar claves más largas 4048 bits? – berkay

+0

No estoy seguro de qué opción estás hablando. Acabo de usar las opciones que muestro arriba en el comando makecert. Si está hablando el uno del otro, asuma el valor predeterminado. Pero mi clave pública tiene 1024 bits. –

+0

okey, entonces nunca uso makecert solo busque para crearlo 4048 bits.1024 bits se rompe por eso puede obtener el error. – berkay

Respuesta

3

Para permitir que la clave se use para el cifrado, debe usar el -sky-option. Por defecto'makecert` utiliza la especificación de la clave AT_SIGNATURE, que no funcionará con el cifrado/descifrado. En su lugar tiene que utilizar la especificación AT_KEYEXCHANGE emitiendo el siguiente comando:

makecert -r -pe -n "CN=Client" -ss MyApp -sky Exchange 

(Recuerde que debe eliminar la clave anterior o usar otro contenedor nombre).

+0

He leído que el algoritmo RSA podría usarse tanto para firmar como para cifrar mensajes. ¿Es imposible tener en un solo certificado las claves de cifrado y firma? –

+1

Un AT_KEYEXCHANGE se puede usar para firmar y cifrar, pero no al revés. –

1

Esta fue otra página que encontré cuando estaba tratando de encontrar ejemplos de uso de makcert con certificados x509 y rsa usando C#, y desafortunadamente solo proporcionó parte de la solución. Puse todos los bits juntos en una entrada de blog que podría interesar a las personas, y se puede encontrar aquí: http://nick-howard.blogspot.com/2011/05/makecert-x509-certificates-and-rsa.html

Cuestiones relacionadas