Desejo fazer o download do certificado SSL de, digamos https://www.google.com , usando wget ou qualquer outro comando. Alguma linha de comando unix? wget ou openssl?
Desejo fazer o download do certificado SSL de, digamos https://www.google.com , usando wget ou qualquer outro comando. Alguma linha de comando unix? wget ou openssl?
Respostas:
Para fazer o download do certificado, você precisa usar o cliente incorporado ao openssl da seguinte maneira:
echo -n | openssl s_client -connect HOST:PORTNUMBER \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert
Isso salvará o certificado em /tmp/$SERVERNAME.cert
.
Você pode usar -showcerts
se quiser fazer o download de todos os certificados na cadeia. Mas se você deseja apenas baixar o certificado do servidor, não há necessidade de especificar-showcerts
echo -n
dá uma resposta ao servidor, para que a conexão seja liberada
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
remove informações sobre a cadeia de certificados e detalhes da conexão. Este é o formato preferido para importar o certificado para outros keystores.
-showcerts
mostrar o certificado de servidor / folha também? Eu pensei que ele só exibia intermediários quando essa opção foi incluída.
s_client
sempre mostra o certificado do servidor (se houver um, ou seja, o servidor responde ao hello e não escolhe um conjunto anônimo). -showcerts
mostra todos os certificados recebidos, o certificado do servidor primeiro e depois os intermediários e / ou raiz.
Eu encontrei a resposta. Openssl fornece.
openssl s_client -connect $ {REMHOST}: $ {REMPORT}
openssl x509 -text <<EOF cert-text EOF
para ver detalhes do certificado
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem
cortesia de serverfault.com/questions/139728/…
A ferramenta cliente GNUTLS,,gnutls-cli
também pode facilitar isso:
gnutls-cli --print-cert www.example.com \
< /dev/null \
> www.example.com.certs
O programa foi projetado para fornecer um cliente interativo ao site, portanto, você precisa fornecer uma entrada vazia (neste exemplo, de /dev/null
) para finalizar a sessão interativa.
com base na resposta @bignose, aqui está uma versão independente que se encaixa bem em, por exemplo, uma receita de chef:
sudo apt-get install gnutls-bin
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
esse modo de openssl espera stdin, portanto, fornecemos via true |
, isso se conecta ao servidor especificado no parâmetro -connect. 2>/dev/null
silêncios (opcional), podemos passar toda a saída para o analisador x509, especificando o /dev/stdin
uso do pipe de shell como o arquivo de entrada. E que o produto será apenas o -----BEGIN CERTIFICATE-----
que -----END CERTIFICATE-----
parte da s_client
saída. Você pode redirecionar isso para um arquivo adicionando > google.com.pem
ao final do comando.
O melhor que posso dizer é que isso não verifica a cadeia de certificados, mas apenas a identidade SSL que o servidor final fornece.
x509
lê stdin por padrão, portanto -in /dev/stdin
é redundante (3) s_client
verifica se o certificado do servidor está corretamente conectado a uma âncora de confiança local (raiz) e não está vencido, mas você suprimiu as informações que mostrariam isso (4) NÃO verifica a revogação (5) verifica o nome no certificado do servidor apenas na versão 1.0.2 e depois não é o padrão (mas você pode verificar isso facilmente olhando o certificado )