Como visualizar todos os certificados SSL em um pacote configurável?

102

Eu tenho um arquivo .crt do pacote de certificados.

fazendo openssl x509 -in bundle.crt -text -nooutapenas mostra o certificado raiz.

como vejo todos os outros certificados?

pdeva
fonte

Respostas:

121

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 sugere este recurso:

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

Realmente funcionou para mim, mas não entendo os detalhes, portanto não posso dizer se há alguma ressalva.

Beni Cherniavsky-Paskin
fonte
9
Esta é a melhor resposta - eu nem vou postar minha solução Python over-kill! Deixe de fora o "texto" para obter apenas informações sobre o assunto / emissor de cada certificado.
Chris Lobo
Tentei /etc/ssl/certs/ca-certificates.crte consegui #unable to load PKCS7 object
1833 OrangeDog
1
Não é para o formato pkcs7, enquanto a pergunta é sobre pacotes de formato x509?
Yetanotherjosh
3
Ele usa apenas o pkcs7 como intermediário. A entrada é concatenada PEM.
Beni Cherniavsky-Paskin
Você é super !!!
Jingguo Yao 29/08/18
21

Java keytoolfaz o truque:

keytool -printcert -v -file <certs.crt>

Anotação: o clique duplo do Windows não funciona. O Windows lê apenas o primeiro certificado no keystore e estende automaticamente o trustchain de seu armazenamento de certificados interno.

Resultados:

  1. Tudo além do primeiro certificado no .crtarquivo não é mostrado
  2. Você pode exibir uma cadeia de confiança diferente da exibida no .crtarquivo. Isso pode levar a conclusões erradas.
Jan Wunderlich
fonte
Obrigado por esclarecer a coisa do Windows. Isso foi realmente confuso
demais
21

Após este FAQ levou-me a este script perl , o que sugere fortemente para mim que opensslnão tem suporte nativo para lidar com o n º certificado em um pacote, e que em vez disso, deve usar alguma ferramenta para cortar-e-dice a entrada antes de alimentar cada certificado para openssl. Este script perl, livremente adaptado do script de Nick Burch acima, parece fazer o trabalho:

#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <[email protected]>
# v0.0.2         Tom Yates <[email protected]>
#

$filename = shift;
unless($filename) {
  die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");

$thisfile = "";

while(<INP>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo \'$thisfile\' | openssl x509 -noout -text`;
      $thisfile = "";
   }
}
close INP;
Chapeleiro Louco
fonte
10

Oneliner que exibe um resumo de todos os certificados no arquivo.

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(comando semelhante mencionado em outra resposta, mas isso gera uma saída mais curta, sem a opção --text).

exemplo:

$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout

subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo
dano
fonte
Isso precisa de explicações melhores
Sven
3

Isso pode não ser bonito ou elegante, mas foi rápido e funcionou para mim usando o bash no linux e os blocos formatados pelo PEM em um arquivo de pacote CA-cert.

while read line
do
    if [ "${line//END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -subject -issuer -noout
        txt=""
    else
        txt="$txt$line\n"
    fi
done < /path/to/bundle/file

Você pode colocar tudo em uma linha e ajustar as opções de openssl para se adequarem. Eu realmente gostaria que houvesse uma solução mais elegante para isso, mas, neste caso, acho que encontrar a solução mais elegante levaria mais tempo do que descobrir a deselegante.

user2856925
fonte
3

Como não há solução baseada em awk:

$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done

O primeiro comando dividiu o pacote configurável em certs, procurando as linhas BEGIN e END. O segundo comando percorre os certificados extraídos e os mostra.

Raghu Dodda
fonte
1
O recurso de redirecionamento de impressão no awk está disponível no gawk e nawk, mas não no awk básico. E assim, isso funcionaria no Linux (o gawk está vinculado como awk), mas talvez não no OS X, que possui o awk básico.
Raghu Dodda 9/11/2015
1

No bash, geralmente é necessária apenas uma (longa) linha de código :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete
Marco
fonte
0

Pequena alteração na postagem do MadHatter para permitir que você copie / cole diretamente na CLI. Também incluí o hash MD5, que é útil para garantir que os certificados estejam corretos. A linha stdin retornada é o hash md5 do (s) certificado (s).

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -text`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

Se você quiser ver uma saída curta e concisa, use esta versão. Útil se você está apenas verificando se incluiu todo o seu certificado, mas não está realmente verificando o uso / etc do (s) certificado (s).

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

Apenas no caso de sua versão openssl não suportar todos esses sinalizadores, aqui está um exemplo do egrep que você pode usar. A mesma coisa que o primeiro, mas apenas use o egrep.

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

Para verificar o hash MD5 da chave privada, você pode fazer o seguinte.

openssl rsa -noout -modulus -in privateKey.key | openssl md5

Referência: SSL Shopper - Certificate Key Matcher

lavermil
fonte
0

Aqui está uma solução baseada em awk que não depende de arquivos intermediários.

cat bundle.crt | awk '{
  if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
  else if ($0 == "-----END CERTIFICATE-----") print cert
  else cert=cert$0
}' | while read CERT; do
  echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done

Ele funciona lendo blocos PEM de stdin e concatenando cada bloco para uma única linha codificada em base64. As linhas são lidas, decodificadas e passadas para openssl como certificados codificados em DER.

Joe
fonte
2
Apenas por diversão: cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'.
Manav
0

Eu gostaria de lançar a linha de comando peri idiomática aqui:

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

Se houver texto, um ajuste um pouco mais robusto:

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

Apenas altere o valor do que n deve estar na segunda instrução para obter o enésimo certificado.

Gerard ONeill
fonte
-2

Método Windows

Uma maneira de ver toda a cadeia é (no Windows, é claro) clicar duas vezes no crt e procurar na guia Caminho da Certificação. Ele mostrará toda a cadeia, mesmo que haja apenas um certificado intermediário ou raiz. Veja a captura de tela abaixo para obter detalhes. Se você não estiver no Windows, peço desculpas pelo desconhecimento das variantes Unix / Linux.

Nota: isso pode causar resultados falsos se o certificado intermediário estiver no seu keystore local. O Windows o adicionará automaticamente e não mostrará apenas o que estava no pacote configurável.

                                      insira a descrição da imagem aqui

Linux (método Ubuntu)

Eu ignorei seu comando inicial e você tem uma coisa fora de lugar. Seu comando deve ficar assim:

openssl x509 -in bundle.crt -noout -text

Fonte: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html

Brad Bouchard
fonte
Realmente? Eu sei que é sublime, mas você realmente não pode dizer? Meu é openssl x509 -in bundle.crt -noout -text, enquanto o seu possui -text -noout ... por isso você provavelmente está recebendo um erro de sintaxe.
Brad Bouchard
20
Segure seus cavalos, Brad. Em primeiro lugar, o OP não reclamou que sua opensslchamada causou um erro de sintaxe, mas que apenas listou o primeiro certificado no pacote. Em segundo lugar, as duas invocações são funcionalmente idênticas. Terceiro, e provavelmente o mais importante, o seu também não funciona, pelo menos para mim; também lista apenas o primeiro certificado no pacote.
21414 MadHatter
Sim, eu não estou do lado do Ubuntu em questões como essa e pensei que ele estivesse no Windows até que ele me dissesse o contrário. Então, eu não queria deixar o OP travado e, depois de pesquisar um pouco, descobri que um site de referência para esses tipos de comandos listava o comando que eu dei a ele (aquele com a sintaxe ligeiramente diferente) e queria ver se podia Socorro. Seus pontos foram conquistados, mas faça-o com mais graça da próxima vez.
Brad Bouchard