C# outlook无法打开s/mime签名邮件

C# outlook无法打开s/mime签名邮件,c#,smtpclient,sign,smime,skpsmtpmessage,C#,Smtpclient,Sign,Smime,Skpsmtpmessage,我需要使用s/mime对电子邮件进行数字签名。我已为我的附件创建了分离的签名,但outlook无法打开它:“无法打开此项目。基础安全系统找不到您的数字标识名”。此电脑上已安装证书,需要在此代码中调整smth: const int CHARS_IN_LINE = 64; StringBuilder message = new StringBuilder(); message.AppendLine("Content-Type: multipart/signed; protocol=\&q

我需要使用s/mime对电子邮件进行数字签名。我已为我的附件创建了分离的签名,但outlook无法打开它:“无法打开此项目。基础安全系统找不到您的数字标识名”。此电脑上已安装证书,需要在此代码中调整smth:

const int CHARS_IN_LINE = 64;

StringBuilder message = new StringBuilder();
message.AppendLine("Content-Type: multipart/signed; protocol=\"application/pkcs7-signature\";");
message.AppendLine(" boundary=\"__multipart-signed-boundary__\"");
message.AppendLine("Content-Transfer-Encoding: 7bit");
message.AppendLine("MIME-Version: 1.0");
message.AppendLine("Subject: " + tbMessageSubject.Text);
message.AppendLine();
message.AppendLine("--__multipart-signed-boundary__");
message.AppendLine("Content-Type: text/xml; charset=\"windows - 1251\"");
message.AppendLine("Content-Disposition: attachment; ");
message.AppendLine(" filename=\"" + Path.GetFileName(filename) + "\"");
message.AppendLine("Content-Transfer-Encoding: base64");
message.AppendLine();

var dataToSign = File.ReadAllBytes(filePath);

var base64Data = Convert.ToBase64String(dataToSign, Base64FormattingOptions.None);
var base64DataSb = new StringBuilder(base64Data);
for (int i = CHARS_IN_LINE; i < base64DataSb.Length; i += CHARS_IN_LINE + 2) // \r\n
    base64DataSb.Insert(i, "\r\n");

message.AppendLine(base64DataSb.ToString());

message.AppendLine("--__multipart-signed-boundary__");
message.AppendLine("Content-Type: application/pkcs7-signature; name=\"smime.p7m\"");
message.AppendLine("Content-Transfer-Encoding: base64");
message.AppendLine("Content-Disposition: attachment; filename=smime.p7s");
message.AppendLine();

CmsSigner signer = new CmsSigner(clientCert);
SignedCms cms = new SignedCms(new ContentInfo(dataToSign), true);
cms.ComputeSignature(signer);

var signature = cms.Encode();

var base64Signature = Convert.ToBase64String(signature, Base64FormattingOptions.None);
var base64Sb = new StringBuilder(base64Signature);

for (int i = CHARS_IN_LINE; i < base64Sb.Length; i += CHARS_IN_LINE + 2) // \r\n
    base64Sb.Insert(i, "\r\n");

message.AppendLine(base64Sb.ToString());
message.AppendLine();
message.AppendLine("--__multipart-signed-boundary__--");
message.AppendLine(".");

var stream = new MemoryStream(Encoding.ASCII.GetBytes(message.ToString()));

MailMessage mail = new MailMessage();
mail.From = new MailAddress(tbEmailFrom.Text);
mail.To.Add(new MailAddress(tbEmailTo.Text));
AlternateView alternateView = new AlternateView(stream, "application/pkcs7-mime; smime-type=signed-data; name=smime.p7m");
alternateView.TransferEncoding = TransferEncoding.SevenBit;
mail.AlternateViews.Add(alternateView);

SmtpClient client = new SmtpClient(host, port);
client.EnableSsl = chbUseSSL.Checked;
client.Send(mail);
const int CHARS_IN_LINE=64;
StringBuilder消息=新建StringBuilder();
message.AppendLine(“内容类型:多部分/已签名;协议=\“应用程序/pkcs7签名\;”);
message.AppendLine(“boundary=\”\uuuu多部分签名-boundary\uuuuu\”;
message.AppendLine(“内容传输编码:7bit”);
message.AppendLine(“MIME版本:1.0”);
message.AppendLine(“主题:+tbMessageSubject.Text”);
message.AppendLine();
message.AppendLine(“--”多部分签名边界“);
message.AppendLine(“内容类型:text/xml;字符集=\“windows-1251\”);
message.AppendLine(“内容处置:附件;”);
message.AppendLine(“文件名=\”+路径.GetFileName(文件名)+“\”);
message.AppendLine(“内容传输编码:base64”);
message.AppendLine();
var dataToSign=File.ReadAllBytes(文件路径);
var base64Data=Convert.ToBase64String(dataToSign,base64formatingoptions.None);
var base64DataSb=新的StringBuilder(base64Data);
对于(int i=CHARS_IN_LINE;i
最后,问题出现在AlternateView中指定的mediaType中,正确的方式是:

AlternateView alternateView = new AlternateView(stream, "multipart/signed; protocol=\"application/pkcs7-signature\"; boundary=\"__multipart-signed-boundary__\"");
alternateView.TransferEncoding = TransferEncoding.SevenBit;

多亏了,我需要签名的不是附件,而是带有标题的附件(首先是
\uu multipart-signed-boundary
带有附件)

请参阅以下内容:通过outlook对邮件进行签名/加密工作正常。但不使用上面的代码…请参阅以下内容:谢谢,我已经看过这篇文章了,它几乎与我的相同,只是标题有一些变化。您是否使用与证书中相同的加密模式?您在发布的代码中是否有任何异常?添加一个try/catch。如果您发送没有附件的电子邮件,上述代码是否有效?