我必须与一些商业伙伴交换加密和签名的电子邮件。需要特定的算法,例如:
- 对于签名,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,但我不知道如何使用它。
邮件专家的任何帮助将不胜感激!