66 votes

Comment diviser un fichier PEM

Note : Ce n'est pas vraiment une question car j'ai déjà trouvé la réponse mais comme je ne l'ai pas trouvée facilement ici, je vais la poster pour qu'elle puisse profiter à d'autres.

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

Réponse (originale) ( fuente ) :

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 vierge à la fin, comme dans le cas suivant openssl pkcs7 -outform PEM -in my-chain-file -print_certs . Pour éviter cela, vérifiez la longueur de la ligne avant d'imprimer :

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 responder , csplit pourrait être une option plus claire avec :

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

3voto

mgalgs Points 345

Il convient également de noter que Fichiers PEM sont simplement une collection de clés/certificats à l'intérieur de BEGIN / END il est donc assez facile de faire un copier/coller s'il s'agit d'un seul fichier avec une ou deux entités intéressantes...

0voto

Hmmm...c'est presque de la même façon que j'ai préparé la solution ( comme suggéré par @Cerber ) sans réaliser que cette situation semble être celle de beaucoup de gens. Ma solution suit presque la même logique mais utilise quelques commandes plus basiques :

Tous mes certificats sont dans le dossier : certin.pem

c=0
while read line
  do
    if echo $line | grep END; then
    echo $line >> certout$c.pem
    c=`expr $c + 1`
    else
     echo $line
     echo $line >> certout$c.pem
    fi
done < /tmp/certin.pem

Cela permet de continuer à écrire dans un fichier jusqu'à ce que l'on rencontre "END", puis de commencer à écrire dans un autre fichier de manière incrémentale. De cette manière, vous obtiendrez "N" fichiers de sortie ( certout0.pem, certout1.pem et ainsi de suite ) en fonction du nombre de certificats présents dans votre fichier pem d'entrée ( certin.pem ).

0voto

Conway Points 1

Vous pouvez utiliser awk comme suit :

awk '/-----BEGIN CERTIFICATE-----/ {f=1} /-----END CERTIFICATE-----/ {print; f=0} f' cert_and_key.pem

awk '/-----BEGIN PRIVATE KEY-----/ {f=1} /-----END PRIVATE KEY-----/ {print; f=0} f' cert_and_key.pem

La commande awk '/hello/ {f=1} /world/ {print; f=0} f' some_file imprimera toutes les lignes dans some_file qu'entre les lignes hello y world , inclus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X