Isso foi respondido anteriormente no StackOverflow :
awk '
split_after == 1 {n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{print > "cert" n ".pem"}' < $file
Editar 29/03/2016 : consulte @slugchewer resposta
Nota: Esta não é uma questão porque já encontrei a resposta, mas como não a encontrei facilmente aqui, vou publicá-la para que possa beneficiar outras pessoas.
Pergunta: Como ler um arquivo PEM concatenado como o usado pela diretiva apache / mod_ssl SSLCACertificateFile ?
Resposta (original) ( fonte ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Isso pode deixar um arquivo vazio se houver uma linha em branco no final, como openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Para evitar isso, verifique o comprimento da linha antes de imprimir:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Resposta 29/03/2016 :
Seguindo a resposta do @slugchewer, csplit
pode ser uma opção mais clara com:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
Isso foi respondido anteriormente no StackOverflow :
awk '
split_after == 1 {n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{print > "cert" n ".pem"}' < $file
Editar 29/03/2016 : consulte @slugchewer resposta
O fragmento de awk funciona para extrair as diferentes partes, mas você ainda precisa saber qual seção é a chave / cert / chain. Eu precisava extrair uma seção específica e encontrei isso na lista de discussão do OpenSSL: link
# 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
O comando split
está disponível na maioria dos sistemas, e sua invocação é mais fácil de lembrar.
Se você tiver um arquivo collection.pem
que deseja dividir em individual-*
arquivos, use:
split -p "-----BEGIN CERTIFICATE-----" collection.pem individual-
Se você não tiver split
, tente csplit
:
csplit -f individual- collection.pem '/-----BEGIN CERTIFICATE-----/' '{*}'
Se você deseja obter um único certificado de um pacote PEM com vários certificados, tente:
$ openssl crl2pkcs7 -nocrl -certfile INPUT.PEM | \
openssl pkcs7 -print_certs | \
awk '/subject.*CN=host.domain.com/,/END CERTIFICATE/'
openssl
processarão um arquivo PEM e o retornarão com as linhas "subject:"
e "issuer:"
pré-pagas antes de cada cert. Se o seu PEM já estiver formatado dessa forma, tudo o que você precisa é o comando awk
final. Também vale a pena notar que arquivos PEM são apenas uma coleção de chaves / certificados dentro de BEGIN
/ END
blocks, então é bem fácil simplesmente cortar / colar se é apenas um único arquivo com uma ou duas entidades interessantes ...