Mig*_*iro 6 c# email encryption mime digital-signature
我想在不使用任何第三方 API 的情况下发送加密和签名的邮件。如果我仅发送带有签名的备用视图,Windows Mail 可以对其进行验证。如果我仅使用带有加密数据的备用视图发送,Windows Mail 可以解密它。但如果我同时发送两个附件,Windows Mail 会收到 2 个附件。如果我签名encryptedBytes并将这些签名字节添加到替代视图中,它只会验证签名并且消息为空。任何想法?
MailMessage message = new MailMessage();
message.From = new MailAddress(lblMail.Text);
message.Subject = txtSubject.Text;
string body = "Content-Type: text/plain\r\nContent-Transfer-Encoding: 7Bit\r\n\r\n" + structForm();
byte[] messageData = Encoding.ASCII.GetBytes(body);
ContentInfo content = new ContentInfo(messageData);
EnvelopedCms envelopedCms = new EnvelopedCms(content);
message.To.Add(new MailAddress(provMail));
CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.SubjectKeyIdentifier, this.certificate);
envelopedCms.Encrypt(recipient);
byte[] encryptedBytes = envelopedCms.Encode();
SignedCms Cms = new SignedCms(new ContentInfo(encryptedBytes));
CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, new X509Certificate2(@"c:\serv.pfx","123"));
Cms.ComputeSignature(Signer);
byte[] SignedBytes = Cms.Encode();
MemoryStream encryptedStream = new MemoryStream(encryptedBytes);
AlternateView encryptedView = new AlternateView(encryptedStream, "application/pkcs7-mime; smime-type=signed--data;name=smime.p7m");
message.AlternateViews.Add(encryptedView);
MemoryStream signedStream = new MemoryStream(SignedBytes);
AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data;name=sig.p7m");
message.AlternateViews.Add(signedView);
System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("emailaddress@xpto.com", "XXXXXX");
SmtpClient client = new SmtpClient("smtp.xpto.com");
client.UseDefaultCredentials = false;
client.Credentials = SMTPUserInfo;
client.Send(message);
Label2.Text = "Assinado e cifrado!";
Run Code Online (Sandbox Code Playgroud)
您应该先签名,然后加密。
虽然最初的 CMS 和 S/MIME 规范允许您以任一顺序执行操作,但后来的工作指出,签署您无法阅读的文档是一个非常糟糕的主意。签名应位于纯文本之上。
生成的 MIME 消息应该只有一个部分,该部分应该是 S/MIME 封装数据。您的消息有两个部分,加密部分被错误地标记为签名数据内容类型。创建并签署SignedCms对象。对其进行编码,并将编码后的值作为对象的内容EnvelopedCms。对其进行加密,并使用其编码值作为 的内容MailMessage,内容类型为“application/pkcs7-mime; smime-type=enveloped-data”。
| 归档时间: |
|
| 查看次数: |
12151 次 |
| 最近记录: |