Мне приходится обмениваться зашифрованными и подписанными электронными письмами с некоторыми деловыми партнерами. Требуются специальные алгоритмы, такие как:
- для подписи, RSASSA-PSS в качестве алгоритма подписи,
- для шифрования, RSAES-OAEP для шифрования ключей и AES-128 CBC для шифрования контента
У меня проблемы с настройкой этого с помощью Mailkit, а на самом деле за ним стоят MailKit и BouncyCastle. Вот где я до сих пор:
Для расшифровки и проверки подписи
Расшифровка тела в порядке, я делаю это с помощью WindowsSecureMimeContext после настройки моего закрытого ключа в магазине Windows.
Проверка подписи не подходит
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);
}
Сертификат отправителя подписан общим ЦС, поэтому я снова использую WindowsSecureMimeContext, но VerifiedData.All(o => o.Verify()) выдает исключение DigitalSignatureVerifyException ("Не удалось проверить цифровую подпись: неизвестная ошибка" -1073700864 ".")
Для подписи и шифрования
Ну, выглядит жестко...
Для подписи мне кажется, что где-то мне нужен PssSigner BouncyCastle, который я могу получить, переопределив 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(), однако я немного потерял необходимые параметры в подписи метода
Что касается шифрования, я мог бы найти RsaesOaepParameters в библиотеке BouncyCastle, но не могу понять, как его использовать.
Любая помощь эксперта по почте будет высоко оценена!