【发布时间】:2017-12-22 19:01:30
【问题描述】:
我必须与一些业务合作伙伴交换加密和签名的电子邮件。需要特定的算法,例如:
- 用于签名,RSASSA-PSS作为签名算法,
- 用于加密,RSAES-OAEP 用于密钥加密,AES-128 CBC 用于内容加密
我在使用 Mailkit 进行设置时遇到了麻烦,实际上是在 MailKit 和 BouncyCastle 背后。 这是我到目前为止的位置:
用于解密和签名验证
解密正文没问题,我在 Windows 商店中设置了我的私钥后,使用 WindowsSecureMimeContext 来完成
验证签名不行
case MultipartSigned signedBody:
try
{
using (var ctx = new WindowsSecureMimeContext(StoreLocation.LocalMachine))
{
var verifiedData = signedBody.Verify(ctx);
return verifiedData.All(o => o.Verify());
}
}
catch (Exception e)
{
throw new Exception("Error during signature verification.", e);
}
发件人的证书由通用 CA 签名,因此我再次使用 WindowsSecureMimeContext,但 verifyData.All(o => o.Verify()) 抛出 DigitalSignatureVerifyException(“无法验证数字签名:未知错误"-1073700864".")
用于签名和加密
嗯,这看起来很难......
对于签名,我似乎需要一个 BouncyCastle 的 PssSigner,我可以通过覆盖 DkimSigner 来获得它,尤其是 DigestSigner 属性
class TestSigner : DkimSigner
{
protected TestSigner(string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256)
: base(domain, selector, algorithm)
{
}
public TestSigner(AsymmetricKeyParameter key, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256)
: base(key, domain, selector, algorithm)
{
}
public TestSigner(string fileName, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256)
: base(fileName, domain, selector, algorithm)
{
}
public TestSigner(Stream stream, string domain, string selector, DkimSignatureAlgorithm algorithm = DkimSignatureAlgorithm.RsaSha256)
: base(stream, domain, selector, algorithm)
{
}
public override ISigner DigestSigner => SignerUtilities.GetSigner(PkcsObjectIdentifiers.IdRsassaPss);
}
但是我不知道在哪里使用它。也许在使用 MimeMessage.Sign() 时,我对方法签名中所需的参数有点迷茫
对于加密,我可以在 BouncyCastle 的库中找到 RsaesOaepParameters,但我不知道如何使用它。
非常感谢邮件专家的任何帮助!
【问题讨论】:
-
您的验证异常看起来可能来自 System.Security(您使用的是 WindowsSecureMimeContext 吗?)。如果是,请尝试升级到我昨天刚刚发布到 nuget.org 的 MimeKit/MailKit 2.0。我对 2.0 版的 WindowsSecureMimeContext 做了很多改进。我不确定该异常是由 MimeKit 中的错误引起的,还是只是 System.Security 层中的错误)。
-
不,这没有帮助。调试显示这是由 System.Security 触发的,同时检查 SignerInfo 的签名here。我改用了 BouncyCastleSecureMimeContext,它成功验证了签名
-
FWIW,我刚刚在 MimeKit 中实现了 RSAES-OAEP(一旦发布,将包含在 v2.5.0 中)。还支持 RSASSA-PSS(从 MimeKit v2.3.1 开始)。
标签: c# cryptography mimekit