2010-12-06 4 views
1

Я в Fedora 14, MonoDevelop 2.4, Mono 2.6.7. Таким образом, я создал свой самоподписанный сертификат:Импорт созданного openssl самостоятельного сертификата в X509Certificate2 (Моно): Может шифровать, не может расшифровать

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

Затем я играю с шифрованием и расшифровкой на C#. Я выбираю файл .crt. Проблема в том, что создаваемый X509Certificate2 не имеет закрытого ключа! Следовательно, операция шифрования идет хорошо и расшифровывает бомбы.

Я, вероятно, неправильно выполняю команду openssl. Или это какая-то тонкость при создании объекта 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

Можете ли вы предоставить сведения об исключениях? Я сообщил об ошибке некоторое время назад: https://bugzilla.novell.com/show_bug.cgi?id=646491, похоже похоже – 2010-12-06 20:05:07

+0

@djechelon: Свойство HasPrivateKey объекта X509Certificate2 является «ложным» после импорта файла .crt , Исключением является тот, который я бросаю. – JCCyC 2010-12-07 15:30:48

ответ

1

Сертификат содержит только открытый ключ. Команда OpenSSL, которую вы используете, создает ключ в файле mysitename.key. Вы должны загрузить файл ключа отдельно. AFAIR файл сгенерированного ключа должен содержать закрытый ключ RS64 с кодировкой base64 в формате PKCS # 8, инкапсулированный некоторыми текстовыми строками (BEGIN/END RSA PRIVATE KEY).

5

Создать PKCS # 12 сертификат:

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

Он теперь должен содержать закрытый ключ.