Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# S/mime签名和加密电子邮件,在附件末尾添加签名_C#_Smime - Fatal编程技术网

C# S/mime签名和加密电子邮件,在附件末尾添加签名

C# S/mime签名和加密电子邮件,在附件末尾添加签名,c#,smime,C#,Smime,电子邮件附带的文本文件带有附加字符,我认为这是签名,电子邮件客户端说电子邮件未签名 我应该为签名和加密使用替代视图吗?我把内容类型搞砸了吗 从各种例子中,我得出了如下结论: var buffer = new StringBuilder(); buffer.Append("MIME-Version: 1.0\r\n"); buffer.Append("Content-Type: multipart/mixed; boundary=unique-boundary-1\r\n"); buffer.Ap

电子邮件附带的文本文件带有附加字符,我认为这是签名,电子邮件客户端说电子邮件未签名

我应该为签名和加密使用替代视图吗?我把内容类型搞砸了吗

从各种例子中,我得出了如下结论:

var buffer = new StringBuilder();
buffer.Append("MIME-Version: 1.0\r\n");
buffer.Append("Content-Type: multipart/mixed; boundary=unique-boundary-1\r\n");
buffer.Append("\r\n");
buffer.Append("This is a multi-part message in MIME format.\r\n");
buffer.Append("--unique-boundary-1\r\n");
buffer.Append("Content-Type: text/plain\r\n");  
buffer.Append("Content-Transfer-Encoding: 7Bit\r\n\r\n");
buffer.Append(bodyText);
if (!bodyText.EndsWith("\r\n"))
    buffer.Append("\r\n");
buffer.Append("\r\n\r\n");

buffer.Append("--unique-boundary-1\r\n");
buffer.Append("Content-Type: application/octet-stream; file=" + outputFileName + "\r\n");
buffer.Append("Content-Transfer-Encoding: base64\r\n");
buffer.Append("Content-Disposition: attachment; filename=" + outputFileName + "\r\n");
buffer.Append("\r\n");

var memoryStream = new MemoryStream();
var writer = new StreamWriter(memoryStream);
writer.Write(_exportString);
writer.Flush();
writer.Dispose();

var binaryData = memoryStream.ToArray();

var base64Value = Convert.ToBase64String(binaryData, 0, binaryData.Length);
var position = 0;
while (position < base64Value.Length)
{
    var chunkSize = 100;
    if (base64Value.Length - (position + chunkSize) < 0)
        chunkSize = base64Value.Length - position;
    buffer.Append(base64Value.Substring(position, chunkSize));
    buffer.Append("\r\n");
    position += chunkSize;
}
buffer.Append("\r\n");

var body = buffer.ToString();

var messageData = Encoding.ASCII.GetBytes(body);

//add digital signature:
var signedCms = new SignedCms(new ContentInfo(messageData));
var signerCertificate = GetOurCertificate();
var signer = new CmsSigner(SubjectIdentifierType.SubjectKeyIdentifier, signerCertificate);
signedCms.ComputeSignature(signer);
var signedBytes = signedCms.Encode();
////

//Encrypt
var content = new ContentInfo(signedBytes);
var envelopedCms = new EnvelopedCms(content);

message.To.Add(new MailAddress("yyy@xxx.com"));
var recipientCertifcate = GetCertificate("C544FD2E80BD2B3994D43DBDB820DBE3A3A29922");
var recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, recipientCertifcate );

envelopedCms.Encrypt(recipient);
var encryptedBytes = envelopedCms.Encode();
////

var stream = new MemoryStream(encryptedBytes);
var view = new AlternateView(stream, "application/pkcs7-mime; smime-type=enveloped-data;name=smime.p7m");
message.AlternateViews.Add(view);


SmtpClient mailClient = new SmtpClient("localhost", 25);
mailClient.Send(message);
var buffer=new StringBuilder();
Append(“MIME版本:1.0\r\n”);
buffer.Append(“内容类型:multipart/mixed;boundary=unique-boundary-1\r\n”);
buffer.Append(“\r\n”);
Append(“这是MIME格式的多部分消息。\r\n”);
buffer.Append(“--unique-boundary-1\r\n”);
buffer.Append(“内容类型:text/plain\r\n”);
Append(“内容传输编码:7Bit\r\n\r\n”);
buffer.Append(bodyText);
如果(!bodyText.EndsWith(“\r\n”))
buffer.Append(“\r\n”);
buffer.Append(“\r\n\r\n”);
buffer.Append(“--unique-boundary-1\r\n”);
buffer.Append(“内容类型:应用程序/八位字节流;文件=“+outputFileName+”\r\n”);
Append(“内容传输编码:base64\r\n”);
buffer.Append(“内容处置:附件;文件名=“+outputFileName+”\r\n”);
buffer.Append(“\r\n”);
var memoryStream=新的memoryStream();
var writer=新的StreamWriter(memoryStream);
writer.Write(_exportString);
writer.Flush();
writer.Dispose();
var binaryData=memoryStream.ToArray();
var base64Value=Convert.ToBase64String(binaryData,0,binaryData.Length);
var位置=0;
while(位置
对于代码墙表示歉意,但我不确定是否是正文或附件导致了问题。您可能会更幸运地使用和,因为我已经在那里实现了S/MIME支持,使操作非常简单。如果您有任何问题,我很乐意帮助您回答。@jstedfast我确实看过MimeKit。在这种情况下,收件人和发件人地址永远不会更改。我不想实现一个db来充当仅用于2个地址的证书存储。我宁愿使用Windows证书存储。您可以将Windows存储与MimeKit一起使用。只需注册MimeKit附带的WindowsSecureMimeContext类:)@jstedfast哦,真的吗?好的,我试试看。