2013-04-12 25 views
3

我使用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附件的空消息。

回答

4

是得到在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控件的成功驗證簽名,文本顯示出來,就像我希望它不顯示標題給用戶。

請注意,我不得不離開message.Body空。把任何東西放在消息中。身體會破壞它。