Como dividir um arquivo PEM

29

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-----/' '{*}'
    
por Cerber 22.05.2012 / 13:30

5 respostas

13

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

    
por 22.05.2012 / 13:30
17

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
    
por 20.03.2015 / 13:26
11

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-----/' '{*}'
    
por 24.03.2016 / 19:03
2

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/'
  • Os dois primeiros comandos 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.
  • O comando awk irá mostrar o PEM individual correspondente à string CN (nome comum).

source1 , source2

    
por 10.05.2016 / 22:48
1

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 ...

    
por 03.05.2013 / 02:46