0

因此,我正在尝试使用用户选择的 X509Certificate2 签署电子邮件。我一直在尝试使用 MimeKit 来做到这一点,但是这方面的文档似乎很旧。

这就是他们告诉您在 github 页面上执行此操作的方式(在此处找到)

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

IE

X509Store store = new X509Store("My");

store.Open(OpenFlags.ReadOnly);

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

store.Close();

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

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

所以我的问题是:

  • 如何使用 MimeKit 获取证书列表?
  • 如何获得 AsymmetricKeyParameter?
4

1 回答 1

2

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

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

于 2015-05-02T13:45:59.140 回答