web-dev-qa-db-fra.com

Signe PKCS # 7 et vérifiez PKCS # 7 Signature avec openssl

Si une personne doit transférer des certificats X.509 dans un seul paquet, il est généralement recommandé de les emballer dans les PKC n ° 7. Et le contenu de PKCS n ° 7 peut être signé.

OpenSSL permet d'emballer des certificats dans PKCS n ° 7 de la manière suivante:

openSSL CRL2PKCS7 -NOCRL -CERTFILE DOMAINE.CRT -CERTFILE CA-Chain.Crt -out Domain.P7B

Si que je comprends de la page man de 'openssl crl2pkcs7', ce PKCS n ° 7 est signé:

Le fichier de sortie est une structure de données signée de PKCS # 7 contenant aucun signataire et justecertificats et un CRL optionnel.

Quelques questions ici:

  1. Que signifie "ne contenant aucun signataire"?
  2. Si le contenu (certificats) de PKCS n ° 7 n'est pas vraiment signé, comment peut-il être fait avec OpenSSL?
  3. Comment la signature de PKCS n ° 7 peut être vérifiée à l'aide de OpenSSL en considérant qu'il a été signé?

Si je comprends bien le concept global à tort, veuillez clarifier cela.

4
tysonite

TLDR: Ce n'est pas réellement signé. Vous comprenez à tort. Expliquer, je vais commencer dès le début.

PKCS n ° 7 et sa syntaxe de messagerie cryptographique [1] modifiée légèrement modifiée et améliorée [1] http://tools.ietf.org/html/rfc3852 et Pred et Amici, est une norme qui définit un Série entière de messages différents mais similaires pour diverses fonctions cryptographiques. n type de PKCS n ° 7/CMS Le message est appelé SignéData et son objectif initial, comme vous pourriez raisonnablement supposer, est de transmettre des données avec une signature numérique, ou pour une généralité ou plus Signatures, par exemple un contrat signé par les deux parties. PKCS # 7 (principalement) utilise la cryptographie et les besoins de la clé publique/s'attend à ce qu'un moyen de correspondre correctement à des valeurs clés publiques aux entités telles que les personnes et les organisations et les systèmes, appelé une intrastructure clé publique PKI; En pratique, le PKI que nous utilisons est Certificats X.509 émis par Autorités de certificat CAS qui peuvent révoquer des certificats incorrects à l'aide Listes de révocation de certificat CRLS (et aujourd'hui Aussi en utilisant OCSP, mais cela est arrivé après PKC # 7).

Un SignedData se compose en fait de trois parties principales: les données réelles dans une structure nommée contentInfo; un nombre variable de SignerInfo Structures contenant chacune une signature et des métadonnées comprenant une identification du certificat contenant la clé publique nécessaire pour vérifier la signature; et un nombre de variable (peut-être aucun) de Certificats et/ou CRLS que le destinataire peut avoir besoin de déterminer et de vérifier les touches publiques (signature) ou à un but. Pour leur généralité, le nombre de signatures, et donc des signatures peut être nul, auquel cas les données sont inutiles et sont omises.

Ainsi, un SignedData avec aucune donnée ni des signes " (Structures zéro SignerInfo), Seuls les certificats et/ou/ou la CRLS, à condition qu'un format standardisé contienne plusieurs certificats connexes et/ou CRLS, à une date précoce lorsqu'il n'y avait aucune autre méthode normalisée à cela. En conséquence, il a été largement adopté et devenu omniprésent. Ce format est généralement identifié par les extensions "P7B" et "P7C". Voir Quelle est la différence entre le certificat X.509 et PKCS # 7? .

Ainsi, sur vos questions: Ce format est une structure PKCS n ° 7 ou CMS du type nommé SignDdata, mais elle ne contient pas de données ou de signature (s) sur ces données contenant uniquement des certificats et/ou crds. Parce que cela n'est pas signé, il ne peut pas être vérifié.

Chaque certificat ou CRL en soi est Signé, en utilisant une signature spécifique au format CERT/CRL et non une signature de données générale. Ceci est indépendant de savoir s'il est dans un P7B ou séparé. Chaque certificat (non root) ou CRL après avoir été vérifié peut être vérifié, si vous avez une chaîne de certificats valide de certs "ci-dessus", et si vous l'utilisez pour quoi que ce soit. Cependant, toutes les signatures PKI ne se propagent que la confiance d'un ensemble (généralement petit) de "racines" de confiance ou "d'ancrages" (telles que Verisign, Godaddy, etc. mais espérons-le, pas diginotar) à un grand ensemble d'autres entités (HTTPS ou d'autres SSL/Les serveurs TLS sur le réseau, les expéditeurs de courrier électronique au monde, les développeurs de programmes au monde, etc.). En fin de compte, vous décidez de quelles ancrages de confiance ou de déléguer cette décision à quelqu'un (comme Microsoft pour Windows, Oracle pour Java, Mozilla pour Firefox, etc.).

Dans OpenSSL, toutes les opérations (AFAICS) qui utilisent des certificats et (éventuellement), vérifiez-les, contre un CRTS de CA (racine) certifiés que vous pouvez choisir ou par défaut. Vous pouvez également utiliser manuellement (re) vérifier un certificat avec la ligne de commande verify utilitaire; Voir https://www.openssl.org/docs/apps/verify.html . D'autres outils et programmes feront quelque chose d'équivalent, mais les détails varient.

[1] Pour la comparaison, la couche de prises SSL SSL SSL Netscape SSL a été remise à IETF où elle a été légèrement modifiée et améliorée et renommée TLS Transport Layer Security. Bien qu'il existe des différences techniques qui comptent parfois (comme la récente vulnérabilité au caniche qui affecte SSL, mais sont fixées dans TLS, du moins dans des implémentations correctes), pour la plupart des pièces SSL et TLS sont fonctionnellement les mêmes et que les personnes disent souvent que SSL signifie que SSL signifie que SSL signifier les deux. De même, PKCS n ° 7 et CMS sont si similaires de nombreuses personnes utilisent soit le nom des deux.

Mettre à jour 2/06 par commentaire: Si vous envoyez un valide Chaîne à un destinataire valide correctement le certificat le plus bas (feuille) Utilisation = cette chaîne, qui prouvera si la chaîne est valide comme reçu.

  • Si un attaquant ou une faute modifie ou supprime tout certificat (nécessaire) ou remplace une avec un certificat invalide ou incorrect, la chaîne reçue ne validera pas.
  • Si un certificat de garantie (valide ou non) est ajouté, il ne sera pas détecté, mais ne nuira pas à la sécurité au destinataire non plus.
  • Si vous avez envoyé un certificat inutile (ou plusieurs) et que le (s) cert (S) est modifié, supprimé ou remplacé, il ne sera pas détecté et ne nuira pas.
  • Si vous avez omis a nécessaire Cert et c'est ajouté (en particulier un certificat d'autorité de certification intermédiaire est susceptible d'être largement connu et disponible), le destinataire ne détecte pas Le changement, mais la sécurité sera aidé.
  • S'il y a multiple chaînes valides - comme c'est souvent le cas avec le CAS public, en particulier maintenant, lorsque beaucoup ont récemment mis à niveau vers un ou plusieurs de RSA-2K ECC SHA2 - si vous envoyez One chaîne et il est modifié à une autre Chaîne qui est également valide, le destinataire ne détecte pas le changement. C'est le seul cas que je peux voir où le destinataire peut être blessé: s'il y a plusieurs chaînes valides mais pas aussi "bonnes" sur certaines métriques, telles que la durabilité à long terme, le destinataire peut être trompé en utilisant un pire un.

PKCS n ° 7/CMS peut être imbriqué. Ceci est couramment utilisé à la fois aux signer et à chiffrer (AKA ENVELOPE), mais d'autres combinaisons sont possibles. Si vous vous souciez vraiment du destinataire, obtenez la chaîne exacte (ou un autre ensemble) que vous envoyez, non seulement une chaîne valide, vous pouvez mettre le P7B comme contenu d'un second message SignéData externe. Dans ce cas, vous avez un autre choix: principalement pour des raisons historiques Les PKCS n ° 7/CMS peuvent générer une signature "détachée", où l'objet SignDData ne contient pas réellement les données, uniquement le ou les métadonnées et certaines métadonnées comme l'algorithme de hachage ( s); Dans ce cas, vous devez envoyer à la fois des morceaux de données de manière à ce que le destinataire puisse les connecter de manière fiable, par ex. Message12345.dat et Message12345.SIG. Alternativement, il peut "incorporer" les données de la fente de contenu du message SignéData; Ceci est probablement plus simple pour votre cas. OpenSSL CommandLine peut faire cela juste en effectuant deux étapes, et beaucoup de logiciels de messagerie peuvent gérer la partie SignDdata ou au moins ses variantes S/MIME (dont OpenSSL peut également faire), et la partie P7B restante peut être gérée par la plupart des clients./logiciel de sécurité.

RFC 451 (et 2510) a lots des capacités et des options que je n'ai pas creusées, et je crois facilement qu'il y a quelque chose dans là qui fait ce que vous Vous voulez, mais je n'ai jamais vu de mise en œuvre. Vous pourriez bien avoir à écrire - et à soutenir - le logiciel à la fois (ou tout?) Se termine vous-même.

7
dave_thompson_085