Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用证书和私钥对电子邮件进行签名?_C#_Winforms_Ssl_Smime_Mimekit - Fatal编程技术网

C# 如何使用证书和私钥对电子邮件进行签名?

C# 如何使用证书和私钥对电子邮件进行签名?,c#,winforms,ssl,smime,mimekit,C#,Winforms,Ssl,Smime,Mimekit,因此,我尝试使用用户选择的X509Certificate2来签署电子邮件。我一直在尝试使用MimeKit来实现这一点,但相关文档似乎很旧 这是他们在github页面(已找到)上告诉您的方法 我遇到的第一个问题是上面提到的 Org.BouncyCastle.X509.X509Certificate 我从X509Store()获取证书,它使用 System.Security.Cryptography.X509Certificates.X509Certificate2 i、 e 这表明我应该使用

因此,我尝试使用用户选择的X509Certificate2来签署电子邮件。我一直在尝试使用MimeKit来实现这一点,但相关文档似乎很旧

这是他们在github页面(已找到)上告诉您的方法

我遇到的第一个问题是上面提到的

Org.BouncyCastle.X509.X509Certificate 
我从X509Store()获取证书,它使用

System.Security.Cryptography.X509Certificates.X509Certificate2
i、 e

这表明我应该使用其他方法(我还没有找到任何文档的方法)检索我的证书列表

我的第二个问题是,CmsSigner需要第二个参数(AsymmetricKeyParameter),而不是一个,如示例所示

因此,我的问题是:

  • 如何使用MimeKit获取证书列表
  • 如何获取不对称参数

要从
System.Security.Cryptography.X509Certificates.X509Certificate2
获取
Org.BouncyCastle.X509.X509Certificate
,可以使用以下代码段:

static bool TryGetCertificateAndPrivateKey (X509Certificate2 x509Certificate2, out Org.BouncyCastle.X509.X509Certificate certificate, out AsymmetricKeyParameter privateKey)
{
    if (x509Certificate2 == null || !x509Certificate.HasPrivateKey) {
        certificate = null;
        privateKey = null;
        return false;
    }

    var keyPair = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair (x509Certificate2.PrivateKey);
    certificate = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate (x509Certificate2);
    privateKey = keyPair.Private;

    return true;
}

我将添加一个新的CmsSigner构造函数,该构造函数采用X509Certificate2,在下一版本的MimeKit中为您进行转换。

我不得不进行一些小修改,以使其能够编译,即!Certificate.HasPrivateKey变成了!x509Certificate2.HasPrivateKey和privateKey=keyPair.privateKey;成为privateKey=keyPair.Private;但这似乎正是我需要的。哦,是的。我刚刚更新了我的答案来解决这些问题。很高兴你得到了你需要的!
X509Store store = new X509Store("My");

store.Open(OpenFlags.ReadOnly);

// bind to dropdownlist for user to select...

store.Close();
static bool TryGetCertificateAndPrivateKey (X509Certificate2 x509Certificate2, out Org.BouncyCastle.X509.X509Certificate certificate, out AsymmetricKeyParameter privateKey)
{
    if (x509Certificate2 == null || !x509Certificate.HasPrivateKey) {
        certificate = null;
        privateKey = null;
        return false;
    }

    var keyPair = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair (x509Certificate2.PrivateKey);
    certificate = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate (x509Certificate2);
    privateKey = keyPair.Private;

    return true;
}