让Outlook识别我的数字签名电子邮件

我使用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客户端通常会识别已签名的邮件并尝试validation它们并在邮件上放置一些证书以及所有这些…

我想要那……我错过了什么?

编辑:我自己在这方面取得了一些进展,但仍然遇到了一些麻烦。 这是代码现在的样子:

  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 doodad启动并尝试validation签名者,但是失败了。 用于签署电子邮件的证书由公开信任的CA颁发。 编辑:这是我的错,证书没有“安全电子邮件”使用属性。 我会得到一张新证书。

当我将同一封电子邮件发送到Gmail地址时,我收到一条空白消息,其中包含* .p7m附件,其中包含一堆垃圾。

在Outlook中使用此代码的代码如下所示:

 private void SendMailMessage(string emailTo) { MailMessage message = new MailMessage(); message.From = new MailAddress(fromAddress); message.To.Add(new MailAddress(emailTo)); message.Subject = "Regarding your lottery winnings"; message.IsBodyHtml = false; string body = "Content-Type: text/plain;charset=\"iso-8859-1\"\nContent-Transfer-Encoding: quoted-printable\n\nBlah blah blah blah blah blah."; byte[] messageBytes = Encoding.ASCII.GetBytes(body); ContentInfo content = new ContentInfo(messageBytes); SignedCms signedCms = new SignedCms(content, false); CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, emailCert); 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; } 

当然,使用有效的证书。 现在,当我发送此电子邮件并在Outlook中查看时,我在电子邮件中获得了证书图标,并且S / MIME控件成功validation了签名,文本显示就像我想要的那样而不向用户显示标题。

请注意,我必须留下message.Body为空。 把任何东西放在消息中。身体会打破它。