【问题标题】:EWS - digitally signed email (smime.p7m)EWS - 数字签名电子邮件 (smime.p7m)
【发布时间】:2017-07-11 16:02:03
【问题描述】:

我正在尝试使用 EWS 阅读数字签名电子邮件的内容。不幸的是,当我使用 EnvelopeCMS 的方法时出现异常:

System.Security.Cryptography.CryptographicException: ASN1 - 错误标签 满足的价值。

在 System.Security.Cryptography.Pkcs.EnvelopedCms.OpenToDecode(Byte[] 编码消息)
在 System.Security.Cryptography.Pkcs.EnvelopedCms.Decode(Byte[] encodedMessage) 在 myExchange.Email.DecryptToFile(Byte[] data)

(encodedMessage 是电子邮件的 smime.p7m 附件)。

编辑:这是一个关键的代码片段:

foreach (Attachment attachment in emailMessage.Attachments)
{
    if (attachment is FileAttachment)
    {
         FileAttachment fileAttachment = attachment as FileAttachment;

         if (fileAttachment.Name == "smime.p7m")                        
         {
              byte[] content = fileAttachment.Content;

              MemoryStream stream = new MemoryStream();
              fileAttachment.Load(stream);
              StreamReader stReader = new StreamReader(stream);
              stream.Seek(0, SeekOrigin.Begin);
              content = stream.GetBuffer();

              var encrypted = new System.Security.Cryptography.Pkcs.EnvelopedCms();
              encrypted.Decode(content); // <==== Here occurs exception

              encrypted.Decrypt();
              byte[] unencryptedButRawMimeEntity = encrypted.ContentInfo.Content;
         }
    }
}

关于电子邮件的更多信息 - EWS 输出控制台说,它有一个“多部分/签名”内容类型的附件

<m:ResponseCode>NoError</m:ResponseCode>
            <m:Attachments>
              <t:FileAttachment>
                <t:AttachmentId Id="AAMkADNi(... CUT ...)T5PWd/bDM=" />
                <t:Name>smime.p7m</t:Name>
                <t:ContentType>multipart/signed</t:ContentType>

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果您也发布代码,您可能会获得更多更好的帮助。发布代码时,请确保它是minimal, complete and verifiable example
  • 试试 fileAttachment.Load();然后 fileAttachment.Content 将是附件。然后尝试您的解密内容...也许显示签名的含义。此外,您现在正在处理附件而不是电子邮件,不确定两者是否都已签名和/或这意味着什么。
  • @Rafal-Zak 我遇到了同样的问题。您找到解决方案了吗?

标签: email exchangewebservices decoding smime


【解决方案1】:

没有测试,所以请告诉我我会想象这样的事情......

foreach (Attachment attachment in emailMessage.Attachments)
{
    FileAttachment fileAttachment = attachment as FileAttachment
    if (attachment != null)
    {        
         fileAttachment.Load();
         if (fileAttachment.Name == "smime.p7m")                        
         {
              byte[] content = fileAttachment.Content;

              var encrypted = new EnvelopedCms();
              encrypted.Decode(content);
              encrypted.Decrypt();
              byte[] unencryptedButRawMimeEntity = encrypted.ContentInfo.Content;
         }
    }
}

【讨论】:

  • 这简化了代码,但结果是相同的 - 在 encrypted.Decode() 操作上出现异常“ASN1 - 遇到错误的标签值”。我处理附件,因为我的目标是从此类电子邮件中获取/检查附件。它在 Outlook 中被标记为“已签名”,其中包含一个 PDF 附件。对于其他电子邮件,代码可以正常工作,但签名的电子邮件看起来像是里面有一个“smime.p7m”附件。
  • 关于电子邮件的更多信息:EWS 控制台输出显示,它有一个 Content-Type="multipart/signed" 的 FileAttachment
  • 我不知道,但是遵循这个stackoverflow.com/questions/21629206/…,我确定您已经看过...他是否建议您需要解码包含附件而不是附件本身的原始邮件。 Sozs 发现很难跟上,也许它对你更有意义。
猜你喜欢
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2016-04-09
  • 2018-07-24
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多