C# 如何使用证书和私钥对电子邮件进行签名?
因此,我尝试使用用户选择的X509Certificate2来签署电子邮件。我一直在尝试使用MimeKit来实现这一点,但相关文档似乎很旧 这是他们在github页面(已找到)上告诉您的方法 我遇到的第一个问题是上面提到的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 这表明我应该使用
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;
}