将openssl创建的自签名证书导入X509Certificate2(Mono):可以加密,无法解密

时间:2010-12-06 19:56:59

标签: c# mono openssl rsa x509certificate2

我在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 个答案:

答案 0 :(得分:7)

创建PKCS#12证书:

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

它现在应该包含私钥。

答案 1 :(得分:1)

证书仅包含公钥。您使用的OpenSSL命令在文件 mysitename.key 中创建密钥。您必须单独加载密钥文件。 AFAIR生成的密钥文件应包含PKCS#8格式的base64编码RSA私钥 - 由一些文本字符串封装( BEGIN / END RSA PRIVATE KEY )。