Onda: não é possível obter o certificado do emissor local. Como depurar?

14

Eu tenho um problema estranho. Atualizei minha máquina de desenvolvimento LAMP (Debian) para o PHP 7. Depois, não consigo mais conectar-me a uma API criptografada por TLS específica via Curl.

O certificado SSL em questão é assinado por thawte.

curl https://example.com

me dá

curl: (60) SSL certificate problem: unable to get local issuer certificate

enquanto que

curl https://thawte.com

que - é claro - também é assinado pelas obras de Thawte.

Eu posso acessar o site da API via HTTPS em outras máquinas, por exemplo, minha área de trabalho via curl e no navegador. Portanto, o certificado é definitivamente válido. A classificação do SSL Labs é A.

Quaisquer outras solicitações de Curl da minha máquina de desenvolvimento para outros sites criptografados SSL funcionam. Meus certificados de raiz estão atualizados. Para verificar, eu corri update-ca-certificates. Eu até baixei http://curl.haxx.se/ca/cacert.pem para / etc / ssl / certs e corri c_rehash.

Ainda é o mesmo erro.

Existe alguma maneira de depurar o processo de verificação e ver qual onda de certificado de emissor local (ou openssl) está procurando, mas não encontra, ou seja, um nome de arquivo?

ATUALIZAR

curl -vs https://example.com

diz-me (IP + domínio anonimizado)

* Hostname was NOT found in DNS cache
*   Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0

E

echo | openssl s_client -connect example.com:443

CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=DE/ST=XYZ/CN=*.example.com
   i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
 1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
   i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: [...]
    Session-ID-ctx:
    Master-Key: [...]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d   Z..@,.k.JPu....-
    [...]
    00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24   ...%.....s...F.$

    Start Time: 1455111516
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE
Roubar
fonte
1
Você poderia fornecer uma saída detalhada de pelo menos um desses cmd? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

Respostas:

8

Usando openssl s_client -connect thawte.com:443shows:

---
Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
   i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
 1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---

Esse último "i" mostra a CA raiz autoassinada de emissão. Suponho que essa CA raiz do Thawte em particular , _i.e. o certificado de CA raiz principal - G3 , não está no seu /etc/ssl/certsdiretório (como indicado na curlsaída; openssl s_clientnão possui um caminho de CA padrão e precisa explicitamente, por exemplo -CApath /etc/ssl/certs ).

Adicionar esse certificado explicitamente ao seu /etc/ssl/certsdiretório (e executar novamente c_rehash) certamente não faria mal. E se funcionar, por exemplo , como verificado usando openssl s_client -connect example.com:443 -CApath /etc/ssl/certs, então você sabe que esse update-ca-certificatescomando pode precisar de algum exame / depuração, por que não captou essa autoridade de certificação raiz.

Agora, pode ser que a autoridade de certificação raiz acima já esteja no seu /etc/ssl/certsdiretório e as etapas acima não tenham tido efeito. Nesse caso, existem duas outras certificações de CA de emissão para verificar (pelo menos na cadeia de certificados oferecida por thawte.com:443): thawte CA raiz principal e thawte SSL CA - G2 . Repetir as etapas acima para instalar esses certificados no /etc/ssl/certsdiretório (e executar novamente c_rehash) pode funcionar. Como essas duas são CAs intermediárias, e não de raiz, a ausência de uma delas explicaria seus resultados e pode ser esperada como uma questão negligenciada update-ca-certificates.

Espero que isto ajude!

Castaglia
fonte
Obrigado! O download do certificado intermediário "thawte SSL CA - G2" para / etc / ssl / certs e a nova execução de c_rehash corrigiram o problema!
Rob
1
Este openssl s_client -connect <server>:443 -CAfile cacert.pemcomando é muito útil ... obrigado!
kris
0

Isso pode ser causado por ordem incorreta do site, emissão, certificados intermediários e raiz no arquivo de certificado de chave pública do site.

O navegador exibe certs na direção de cima para baixo (raiz, intermediário, emissor, site), mas o certificado deve estar na direção de baixo para cima (site, emissor, intermediário, raiz).

andrej
fonte