Há um servidor com uma cadeia SSL quebrada, conforme relatado por esta verificação SSL :
Sei que esse é um problema que deve ser resolvido no próprio servidor, mas às vezes é difícil de corrigir (não sou o administrador do servidor).
O problema é que o Chrome / Mozilla / Edge no Windows confia no certificado do site de qualquer maneira :
No entanto, em uma implantação do Gnu / Linux (Ubuntu 18.04 no Docker), o certificado não é confiável:
curl: (60) SSL certificate problem: unable to get local issuer certificate
Tentei update-ca-certificates
e até importei o certificado Globalsign Root. update-ca-certificates
relatou um certificado duplicado nesse caso. Enfim, nada funciona.
Como reproduzir
Usando o Docker:
docker run -it ubuntu:18.04
# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it # <---- "unable to get local issuer certificate"
Como posso fazer com que o Gnu / Linux confie neste certificado?
PS: O mesmo certificado foi implantado corretamente em outro servidor .
fonte
Respostas:
A correção real para isso é garantir que o servidor apresente todos os certificados na cadeia e não apenas o certificado da entidade final (servidor).
Aponte o administrador do servidor para a Seção 7.4.2 da RFC 5246, que afirma claramente que Esta mensagem transmite a cadeia de certificados do servidor ao cliente.
Se o seu administrador recusar / não puder fazer isso por algum motivo, sua opção alternativa é tentar
curl
trabalhar com o handshake malformado.De acordo com uma mensagem na lista de correspondência do Curl:
Você deve poder adicionar a CA raiz e todos os certificados intermediários a um pacote configurável e apontar
curl
para ele usando a--cacert <file>
opçãoÀ medida que os navegadores funcionam, você pode acessar os certificados CA corretos a partir daí. Na guia certificados (diferente para cada navegador, mas tenho certeza de que você descobrirá isso), visualize a cadeia de certificados. Clique duas vezes a raiz CA primeiro GlobalSign Root CA - G1 e no Detalhes guia, clique em Copiar para arquivo ... . Salve como
root.cer
. Faça o mesmo com o AlphaSSL CA - SHA256 - G2 e salve-o comoissuing.cer
. Junte os dois juntos em um único arquivo (por exemplochain.cer
) e use isso como argumento para-cacert
.Conforme gentilmente indicado pelo @AB, o certificado ausente também pode ser encontrado aqui .
Seus navegadores funcionam porque eles armazenam em cache certificados de CA. Se você navegou para um site configurado corretamente em algum momento no passado, cujo certificado foi emitido pela mesma CA que o certificado do servidor, ele será armazenado em cache pelo navegador. Quando você visitar o site configurado incorretamente posteriormente, o navegador usará os certificados da CA em seu cache para criar a cadeia. Para você, parece que está tudo bem, embora nos bastidores o servidor esteja mal configurado.
Observe que no Windows, o IE / Edge e o Chrome compartilham o mesmo cache, enquanto o Firefox usa o seu.
Além do acima, o IE / Edge e o Chrome (como compartilham a mesma pilha de criptografia) usarão uma extensão nos certificados denominada AuthorityInformationAccess . Isso tem uma opção caIssuer que fornece uma URL a partir da qual o certificado CA do certificado da entidade final pode ser baixado. Portanto, mesmo que um desses navegadores não tenha armazenado em cache os certificados ausentes da navegação anterior, ele poderá buscá-lo, se necessário. Observe que o Firefox não faz isso, e é por isso que às vezes o Firefox pode mostrar erros de certificado quando o IE / Edge e o Chrome parecem funcionar.
fonte
--cacert cacert.pem
mas o CURL ainda não aceita o certificado.echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443
e você verá apenas um certificado sendo apresentado pelo seu servidor. Deve haver dois - o certificado da entidade final (que é apresentado) e a CA de emissão - o certificado SSL SSL - SHA256 - G2. O último não está sendo enviado pelo servidor, mas deveria.