2017-02-21 3 views
0

J'essaie de lire le contenu d'un e-mail signé numériquement à l'aide d'EWS. Malheureusement, quand j'utilise une approche avec EnvelopeCMS je reçois une exception:EWS - e-mail à signature numérique (smime.p7m)

System.Security.Cryptography.CryptographicException: ASN1 - mauvaise étiquette valeur atteint.

dans System.Security.Cryptography.Pkcs.EnvelopedCms.OpenToDecode (byte [] encodedMessage)
dans System.Security.Cryptography.Pkcs.EnvelopedCms.Decode (byte [] encodedMessage) dans myExchange.Email.DecryptToFile (Octet [] données)

(encodedMessage est la pièce jointe smime.p7m d'un e-mail).

EDIT: c'est un fragment de code clé:

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; 
     } 
    } 
} 

En savoir plus sur un e-mail - console de sortie EWS dit qu'il a une pièce jointe de "mutipart/signé" type de contenu

<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> 
+0

Bienvenue sur Stack Overflow! Vous obtiendrez probablement plus d'aide et de meilleure qualité si vous publiez votre code aussi. Lorsque vous publiez du code, assurez-vous qu'il s'agit d'un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

Essayez simplement fileAttachment.Load(); puis fileAttachment.Content sera l'attactment. alors essayez vos trucs de décryptage ... peut-être montrer ce que cela signifie d'être signé. aussi vous travaillez maintenant avec la pièce jointe et pas l'email pas sûr si les deux sont signés et/ou ce que cela signifie. – Seabizkit

Répondre

0

n'a pas été testé alors s'il vous plaît laissez-moi savoir j'imagine quelque chose comme ça ...

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; 
     } 
    } 
} 
+0

Cela simplifie le code, mais le résultat est le même - exception "ASN1 - valeur de balise incorrecte rencontrée" sur l'opération encrypted.Decode(). Je travaille sur des pièces jointes, parce que je vise à obtenir/vérifier les pièces jointes d'un tel e-mail. Il est marqué comme "signé" dans Outlook et a une pièce jointe PDF dans celui-ci. Pour les autres e-mails, le code fonctionne bien, mais le code signé ressemble à une pièce jointe "smime.p7m". –

+0

En savoir plus sur l'e-mail: La sortie de la console EWS indique qu'elle contient un FileAttachment de Content-Type = "multipart/signed" –

+0

Je ne sais pas, mais après cela http://stackoverflow.com/questions/21629206/ews-retrieving -attachments-from-signed-emails, que je suis sûr que vous avez regardé ... suggère-t-il que vous devez décoder le courrier original qui contient la pièce jointe plutôt que la pièce jointe elle-même. Sozs a trouvé difficile de suivre peut-être que cela a plus de sens pour vous. – Seabizkit