次のコードを使用してMultiMIMEメッセージにデジタル署名しようとしています。メールがCisco IronPort電子メールスキャナを通過する場合、問題が発生しているので正しいかどうか疑問です。 IronPortは署名を削除してメールに追加情報を追加しようとしますが、私のメールが署名されていることは検出しません。したがって、追加するだけで署名は無効になります。 私のコードについて疑わしいのは、署名されたメッセージのエンベロープが "SevenBit"に設定されているが、署名がBase64でエンコードされているということです。しかし、IronPortを除いて問題なく動作しているので、正しいと思います。電子メールに署名する:このコードは正しいですか?
また、GetAlternateView()は、 "7bit"の代わりに "sevenbit"としてトランサーエンコーディングを返します。これは明らかに間違っており、2005年の.NETの既知のバグでしたが、今修正するべきではありませんか?
質問は次のとおりです。このコードは、実際にやるべきことをやっているのですか? メールoMessageが完全に準備され、署名されていないと呼び出されます。次に
oMessage = this.Sign(oMessage);
MailMessage oMail.AlternateViews.Add(oMessage.GetAlternateView());
となりメールが送信されます。
/// <summary>
/// Signs the contents of the specified envelope.
/// </summary>
/// <param name="oMessage">The mail content to sign. Can be null.</param>
/// <returns>An envelope which contains a signed mail.</returns>
private Envelope Sign(Envelope oMessage)
{
Envelope oSignedMessage = new Envelope("multipart/signed; boundary=\"" + this.sBoundary + "\"; protocol=\"application/x-pkcs7-signature\"", TransferEncoding.SevenBit);
//oSignedMessage.Append("\r\n");
// Open a new envelope which will contain the original mail content and the signature
oSignedMessage.Append("--").Append(this.sBoundary).Append("\r\n");
// Append the content to the new envelope
// Can be null if no plain text or html content and no attachments.
if (oMessage != null)
{
oSignedMessage.Append(oMessage);
// Don't need this anymore
oMessage.Dispose();
}
oSignedMessage.Append("\r\n");
// Create a second part in the same envelope for the signature
oSignedMessage.Append("--").Append(this.sBoundary).Append("\r\n");
oSignedMessage.Append("Content-Type: application/x-pkcs7-signature; name=\"smime.p7s\"\r\n");
oSignedMessage.Append("Content-Transfer-Encoding: base64\r\n");
oSignedMessage.Append("Content-Disposition: attachment; filename=\"smime.p7s\"\r\n");
oSignedMessage.Append("\r\n");
// Create the signature..
byte[] aSignature = this.GetSignature(oMessage);
// ..and append it
oSignedMessage.Append(Convert.ToBase64String(aSignature, Base64FormattingOptions.InsertLineBreaks));
oSignedMessage.Append("\r\n\r\n");
// Close the whole envelope
oSignedMessage.Append("--").Append(this.sBoundary).Append("--\r\n");
return oSignedMessage;
}
問題は次のとおりです。先週まで私はメールを送信するために第三者コンポーネントを使用しました。それまでは、IronPortが署名を検出して削除しました。メールを修正するよりも。メールは受信者に署名されていないようです。これでIronPortはメールが署名されていることを知ることができないように見え、それを変更して署名の完全性を破壊します。私はもうサードパーティのコンポーネントを使用することはできませんb/cそれは64ビットのサポートがありません。 – Krumelur
@krumelur以前はうまくいけば、解決策は簡単です - 3rdパーティーのソリューションで生成された電子メールを取得し、コードで再現してください。これで作業コードが完成しました。その後、IronPortが電子メールを破損するまでコードの修正を開始します。この方法で、アイアンポートが好きではないものを見つけることができます。 –
私は問題を見つけました:それはMIMEコンテンツに1つの改行がありました!誰が地獄で腐ってはならないことを発明したのですか? :-) SMTPはとても "baaaah"です!追加の改行により、エンベロープヘッダーが正しく解釈されず、クライアント(およびIronPort)が誤ったエンコードタイプとみなされました。 – Krumelur