【发布时间】: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 应用程序的外发邮件进行签名