Note: 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 à d'autres.
Question: Comment lire un fichier PEM concaténé comme celui utilisé par la directive apache / mod_ssl SSLCACertificateFile ?
Réponse (originale) ( 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 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 :
Après la réponse de @slugchewer , cela csplit
pourrait être une option plus claire avec:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
qui prennent un certificat à analyser.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
la source
Cela a déjà été répondu sur StackOverflow :
29/03/2016 : Voir la réponse de @slugchewer
la source
La
split
commande est disponible sur la plupart des systèmes et son invocation est probablement plus facile à mémoriser.Si vous
collection.pem
voulez diviser un fichier enindividual-*
fichier, utilisez:Si vous n'en avez pas
split
, vous pouvez essayercsplit
:la source
-p
option (ni les pages de manuel que j'ai lues ) sur split. Peut-être utilisez-vous un paquet / paquet spécialcsplit
place ... (voir modification ci-dessus)csplit
!csplit: *}: bad repetition count
(mais la scission semble fonctionner)Si vous souhaitez extraire un seul certificat d'un ensemble PEM à plusieurs certificats, essayez:
openssl
commandes traiteront un fichier PEM et le cracheront en ajoutant des lignes avant"subject:"
et"issuer:"
après chaque certificat. Si votre PEM est déjà formaté de cette façon, tout ce dont vous avez besoin est laawk
commande finale .source1 , source2
la source
Il convient également de noter que les fichiers PEM sont simplement une collection de clés / certificats à l'intérieur de
BEGIN
/END
blocs, il est donc assez facile de simplement couper / coller s'il ne s'agit que d'un seul fichier avec une ou deux entités intéressantes ...la source
Si vous gérez des certificats de chaîne complète (c'est-à-dire ceux générés par letsencrypt / certbot, etc.), qui sont une concaténation du certificat et de la chaîne d'autorité de certification, vous pouvez utiliser la manipulation de chaîne bash.
Par exemple:
Pour extraire le certificat et la chaîne d'autorités de certification en variables:
Explication:
Au lieu d'utiliser awk ou openssl (outils puissants mais pas toujours disponibles, par exemple dans les images Docker Alpine), vous pouvez utiliser la manipulation de chaîne bash.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: à partir de la fin du contenu de FULLCHAIN, retourne la correspondance de sous-chaîne la plus longue, puis concatte à-----END CERTIFICATE-----
mesure qu'elle est supprimée. Le*
correspond à tous les caractères après-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: depuis le début du contenu de FULLCHAIN, renvoie la correspondance de sous-chaîne la plus courte, puis supprime les nouvelles lignes principales. De même, le*
correspond à tous les caractères avant-----END CERTIFICATE-----
.Pour une référence rapide (pour en savoir plus sur la manipulation de chaîne dans bash, cliquez ici ):
${VAR#substring}
= la sous-chaîne la plus courte depuis le début du contenu de VAR${VAR%substring}
= la sous-chaîne la plus courte de la fin du contenu de VAR${VAR##substring}
= la plus longue sous-chaîne depuis le début du contenu de VAR${VAR%%substring}
= la plus longue sous-chaîne à partir de la fin du contenu de VARla source
Hmmm ... presque de la même manière, j'ai préparé la solution (comme suggéré y @Cerber) sans me rendre compte que cette situation semble être répandue. Ma solution suit à peu près la même logique mais utilise quelques commandes plus basiques:
Mes tous les certs sont dans le fichier:
certin.pem
En gros, cela continue à écrire dans un fichier jusqu’à rencontrer "END", puis commence à écrire dans un autre fichier de manière incrémentée. De cette manière, vous aurez "N" nombre de fichiers de sortie ( certout0.pem, certout1.pem , etc.) en fonction du nombre de certificats présents dans votre fichier PEM d’entrée ( certin.pem ).
la source