Question Comment diviser un fichier PEM


Remarque : Ce n'est pas vraiment une question parce que j'ai déjà trouvé la réponse, mais comme je ne l'ai pas trouvée facilement ici, je la posterai afin que cela profite aux autres.

Question: Comment lire un fichier PEM concaténé comme celui utilisé par la directive apache / mod_ssl SSLCACertificateFile  ?

Réponse (original) (la source):

cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'

Cela peut laisser un fichier vide s'il y a une ligne vide à la fin, comme avec openssl pkcs7 -outform PEM -in my-chain-file -print_certs. Pour éviter cela, vérifiez la longueur de la ligne avant impression:

cat $file|awk 'split_after==1{n++;split_after=0}
   /-----END CERTIFICATE-----/ {split_after=1}
   {if(length($0) > 0) print > "cert" n ".pem"}' 

Réponse 29/03/2016 :

Suivre @slugchewer réponse, csplit pourrait être une option plus claire avec:

csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'

29
2018-05-22 11:30


origine


C'est peut-être une question idiote, mais pourquoi aurais-je besoin de scinder mon fichier PEM? - Ashwani Agarwal
@AshwaniAgarwal Vous souhaitez fractionner un fichier PEM contenant plusieurs certificats et examiner individuellement les certificats à l'aide d'outils tels que openssl qui prennent un certificat à analyser. - Law29
De plus, certains outils ou serveurs veulent un fichier combiné avec cert et clé, alors que d'autres veulent les séparer. - captncraig
J'ai dû ajouter '% ----- BEGIN CERTIFICATE -----%' à la ligne de commande csplit pour empêcher un fichier vide. Semble correspondre à ce que la page de manuel spécifie: csplit -f ./tmp/cert- $ file '% ----- BEGIN CERTIFICATE -----%' '/ ----- BEGIN CERTIFICATE ----- / '' {*} ' - Craig Hicks
utilisez "csplit -z" pour ne pas laisser de fichiers vides. - Paul M


Réponses:


L'extrait de code awk fonctionne pour extraire les différentes parties, mais vous devez toujours savoir quelle section est la clé / cert / chaîne. J'avais besoin d'extraire une section spécifique et je l'ai trouvée dans la liste de diffusion OpenSSL: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html

# Extract key
openssl pkey -in foo.pem -out foo-key.pem

# Extract all the certs
openssl crl2pkcs7 -nocrl -certfile foo.pem |
  openssl pkcs7 -print_certs -out foo-certs.pem

# Extract the textually first cert as DER
openssl x509 -in foo.pem -outform DER -out first-cert.der

17
2018-03-20 12:26



nice command set :) Je le garderai pour une utilisation future, mais dans mon cas d'utilisation ci-dessus, je travaille avec un fichier contenant uniquement des certificats contenant plus de 50 certificats de certification = => pas de clé ni de chaîne - Cerber
Je pense que c'est supérieur à la solution awk, laissez l'OpenSL faire l'analyse + vous obtenez la conversion. - Rusty
Je suis désolé mais seule la commande pkey est correcte. Les deuxième et troisième ne font pas ce que vous annoncez - ils font autre chose. Dans certains cas, le résultat est bon. Dans certains cas, il peut générer des comportements mystérieux chez les consommateurs. Édité un peu. - kubanczyk


C'était précédemment répondu sur StackOverflow :

awk '
  split_after == 1 {n++;split_after=0}
  /-----END CERTIFICATE-----/ {split_after=1}
  {print > "cert" n ".pem"}' < $file

Modifier le 29/03/2016 : Voir @ slugchewer réponse


13
2018-05-22 11:30



Fonctionne sous Linux uniquement, échoue sous FreeBSD. - Michael-O
Inspiré par cela, j'ai créé un script awk qui sépare les certificats et les clés en fichiers séparés: gist.github.com/jinnko/d6867ce326e8b6e88975 - JinnKo


le split Cette commande est disponible sur la plupart des systèmes et son invocation est probablement plus facile à mémoriser.

Si vous avez un fichier collection.pem que vous voulez diviser en individual-* fichiers, utiliser:

split -p "-----BEGIN CERTIFICATE-----" collection.pem individual-

Si vous n'avez pas split, tu pourrais essayer csplit:

csplit -f individual- collection.pem '/-----BEGIN CERTIFICATE-----/' '{*}'

11
2018-03-24 18:03



Désolé, aucun de mes systèmes (busybox, fedora, centos) n’affiche -p option (ni les pages de manuel que j'ai lues) sur split. Peut-être que vous utilisez un binaire / package spécial - Cerber
@Cerber pourrait essayer csplit à la place ... (voir éditer ci-dessus) - squidpickles
fonctionne bien avec csplit ! - Cerber
Sur FreeBSD, je reçois de csplit: csplit: *}: bad repetition count (mais split semble fonctionner) - Gwyneth Llewelyn


Si vous souhaitez extraire un seul certificat d'un ensemble PEM à plusieurs certificats, essayez:

$ openssl crl2pkcs7 -nocrl -certfile INPUT.PEM | \
    openssl pkcs7 -print_certs | \
    awk '/subject.*CN=host.domain.com/,/END CERTIFICATE/'
  • Les deux premiers openssl les commandes traiteront un fichier PEM et le cracheront de nouveau avec du préfixe "subject:" et "issuer:" lignes avant chaque cert. Si votre PEM est déjà formaté de cette façon, tout ce dont vous avez besoin est la version finale. awk commander.
  • La commande awk crache le PEM individuel correspondant à la chaîne CN (nom commun).

source1 , source2


2
2018-05-10 20:48



Je ne vois pas cela dans votre source. A côté, les PEM sont encodés en Base64, vous ne trouverez pas de texte comme "sujet", "CN", ... avec awk - Cerber
Oui, cela ne fonctionne pas pour tous les types de PEM. Si vous extrayez un fichier P7B vers PEM à l'aide de openssl, une ligne d'objet apparaît avant chaque certificat. Ou vous pouvez modifier n'importe quelle chaîne avec laquelle vous segmentez votre fichier PEM. - cmcginty
Réponse mise à jour à traiter lorsque PEM ne contient pas "sujet" - cmcginty


A noter également que Fichiers PEM ne sont qu'une collection de clés / certificats à l'intérieur BEGIN/END Il est donc assez facile de couper / coller s'il ne s'agit que d'un fichier contenant une ou deux entités intéressantes ...


1
2018-05-03 00:46