【问题标题】:How do I sign an email message with a certificate and private key?如何使用证书和私钥签署电子邮件?
【发布时间】:2015-05-01 03:45:08
【问题描述】:

所以我正在尝试使用用户选择的 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?

【问题讨论】:

    标签: c# winforms ssl smime mimekit


    【解决方案1】:

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

    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 的下一个版本中为您执行转换。

    【讨论】:

    • 我必须进行一些小的修改才能使其编译,即 !certifcate.HasPrivateKey 变为 !x509Certificate2.HasPrivateKey 和 privateKey = keyPair.PrivateKey;成为 privateKey = keyPair.Private;但这似乎是我需要的。
    • 哎呀,是的。我刚刚更新了我的答案以解决这些问题。很高兴你得到了你需要的东西!
    猜你喜欢
    • 2011-11-10
    • 2021-09-29
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2013-01-06
    相关资源
    最近更新 更多