web-dev-qa-db-fra.com

Quelle est la différence entre X.509 et le certificat PKCS # 7?

  1. Suis-je un fichier d'appel correct avec l'extension de fichier .p7b enregistrée en tant que "Cryptographic Message Syntax Standard - PKCS # 7 Certificates (.P7B)" sous Windows - un "certificat PKCS # 7"? Ou est-il préférable de l'appeler "certificat X.509 enregistré au format PKCS # 7"?

  2. Quand choisirait-on un format de certificat plutôt qu'un autre? Ces formats ont-ils des forces ou des faiblesses particulières?

  3. Ajout de cette question après mes deux premières modifications. En quoi le format PKCS # 7 est-il différent des formats de fichiers DER/PEM?

Merci


Edit # 1: Firefox sous Linux me permet d'exporter un certificat de site Web comme:

  • Certificat X.509 (PEM)
  • Certificat X.509 (DER)
  • Certificat X.509 (PKCS # 7)

Cela signifie-t-il que PKCS # 7 n'est ici qu'un format de fichier binaire similaire à DER mais distinct de celui-ci? Si vrai, le fichier .p7b n'est qu'un certificat X.509 enregistré au format PKCS # 7 (par opposition aux formats PEM ou DER).


Édition n ° 2: suivi de ma première édition. Cette page OpenSSL: Documents, pkcs7 suggère que PKCS # 7 peut être chiffré en DER ou PEM. J'en déduis que PKCS # 7 n'est pas un format de fichier binaire distinct. Maintenant, je suis totalement confus.


Edit # 3: Ok, j'ai compris la relation entre les formats PEM et DER. La charge utile encodée en Base64 du fichier PEM est en fait des données au format DER. Donc, initialement, le certificat X.509 est codé au format DER, puis vous pouvez éventuellement coder le "certificat codé DER" résultant en "certificat codé PEM". J'ai toujours des difficultés à installer PKCS # 7 dans le puzzle.


Edit # 4: Un autre élément d'information. PKCS # 7 semble être un conteneur qui permet de regrouper plusieurs certificats X.509 avant de les encoder au format DER (qui est différent du format PEM où vous pouvez regrouper des certificats dans le même fichier en les collant simplement l'un après l'autre) .

56
golem

Vous avez évolué à peu près à droite, mais pour ajouter plusieurs points et développer @CoverosGene ' réponse plus que je ne me sentais à l'aise dans une édition:

X.509 définit un certificat (et d'autres choses non pertinentes ici) dans ASN.1, une (très!) Méthode générale de structuration des données qui a plusieurs codages définis, dont [~ # ~] der [~ # ~] La représentation de codage distinguée est assez courante et est utilisée ici.

Format [~ # ~] pem [~ # ~] - pour plusieurs types de données dont un certificat n'est qu'un - c'est autant que vous dites simplement des données binaires (DER) encodées en base64 (modifier) ​​ divisées en lignes normalement tous les 64 caractères (mais il y a des variations), plus les lignes d'en-tête et de fin composé de tirets + DEBUT ou FIN + le type de données, dans ce cas CERTIFICAT + tirets. Ces lignes semblent redondantes pour un humain, mais elles sont attendues et principalement requises par les logiciels. PEM (Privacy Enhanced Mail) était en fait un standard complet pour les e-mails sécurisés qui a maintenant été presque oublié (voir ci-dessous) sauf pour son format d'encodage. (modifier) ​​ En 2015, il y a RFC 7468 décrivant en détail la plupart utilisation de Formats "PEM" pour les données cryptographiques modernes.

PKCS # 7 a été défini par RSA (l'entreprise, pas l'algorithme) comme un format polyvalent pour les données chiffrées et/ou signées. Il a été remis à l'IETF et a évolué en Syntaxe des messages cryptographiques CMS dans RFC 26 , puis RFC 3369 , puis RFC 3852 , puis RFC 5652 , d'où le libellé de l'invite Windows (inetopt). "PKCS # 7" est souvent utilisé pour signifier à la fois le RSA PKCS # 7 d'origine et le CMS successeur de l'IETF, de la même manière que "SSL" est souvent utilisé à la fois pour le protocole Netscape original et pour le successeur IETF TLS Transport Level Security.

Le format .p7b ou .p7c est un cas particulier de PKCS # 7/CMS: une structure SignedData ne contenant aucun "contenu" et zéro SignerInfos, mais un ou plusieurs certificats (généralement) et/ou CRL (rarement). Il y a longtemps, lorsque cela fournissait un moyen standard de gérer (modifier) ​​ l'ensemble des certificats nécessaires pour constituer une chaîne (pas nécessairement dans l'ordre).

PKCS # 7/CMS est (sont?) Également ASN.1 et, selon les circonstances, peut être DER ou [~ # ~] ber [~ # ~] , un codage étroitement lié avec quelques différences très mineures que la plupart des décodeurs DER gèrent.

Alors que PKCS # 7/CMS comme tout objet DER ou BER peut être au format PEM, Je n'ai vu aucune implémentation autre que openssl  (edit) c'est rare pour les certs. (Java CertificateFactory peut lire PKCS7/CMS-certs uniquement à partir de DER ou PEM, mais CertPath.getEncoded l'écrit uniquement dans DER.) En revanche, les formats DER et PEM pour un seul certificat sont courants.

PKCS # 7/CMS est également utilisé comme base pour S/MIME courrier électronique sécurisé (plusieurs RFC à partir de 5751). Fondamentalement, PEM a codé PKCS # 7 en ASCII que les systèmes de messagerie des années 1980 pouvaient facilement gérer, tandis que S/MIME représente CMS en tant qu'entités MIME qui sont codées en plusieurs = comment les systèmes de messagerie modernes peuvent gérer.

OpenSSL a confondu les choses en implémentant, dans l'ordre: une commande pkcs7 qui gère le cas certs-CRLs-only pas PKCS # 7 complet; une commande crl2pkcs7 qui gère réellement les listes de révocation de certificats et les certificats, mais encore une fois pas le reste de PKCS # 7; une commande smime qui gère en fait à la fois S/MIME et PKCS # 7/CMS pour la plupart des cas de messages chiffrés et/ou signés; et une commande cms qui gère en fait à la fois S/MIME et PKCS # 7/CMS pour un ensemble plus complet de cas.

Je décrirais donc les options comme: un certificat au format PEM ou DER; un (unique) cert dans un conteneur PKCS # 7 ou pour faire court juste p7, et mentionner PEM seulement dans les rares cas où il s'applique; ou une chaîne cert dans PKCS # 7 ou p7. La différence sémantique entre un seul certificat et une chaîne de certificats est au moins aussi importante que la différence de format entre un certificat seul ou dans un conteneur.

Et cela n'atteint même pas la confusion généralisée entre un certificat par lui-même (pour une autre entité, le plus souvent une racine ou une ancre d'autorité de certification) et la combinaison de certificat privatekey PLUS - ou généralement une chaîne - que vous utilisez pour prouver le vôtre identité, par exemple en tant que serveur SSL/TLS ou lors de la signature d'un e-mail S/MIME. That utilise le format d'échange d'informations personnelles PFX à l'origine, ou son format standard PKCS # 12 ou "p12".

60
dave_thompson_085

PKCS # 7 peut être considéré comme un format qui permet de regrouper plusieurs certificats, codés DER ou PEM, et peut inclure des certificats et des listes de révocation de certificats (CRL).

Par RFC2315 , PKCS # 7 est

a general syntax for data that may have
cryptography applied to it, such as digital signatures and digital
envelopes. The syntax admits recursion, so that, for example, one
envelope can be nested inside another, or one party can sign some
previously enveloped digital data.
9
CoverosGene