2010-12-06 45 views
1

Je suis dans Fedora 14, MonoDevelop 2.4, Mono 2.6.7. J'ai généré mon CERT auto-signé ainsi:Importer un CERT auto-signé créé par openssl dans un X509Certificate2 (Mono): Peut crypter, ne peut pas décrypter

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt 

Ensuite, je joue avec le cryptage et le décryptage en C# ainsi. Je sélectionne le fichier .crt. Le problème est que le X509Certificate2 en cours de création n'a pas de clé privée! Par conséquent, l'opération de cryptage se passe bien et décrypte les bombes. Je suis probablement en train d'exécuter la commande openssl incorrectement. Ou est-ce un peu de subtilité dans la création de l'objet X509Certificate2?

protected virtual void OnBtCertClicked (object sender, System.EventArgs e) 
{ 
    try 
    { 
     if (myCert == null) 
     { 
      myCert = new X509Certificate2(fchCert.Filename); 
     } 

     RSACryptoServiceProvider pubKey = (RSACryptoServiceProvider)myCert.PublicKey.Key; 
     byte[] myBlob = UTF8Encoding.Default.GetBytes(tbDisplay.Buffer.Text); 
     byte[] myEncryptedBlob = pubKey.Encrypt(myBlob, false); 
     tbDisplay.Buffer.Text = System.Convert.ToBase64String(myEncryptedBlob, Base64FormattingOptions.InsertLineBreaks); 
    } 
    catch (Exception excp) 
    { 
     tbDisplay.Buffer.Text = excp.GetType().ToString() + "\n\n" + excp.ToString(); 
    } 
} 

protected virtual void OnBtCertDecClicked (object sender, System.EventArgs e) 
{ 
    try 
    { 
     if (myCert == null) 
     { 
      myCert = new X509Certificate2(fchCert.Filename); 
     } 

     if (!myCert.HasPrivateKey) 
      throw new CryptographicException("Certificate has no private key"); 

     RSACryptoServiceProvider privKey = (RSACryptoServiceProvider)myCert.PrivateKey; 
     byte[] myEncryptedBlob = System.Convert.FromBase64String(tbDisplay.Buffer.Text); 
     byte[] myBlob = privKey.Decrypt(myEncryptedBlob, false); 
     tbDisplay.Buffer.Text = UTF8Encoding.UTF8.GetString(myBlob); 
    } 
    catch (Exception excp) 
    { 
     tbDisplay.Buffer.Text = excp.GetType().ToString() + "\n\n" + excp.ToString(); 
    } 
} 
+0

Pouvez-vous fournir des détails d'exception? J'ai signalé un bug il y a quelque temps: https://bugzilla.novell.com/show_bug.cgi?id=646491, semble similaire –

+0

@djechelon: La propriété HasPrivateKey de l'objet X509Certificate2 est "faux" après avoir importé le fichier .crt . L'exception est celle que je me jette moi-même. – JCCyC

+0

Oh oui, vous pouvez importer le certificat, mais sans clé privée. Je crois que cela pourrait être un bug dans Mono qui pourrait être corrélé avec celui que j'ai posté. C'est ma pensée. Avez-vous essayé dans Windows? Si ça marche, c'est 100% un bug mono –

Répondre

1

Un certificat contient uniquement la clé publique. La commande OpenSSL que vous utilisez crée la clé dans le fichier mysitename.key. Vous devez charger le fichier clé séparément. AFAIR le fichier de clé généré doit contenir la clé privée RSA encodée en base 64 au format PKCS # 8 - encapsulée par certaines chaînes de caractères (BEGIN/END RSA PRIVATE KEY).

+0

Comment importer le fichier .key? – JCCyC

5

Créer un certificat PKCS # 12:

openssl pkcs12 -export -in yourcert.crt -inkey yourprivkey.key -out newcert.p12 

Il doit maintenant contenir la clé privée.