ligação https a usar a curva a partir da linha de comandos
cmd> curl https://[my domain or IP address]
e tem o seguinte:
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Ao ler alguns artigos na internet, fiz isto:
openssl s_client -connect <domain name or Ip address>:443
E teve alguma resposta, incluindo a
certificado do servidor (dentro -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----
).
O que devo fazer a seguir? Acho que vou ter de copiar o texto para dentro.
E guarda - o num ficheiro.
Mas,
Que tipo de arquivo deve ser? .pem
, .crt
?..
O que devo fazer depois disso?
tentei isto-copiei o texto dentro de BEGIN CERTIFICATE & END CERTIFICATE
e gravei-o num ficheiro .crt
chamado de my-ca.crt
(também tentei a mesma coisa, nomeando-o como ficheiro my-ca.pem
)
e depois fez isto:
cmd>curl --cacert my-ca.crt https://[my domain or IP address]
Mas tenho o mesmo erro.
9 answers
Eu tive o mesmo problema - eu estava obtendo uma página de meu próprio site, que foi servido sobre HTTPS, mas curl estava dando a mesma mensagem "problema de certificado SSL". Eu trabalhei em torno dele adicionando uma bandeira -k
à chamada para permitir conexões inseguras.
curl -k https://whatever.com/script.php
Editar: descobri a raiz do problema. Eu estava usando um certificado SSL (do StartSSL, mas eu não acho que isso importa muito) e não tinha configurado o certificado intermediário corretamente. Se você está tendo o mesmo problema que user1270392 acima, é provavelmente uma boa idéia para testar o seu certificado SSL e resolver quaisquer problemas com ele antes de recorrer à correção curl -k
.
Solução simples
É o meu guião diário.curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'
Ouput:
* Server certificate:
* subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
* start date: 2016-01-07 11:34:33 GMT
* expire date: 2016-04-06 00:00:00 GMT
* issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
* SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
Tens de fornecer toda a cadeia de certificados para enrolar, uma vez que a curva já não tem qualquer certificado. Uma vez que a opção cacert só pode usar um ficheiro, você precisa de combinar a informação completa da cadeia em 1 ficheiro
Copie a cadeia de certificados (do seu navegador, por exemplo) para o binário codificado em DER X. 509 (.cer). Faz isto por cada cert.
Converte os certificados em PEM, e concata-os em 1 ficheiro.
openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text
cat *.pem > certRepo
curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"
Escrevi um blog sobre como fazer isso aqui.: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html
Utilize --cacert
para indicar um ficheiro .crt
.
ca-root-nss.crt
por exemplo.
Obtenha o pacote de certificados root CA daqui: https://curl.haxx.se/ca/cacert.pem e guarda-o no local.
Procurar o ficheiro
php.ini
Define o
curl.cainfo
Como Sendo o caminho dos certificados. Por isso vai ser algo como:
curl.cainfo = /path/of/the/keys/cacert.pem
Aqui poderá encontrar os certificados das CA com instruções para transferir e converter os certificados das CA Mozilla.
Assim que tiver ca-bundle.crt
ou cacert.pem
, use apenas:
curl.exe --cacert cacert.pem https://www.google.com
Ou
curl.exe --cacert ca-bundle.crt https://www.google.com
/etc/ssl/certs/ca-certificates.crt
Como raiz isto pode ser feito como:
echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini
Então reinicie o servidor web.
Isto dava-te jeito
curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
curl --proto-default https <target>