如何使用证书和私钥签署电子邮件消息?
How do I sign an email message with a certificate and private key?
所以我正在尝试使用用户选择的 X509Certificate2 对电子邮件进行签名。我一直在尝试使用 MimeKit 来做到这一点,但是这方面的文档似乎很旧。
这就是他们在 github 页面上告诉您的方式(找到 here)
using (var ctx = new MySecureMimeContext ()) {
var certificate = GetJoeysX509Certificate ();
var signer = new CmsSigner (certificate);
signer.DigestAlgorithm = DigestAlgorithm.Sha1;
message.Body = MultipartSigned.Create (ctx, signer, body);
}
我遇到的第一个问题是上面使用的是
Org.BouncyCastle.X509.X509Certificate
我正在从使用
的 X509Store() 获取证书
System.Security.Cryptography.X509Certificates.X509Certificate2
即
X509Store store = new X509Store("My");
store.Open(OpenFlags.ReadOnly);
// bind to dropdownlist for user to select...
store.Close();
这表明我应该使用其他方法(一种我找不到任何文档的方法)来检索我的证书列表。
我的第二个问题是,CmsSigner 需要第二个参数 (AsymmetricKeyParameter),而不是一个,如示例中所示。
所以我的问题是:
- 如何使用 MimeKit 获取证书列表?
- 如何获得 AsymmetricKeyParameter?
要从 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 中为您完成转换。
所以我正在尝试使用用户选择的 X509Certificate2 对电子邮件进行签名。我一直在尝试使用 MimeKit 来做到这一点,但是这方面的文档似乎很旧。
这就是他们在 github 页面上告诉您的方式(找到 here)
using (var ctx = new MySecureMimeContext ()) {
var certificate = GetJoeysX509Certificate ();
var signer = new CmsSigner (certificate);
signer.DigestAlgorithm = DigestAlgorithm.Sha1;
message.Body = MultipartSigned.Create (ctx, signer, body);
}
我遇到的第一个问题是上面使用的是
Org.BouncyCastle.X509.X509Certificate
我正在从使用
的 X509Store() 获取证书System.Security.Cryptography.X509Certificates.X509Certificate2
即
X509Store store = new X509Store("My");
store.Open(OpenFlags.ReadOnly);
// bind to dropdownlist for user to select...
store.Close();
这表明我应该使用其他方法(一种我找不到任何文档的方法)来检索我的证书列表。
我的第二个问题是,CmsSigner 需要第二个参数 (AsymmetricKeyParameter),而不是一个,如示例中所示。
所以我的问题是:
- 如何使用 MimeKit 获取证书列表?
- 如何获得 AsymmetricKeyParameter?
要从 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 中为您完成转换。