2011-02-02 6 views
0

次のコードを使用して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; 
} 

答えて

0

問題が見つかりました。これはMIMEコンテンツの追加改行でした。 MIME形式は、改行や改行については非常に不安です。 1つはあまりにも多く、もう1つはあまりにも少なく、あなたはうんざりです。 「7bit」と「sevenbit」のもう一つの問題は、マイクロソフトの転送エンコーダーが「SevenBit」と呼ばれていたことです。コード "SevenBit.ToString()"の1つの場所で列挙子の値 "7bit"の代わりに "sevenbit"という文字列が使用されました。

0

私はデザイン上の問題だと思います。 IronPortが電子メールを変更する場合、実際には署名付き電子メールを変更してその署名をそのまま維持する方法はありません。署名付きメールの変更を控えるか、署名を破棄する必要があります。私はIronPort(構成設定またはハードコーディングされたルールのいずれか)が電子メールを変更することを選択したと仮定します。

+0

問題は次のとおりです。先週まで私はメールを送信するために第三者コンポーネントを使用しました。それまでは、IronPortが署名を検出して削除しました。メールを修正するよりも。メールは受信者に署名されていないようです。これでIronPortはメールが署名されていることを知ることができないように見え、それを変更して署名の完全性を破壊します。私はもうサードパーティのコンポーネントを使用することはできませんb/cそれは64ビットのサポートがありません。 – Krumelur

+0

@krumelur以前はうまくいけば、解決策は簡単です - 3rdパーティーのソリューションで生成された電子メールを取得し、コードで再現してください。これで作業コードが完成しました。その後、IronPortが電子メールを破損するまでコードの修正を開始します。この方法で、アイアンポートが好きではないものを見つけることができます。 –

+0

私は問題を見つけました:それはMIMEコンテンツに1つの改行がありました!誰が地獄で腐ってはならないことを発明したのですか? :-) SMTPはとても "baaaah"です!追加の改行により、エンベロープヘッダーが正しく解釈されず、クライアント(およびIronPort)が誤ったエンコードタイプとみなされました。 – Krumelur

関連する問題