Estou tentando obter o certificado de um servidor remoto, que posso usar para adicionar ao meu keystore e usá-lo no meu aplicativo java.
Um desenvolvedor sênior (que está de férias :() me informou que posso executar isso:
openssl s_client -connect host.host:9999
Para obter um certificado bruto despejado, que eu posso copiar e exportar. Eu recebo a seguinte saída:
depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
Eu também tentei com esta opção
-showcerts
e este (rodando no debian)
-CApath /etc/ssl/certs/
Mas obtenha o mesmo erro.
Esta fonte diz que posso usar esse sinalizador CApath, mas parece não ajudar. Eu tentei vários caminhos sem sucesso.
Por favor, deixe-me saber onde estou errado.
fonte
echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'
stackoverflow.com/a/12918442/843000echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
sed
comopenssl x509
, e lê-lo no uso de uma sub-shell:openssl x509 -in <(openssl s_client -connect server:port -prexit 2>/dev/null)
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
Embora eu concorde com a resposta de Ari (e a votei :): eu precisava fazer uma etapa extra para que ele funcionasse com o Java no Windows (onde precisava ser implantado):
Antes de adicionar a
openssl x509 -outform DER
conversão, eu estava recebendo um erro do keytool no Windows, reclamando do formato do certificado. A importação do arquivo .der funcionou bem.fonte
Acontece que há mais complexidade aqui: eu precisava fornecer muitos mais detalhes para fazer isso acontecer. Eu acho que tem algo a ver com o fato de ser uma conexão que precisa de autenticação do cliente, e o hankshake precisava de mais informações para continuar no estágio em que os certificados foram descartados.
Aqui está o meu comando de trabalho:
Espero que este seja um empurrão na direção certa para qualquer um que possa fazer com mais algumas informações.
fonte
Uma linha para extrair o certificado de um servidor remoto no formato PEM, desta vez usando
sed
:fonte
-servername
opção, não sei por que, mas eu tive que usá-lo para obter o certificado completo.A linha de comando mais fácil para isso, que inclui a saída PEM para adicioná-la ao keystore, além de uma saída legível por humanos e também suporta SNI, que é importante se você estiver trabalhando com um servidor HTTP:
A opção -servername é ativar o suporte SNI e o openssl x509 -text imprime o certificado em formato legível por humanos.
fonte
Para obter o certificado do servidor remoto, você pode usar a
openssl
ferramenta e pode encontrá-lo entreBEGIN CERTIFICATE
eEND CERTIFICATE
que você precisa copiar e colar em seu arquivo de certificado (CRT).Aqui está o comando demonstrando:
Para retornar todos os certificados da cadeia, basta adicionar
g
(global) como:Depois, você pode simplesmente importar seu arquivo de certificado (
file.crt
) para seu chaveiro e torná-lo confiável, para que o Java não se queixe.No OS X, você pode clicar duas vezes no arquivo ou arrastar e soltar no seu Keychain Access, para que ele apareça no login / Certificados. Em seguida, clique duas vezes no certificado importado e faça-o Sempre Confiar em SSL .
No CentOS 5, você pode anexá-los ao
/etc/pki/tls/certs/ca-bundle.crt
arquivo (e executarsudo update-ca-trust force-enable
:) ou no CentOS 6 copiá-los/etc/pki/ca-trust/source/anchors/
e executá- lossudo update-ca-trust extract
.No Ubuntu, copie-os
/usr/local/share/ca-certificates
e executesudo update-ca-certificates
.fonte
fonte
para imprimir apenas a cadeia de certificados e não o certificado do servidor:
para atualizar o CA trust no CentOS / RHEL 6/7:
no CentOS / RHEL 5:
fonte
Você pode obter e armazenar o certificado raiz do servidor usando o próximo script bash:
Basta substituir as variáveis necessárias.
fonte
Se o seu servidor for um servidor de email (MS Exchange ou Zimbra), talvez você precise adicionar os sinalizadores
starttls
esmtp
:openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem
Onde,
HOST_EMAIL é o domínio do servidor, por exemplo, mail-server.com.
SECURE_PORT é a porta de comunicação, por exemplo, 587 ou 465
Nome do arquivo da saída CERTIFICATE_NAME (formato BASE 64 / PEM)
fonte
Para o benefício de outras pessoas como eu, que tentaram seguir os bons conselhos aqui ao acessar o AWS CloudFront, mas falharam, o truque é adicionar
-servername domain.name..
.Fonte: https://serverfault.com/a/780450/8972
fonte