Nota: Esta não é realmente uma pergunta, porque eu já encontrei a resposta, mas como não a encontrei facilmente aqui, postarei para que possa beneficiar outras pessoas.
Pergunta: Como ler um arquivo PEM concatenado como aquele 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 com 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 :
Após a resposta @slugchewer , csplit
pode ser uma opção mais clara com:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
que requerem um certificado para analisar.Respostas:
O snippet 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: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
fonte
Isso foi respondido anteriormente no StackOverflow :
Editar 29/03/2016 : consulte a resposta @slugchewer
fonte
O
split
comando está disponível na maioria dos sistemas e é provável que seja mais fácil lembrar sua chamada.Se você possui um arquivo
collection.pem
que deseja dividir emindividual-*
arquivos, use:Se você não tiver
split
, tentecsplit
:fonte
-p
opção (nem as páginas de manual que li ) na divisão. Talvez você esteja usando um binário / pacote especialcsplit
em vez disso ... (ver edição anterior)csplit
!csplit: *}: bad repetition count
(mas dividida parece funcionar)Se você deseja obter um único certificado de um pacote PEM com vários certificados, tente:
openssl
comandos processam um arquivo PEM e devolvem-no com linhas"subject:"
e pré-pendentes"issuer:"
antes de cada certificado. Se o seu PEM já estiver formatado dessa maneira, tudo o que você precisa é oawk
comando final .source1 , source2
fonte
Também é importante notar que os arquivos PEM são apenas uma coleção de chaves / certificados dentro de
BEGIN
/END
blocks, por isso é muito fácil recortar / colar se for apenas um único arquivo com uma ou duas entidades interessantes ...fonte
Se você estiver manipulando certificados de cadeia completa (ou seja, os gerados pelo letsencrypt / certbot etc.), que são uma concatenação do certificado e da cadeia de autoridade de certificação, você pode usar a manipulação de string bash.
Por exemplo:
Para extrair o certificado e a cadeia de autoridade de certificação em variáveis:
Explicação:
Em vez de usar o awk ou o openssl (que são ferramentas poderosas, mas nem sempre disponíveis, ou seja, nas imagens do Docker Alpine), você pode usar a manipulação do bash string.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: do final do conteúdo de FULLCHAIN, retorne a correspondência de substring mais longa e concorde à-----END CERTIFICATE-----
medida que for removida. As*
partidas todos os personagens depois-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: desde o início do conteúdo de FULLCHAIN, retorne a menor correspondência de substring e retire novas linhas. Da mesma forma,*
corresponde a todos os caracteres anteriores-----END CERTIFICATE-----
.Para uma referência rápida (enquanto você pode encontrar mais sobre manipulação de string no bash aqui ):
${VAR#substring}
= a substring mais curta desde o início do conteúdo do VAR${VAR%substring}
= a substring mais curta do final do conteúdo do VAR${VAR##substring}
= a substring mais longa desde o início do conteúdo do VAR${VAR%%substring}
= a substring mais longa do final do conteúdo do VARfonte
Hmmm ... quase da mesma maneira que eu preparei a solução (como sugerido no @Cerber) sem perceber que essa situação parece que muitas pessoas têm. Minha solução segue quase a mesma lógica, mas usa alguns comandos mais básicos:
Todos os meus certificados estão em arquivo:
certin.pem
Isso basicamente continua gravando em um arquivo até encontrar "END" e depois começa a gravar em outro arquivo de maneira incrementada. Dessa forma, você terá o número "N" de arquivos de saída ( certout0.pem, certout1.pem e assim por diante ..) dependendo de quantos certificados existem no seu arquivo pem de entrada ( certin.pem ).
fonte