我使用C#.NET 4.0發送簽名SMTP郵件像這樣:製作展望承認我的數字簽名的電子郵件
private void SendMailMessage(object data)
{
MailMessage message = new MailMessage();
message.From = new MailAddress(fromAddress);
message.To.Add(new MailAddress(emailTo));
message.Subject = "Subject";
message.IsBodyHtml = true;
message.Body += "Blah blah blah.";
byte[] messageBytes = Encoding.ASCII.GetBytes(message.Body);
SignedCms Cms = new SignedCms(new ContentInfo(messageBytes));
CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
Cms.ComputeSignature(Signer);
byte[] SignedBytes = Cms.Encode();
MemoryStream signedStream = new MemoryStream(SignedBytes);
AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data;name=sig.p7m");
message.AlternateViews.Add(signedView);
SmtpClient client = new SmtpClient(smtpServer, int.Parse(smtpServerPort));
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(message);
message.Dispose();
client = null;
}
從我可以告訴的是,這個「作品」如果查看原始數據的消息,我看到了一個大的PKCS簽名的替代視圖。但Outlook不認識它。 Outlook客戶端正常識別簽名的消息,並試圖對其進行驗證,並提出一點點證書上的信息和所有...
我想要那個......我缺少什麼?
編輯:我在這方面取得了一些進展,但仍有一些麻煩。下面是代碼看起來像現在:
private void SendMailMessage(string emailTo)
{
MailMessage message = new MailMessage();
message.From = new MailAddress(fromAddress);
message.To.Add(new MailAddress(emailTo));
message.Subject = "Special Delivery";
message.IsBodyHtml = false;
string body = "Content-Type: text/plain;charset=\"iso-8859-1\"\nContent-Transfer-Encoding: quoted-printable\n\nHere is some body text!";
byte[] messageBytes = Encoding.ASCII.GetBytes(body);
ContentInfo content = new ContentInfo(messageBytes);
SignedCms signedCms = new SignedCms(content, false);
CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);
signedCms.ComputeSignature(Signer);
byte[] signedBytes = signedCms.Encode();
MemoryStream ms = new MemoryStream(signedBytes);
AlternateView av = new AlternateView(ms, "application/pkcs7-mime; smime-type=signed-data;name=smime.p7m");
message.AlternateViews.Add(av);
SmtpClient client = new SmtpClient(smtpServer, int.Parse(smtpServerPort));
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(message);
message.Dispose();
client = null;
}
值得注意的是,在我離開message.Body空白這個時候,只有發送AlternateView。現在,當我把這個給Outlook收件箱,我得到的掛鎖圖標在我的電子郵件,在S/MIME裝飾物踢和嘗試驗證簽名,但失敗。用於簽署電子郵件的證書由公共信任的CA頒發。 編輯:那是我的錯,該證書不具備「安全電子郵件」的使用屬性。我會得到一個新的證書。
當我發送相同的電子郵件Gmail地址,我得到一個包含一堆垃圾就可以了* .p7m附件的空消息。