签署电子邮件:这段代码是否正确?

时间:2011-02-02 09:52:56

标签: c# .net

我正在尝试使用以下代码对MultiMIME消息进行数字签名。我想知道它是否正确,因为如果邮件通过Cisco IronPort电子邮件扫描程序我遇到问题。 IronPort尝试删除签名以向邮件附加一些其他信息,但它不会检测到我的邮件已签名。因此它只是附加并且签名变得无效。 让我怀疑我的代码的原因是签名邮件的信封设置为“SevenBit”,但签名附加了Base64编码。但是因为它有效(除了IronPort)问题,我认为它是正确的。

我还可以看到,GetAlternateView()会将trasfer编码返回为“sevenbit”而不是“7bit”。这显然是错误的,并且在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;
}

2 个答案:

答案 0 :(得分:0)

我会说这是设计问题。如果IronPort修改了电子邮件,它实际上无法修改签名的电子邮件并保持其签名不变。它应该避免修改已签名的邮件或破坏签名。我假设IronPort(通过配置设置或硬编码规则)选择修改电子邮件。

答案 1 :(得分:0)

已发现此问题。这是MIME内容中的附加换行符。 MIME格式对于换行符和换行符非常挑剔。一个太多或一个太少而且你被搞砸了。 关于“7bit”与“sevenbit”的另一个问题是,微软的传输编码调查员被称为“SevenBit”。在代码“SevenBit.ToString()”中的一个地方使用了字符串“sevenbit”而不是枚举值“7bit”。