Я пытаюсь отправить электронное письмо с приложением, и мне нужно его зашифровать и подписать.Я могу зашифровать это, я могу подписать это, но когда я пытаюсь сделать и то, и другое, я получаю письмо, подписанное с нечитаемым текстом, или шифрование электронной почты с открытым текстом без PJ, только base64string.
спасибо за ваш ответ.это мой код для лучшего ответа:
string message = BuildMessage(body, pjs, false);
byte[] messageData = Encoding.UTF8.GetBytes(message);
SignedCms signedCms = new SignedCms(new ContentInfo(messageData));
CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, GetCertificateFromEmailFrom(from));
signedCms.ComputeSignature(signer);
byte[] signedBytes = signedCms.Encode();
ContentInfo content = new ContentInfo(signedBytes);
EnvelopedCms envelopeCms = new EnvelopedCms(content);
CmsRecipientCollection toRecipientCollection = new CmsRecipientCollection();
Dictionary<string, X509Certificate2> certificatesForEncryption = new Dictionary<string, X509Certificate2>();
List<string> mailRefuser = GetCertificateFromEMailTo(to, out certificatesForEncryption);
foreach (KeyValuePair<string, X509Certificate2> certificate in certificatesForEncryption)
{
CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, certificate.Value);
toRecipientCollection.Add(recipient);
}
envelopeCms.Encrypt(toRecipientCollection);
byte[] encryptedBytes = envelopeCms.Encode();
MailMessage msg = new MailMessage();
msg.From = new MailAddress(from);
foreach (string toMail in to)
{
msg.To.Add(new MailAddress(toMail));
}
msg.Subject = subject;
MemoryStream ms = new MemoryStream(encryptedBytes);
AlternateView av = new AlternateView(ms, "application/pkcs7-mime; smime-type=enveloped-data"); //"application/pkcs7-mime; smime-type=signed-data;name=smime.p7m; content-transfer-encoding=utf-8; content-disposition=attachment; fileName=smime.p7m;");
msg.AlternateViews.Add(av);
SmtpClient smtpClient = new SmtpClient(ConfigurationManager.AppSettings["ServerSMTPWithCredentials"]);
smtpClient.Credentials = new NetworkCredential(login, password);
ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certifficate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
smtpClient.EnableSsl = true;
smtpClient.Send(msg);