簡體   English   中英

將openssl創建的自簽名證書導入X509Certificate2(Mono):可以加密,無法解密

[英]Importing an openssl-created self-signed cert into a X509Certificate2 (Mono): Can encrypt, can't decrypt

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

創建PKCS#12證書:

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

它現在應該包含私鑰。

證書僅包含公鑰。 您使用的OpenSSL命令在文件mysitename.key中創建密鑰。 您必須單獨加載密鑰文件。 AFAIR生成的密鑰文件應包含PKCS#8格式的base64編碼RSA私鑰 - 由一些文本字符串( BEGIN / END RSA PRIVATE KEY )封裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM