Импорт созданного openssl самоподписанного сертификата в X509Certificate2 (Mono): может шифровать, не расшифровывать - PullRequest
2 голосов
/ 06 декабря 2010

Я в Fedora 14, MonoDevelop 2.4, Mono 2.6.7. Я создал свой самоподписанный сертификат таким образом:

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();
    }
}

Ответы [ 2 ]

7 голосов
/ 05 февраля 2011

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

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

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

1 голос
/ 08 декабря 2010

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

...