【问题标题】:Signing S/MIME with Mimekit (Certicate from store)使用 Mimekit 签署 S/MIME(来自商店的证书)
【发布时间】:2019-10-14 05:08:04
【问题描述】:

我想使用 Windows certmanager 存储中的证书签署 mime Body。相同的证书可以很好地使用某些邮件代理(例如 Outlook、TBird)签署邮件。

我正在将证书加载到“存储”中 X509Store store = new X509Store(StoreLocation.CurrentUser);

并与 X509Certificate2Collection signingCert = currentCerts.Find(X509FindType.FindBySubjectDistinguishedName, certName, false);

 I get the right certificate into signingCert.


 using (var ctx = new TemporarySecureMimeContext())
        {                
            var cert2 = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(cert);
            CmsSigner signer = new CmsSigner(cert2);
            ctx.Import(cert2);
            mimeMessage.Body = ApplicationPkcs7Mime.Sign(ctx, signer, DigestAlgorithm.Sha1, body);

        }

问题是(据我所知)CmsSigner 需要两个参数,而不是描述的一个。在最新的 nuget 包中,CmsSigner 需要一个密钥作为第二个参数,但我如何从商店获取密钥?

任何提示表示赞赏...... TIA

【问题讨论】:

  • 必须是 BC 吗?它只是 PKCS7/CMS 还是必须是 S/MIME?具体来说,任何 BC 代码通常会将私钥导出到内存,而本机 .net 代码可以与 CNG 互操作(这意味着 BC 仅在私钥在证书存储中标记为“可导出”且通常根本不适用于智能卡时才有效) )。如果你尝试System.Security.Cryptography.Pkcs.SignedCms 类呢?
  • 应该是 S/MIME 我还应该说我是密码学的新手,我会尝试只使用 MimeKit 对来自 Web 应用程序的外发邮件进行签名

标签: c# .net-core mimekit


【解决方案1】:

从 MimeKit v2.4 开始,用于 CmsSigner 的 netstandard2.0 API 将与 .NETFramework4.x API 相同,允许您通过传递 X509Certificate2 来创建 CmsSigner,而无需将其转换为 BouncyCastle 证书和无需将 X509Certificate2 的 PrivateKey 转换为 BouncyCastle AsymmetricKeyParameter。

CmsSigner signer = new CmsSigner (certificate2);

但是,应该注意的是,这可能会也可能不会起作用,具体取决于是否可以导出私钥。

【讨论】:

  • WindowsSecureMimeContext 类不存在。我找到了一个示例,但有很多错误……我在过去 7 天里一直在寻找一个正在运行的示例,但放弃了我每次都在创建一个合适的 WindowsSecureMimeContext 类。 (我知道它不可能那么多,但我已经使用 C# 已经 4 周了,在我 50 岁的时候,它需要更长的时间来学习 ;-) TIA
  • 证书被标记为可导出。我必须了解有关证书的更多信息,但我不明白为什么它必须是可导出的。当它在 Windows 商店中时,所有有权访问该商店的应用程序都可以读取它,对吗?对于“可导出”,我认为这意味着它可以“导出”到另一台机器,但这可能是错误的。有什么好的资源可以学习 Windows 中的证书处理吗?
  • 如果 WindowsSecureMimeContext 不可用,那么这意味着您可能正在使用 .NET Core,因为它仅作为 .NET 4.5、4.6 和 4.7 的一部分存在。由于证书是可导出的,因此只需使用我在答案中提供的 CmsSigner 方法。可导出并不一定意味着“导出到另一个系统”,它只是意味着“使私钥可供除核心 Windows API 以外的软件使用”,这是必需的,因为 BouncyCastle 不使用核心 Windows API 来签名/加密/等。
  • 感谢您阐明“可导出”的含义。这有助于我理解它。是的,我在我的问题中标记的 net Core 上。我在其他示例中看到其他人编写了自己的 WindowsSecureMimeContext 类,但找不到该类本身。 MimeKit 本身很棒!非常感谢。这也是我不使用 TemporarySecureMimeContext 而不是 WindowsSecureMimeContext 类的原因。
  • 大多数人可能只是从官方 MimeKit 存储库 @github.com/jstedfast/MimeKit/blob/master/MimeKit/Cryptography/… 复制了 WindowsSecureMimeContext.cs 文件(注意:您还需要复制其他 WindowsSecureMime*.cs 文件)
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2014-05-24
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2016-06-19
相关资源
最近更新 更多