Obtenez de l'horodatage de signature Authenticode de fichiers .NET
Nous avons besoin pour vérifier que les fichiers binaires sont signés correctement avec signature numérique (Authenticode). Ceci peut être réalisé avec signtool.exe assez facilement. Cependant, nous avons besoin d'un moyen automatique qui vérifie également signataire nom et l'horodatage. C'est faisable en C++ natif avec CryptQueryObject()
API comme indiqué dans ce merveilleux exemple: Comment Obtenir des Informations de signature Authenticode Exécutables
Cependant, nous vivons dans un monde géré 🙂 d'où la recherche de solution C# pour le même problème. Droites approche serait de pInvoke Crypt32.dll et tout est fait. Mais il y a une telle API managée dans System.Security.Cryptography.X509Certificates
espace de Noms. X509Certificate2
Classe semble fournir certaines informations, mais pas de timestamp. Maintenant, nous sommes arrivés à la question de départ comment pouvons-nous obtenir que l'horodatage de la signature numérique en C Sharp?
- La gestion de authenticode classes de laisser beaucoup de choses! Il est probablement plus facile de p/Invoke.
- La première raison est que le code managé est plus photogénique. D'autre part, dans plusieurs articles MSDN il y a d'effrayant billets comme celui-ci Remarque La fonction WinVerifyTrust est disponible pour une utilisation dans les systèmes d'exploitation répertoriés dans la section des Exigences. Il peut être modifié ou non disponibles dans les versions ultérieures. Lorsque Windows Vista est le dernier système pris en charge. Bien sûr WinVerifyTrust et CryptQueryObject travailler sur Windows 7, mais avec toutes ces mises en garde, il semble logique d'utiliser une autre API. Il semble que les Certificats d'espace de noms est à moitié cuit, en effet. Drôle, mais cet avertissement n'est pas présent dans MSDN en ligne maintenant...
- un .NET de Base de la solution à ce problème serait un joli bonus trop.
Vous devez vous connecter pour publier un commentaire.
Merci les gars,
Vous m'aider beaucoup 🙂
BTW: j'ai trouvé plus simple de la manière d'obtenir l'horodatage.
ici, il est:
Grâce à l'OP pour votre travail. J'ai ajouté de la mise en œuvre pour obtenir le TimeStamp réelle de la cert.
Je voulais faire l'objet hors du certificat numérique, le son d'un OU de type chaîne de caractères comme
J'ai trouvé le X509Certificate pour être vraiment lent et charger tout le fichier en mémoire. J'ai essayé de lire un 800 mo fichier de patch et ma mémoire augmenté de 800 mo comme il le lire, et il a fallu plus de 30 secondes!!
J'ai se tenait sur les épaules des affiches ci-dessus un réussi à bidouiller le code ci-dessus pour obtenir un objet X509Certificate2 des centaines de fois plus rapide que l'utilisation de la X509 Objet.
Merci de lire mon blog pour plus de détails, avec des images de la performance des différences. X509Certificate objet c# de la performance et des problèmes de mémoire alternative – fixe
Essayez ceci:
Il semble que si vous utilisez le "WinCrypt.CERT_QUERY_CONTENT_FLAG_ALL" sur le CryptQueryObject appel, il souffre de la même mémoire de performances comme le X509Certificate objet, mais si vous avez de la garniture à l'PKCS7 types de contenu, il se comporte comme un rêve et semble me donner les infos dont j'ai besoin.
Comme je vois que vous avez pas de réponses de toute façon, permettez-moi de vous offrir l'une.
Si vous n'avez pas l'esprit à l'aide de composants tiers, jetez un oeil à TElAuthenticodeVerifier composante de notre SecureBlackbox produit. Avec ce composant, vous pouvez vérifier la signature et vérifier les horodateurs.
J'aime l'idée d'éviter certains méchants p/invoke code à l'aide de la SignedCms classe, mais sachez qu'en vertu de certaines conditions, le SignedCms constructeur peut bloquer pendant une longue période --- je vois environ 15 secondes sur un test, je suis actuellement en cours d'exécution. Alejandro Campos Magencio a des informations sur ce sujet sur son blog MSDN dans un post intitulé Gros retard tout en appelant EnvelopedCms constructeur.