2017-10-05 5 views
0

Ce lien (Document) contient un fichier PDF signé numériquement qui a été correctement vérifié par IText (version 5.5.12) mais pas par Adobe Reader DC qui émet le message suivant:PDF signé numériquement correctement vérifié par ItextSharp 5.5.12 mais pas par Adobe Reader DC

Erreur lors de la vérification de la signature.

Valeurs de plage d'octets inattendues définissant la portée des données signées. Détails: La plage d'octets de signature est invalide

Qui est-ce correct? Adobe DC ou IText? IText Bug?

Exemple de code iTextSharp utilisé pour la vérification des signes PDF numérique:

using System; 
using System.Collections.Generic; 
using iTextSharp.text.pdf; 
using iTextSharp.text.pdf.security; 

namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public Boolean PDFVerify(String file) 
     { 
      PdfReader pdfr = new PdfReader(file); 

      AcroFields af = pdfr.AcroFields; 
      List<String> names = af.GetSignatureNames(); 

      foreach (String name in names) 
      { 
       PdfPKCS7 pk = af.VerifySignature(name); 
       if (!pk.Verify()) return false; 
      } 
      return true; 
     } 

    } 
} 

Répondre

0

Le problème est que le PDF lui-même est cassé.


Le PDF a deux révisions,

  • une première révision apparemment créée en utilisant "Marvell Semiconductor, Inc. - http://www.marvell.com" (selon l'entrée du dictionnaire Producer info)
  • une mise à jour incrémentielle vers une deuxième révision contenant la signature apparemment créée à l'aide de iTextSharp 5.4.3.

La première révision est rompu à bien des égards, deux erreurs évidentes sont:

  • tête non valide; selon ISO 32000-1 la première ligne d'un fichier PDF doit être un en-tête composé de 5 caractères% PDF- suivi d'un numéro de version de la forme 1.N, où N est un chiffre entre 0 et 7. Ici la ligne d'en-tête est

    %PDF-1.4 Marvell Semiconductor 
    

    la règle cité ci-dessus ne permet pas plus de %PDF-1.N.

  • Entrées de table de références croisées incorrectes; conformément à la norme ISO 32000-1 , chaque entrée doit avoir une longueur de 20 octets exactement, y compris le marqueur de fin de ligne. Ici, chaque entrée ne mesure que 19 octets, y compris le marqueur de fin de ligne.

Il pourrait y avoir des problèmes moins évidents.

Il n'y a pas d'erreurs évidentes dans la mise à jour incrémentielle de la deuxième révision.


Lorsque Adobe Reader ouvre ce fichier, il reconnaît qu'il est cassé, crée une version réparée en interne, et utilise maintenant de cette version réparée. Lorsque la signature est vérifiée, elle est vérifiée dans cette version réparée. De telles réparations, cependant, vont évidemment changer le hachage du PDF et très probablement déplacer la position de la signature. La plage d'octets de signature devrait être le fichier entier, y compris le dictionnaire de signature mais excluant la valeur de signature elle-même. Si la réparation a déplacé la signature intégrée, cette exigence n'est plus remplie, ce qui entraîne le message d'erreur observé. Lorsque iText ouvre ce fichier, il reconnaît probablement les erreurs mais il crée simplement sa table de références croisées interne et, à toutes fins utiles, à part les références croisées, il fonctionne toujours avec le fichier d'origine. Ainsi, le hachage est correct et tout se trouve à l'endroit où il se trouve, ce qui entraîne un succès de la vérification.

+0

Merci pour la réponse rapide! Comment puis-je détecter la corruption de PDF première révision avec IText? C'est possible? Je veux reproduire le message semblable d'Adobe DC à l'utilisateur ... –

+0

@MarcosMonteiro Si vous voulez vérifier pour ce type spécifique de dossier, vérifiez simplement si le fichier commence par '% PDF-1.4 Marvell Semiconductor'. Une solution générale est cependant difficile, car vous devez vous plaindre dans les mêmes situations qu'Adobe Reader. Malheureusement, il existe de nombreuses façons de créer un fichier PDF en ne suivant pas les spécifications qu'Adobe Reader ignore, et AFAIK il n'y a pas de liste complète de cela. Ainsi, imiter le comportement d'Adobe est difficile. – mkl

+0

Cette réponse a terminé la question. Merci encore. –