conexão https usando CURL na linha de comando


127

Eu sou novo no mundo Curl e Cacerts e estou enfrentando um problema ao me conectar a um servidor. Basicamente, preciso testar a conectividade através de https de uma máquina para outra. Eu tenho um URL ao qual preciso me conectar da Máquina A (uma máquina Linux). Tentei isso no prompt de comando.

cmd> curl https://[my domain or IP address]

e obteve 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 passar por alguns artigos pela internet, fiz o seguinte:

openssl s_client -connect <domain name or Ip address>:443

e obtive algumas respostas, incluindo o certificado do servidor (interno -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

O que devo fazer a partir daqui. Eu acho que vou ter que copiar e colar o texto dentro BEGIN CERTIFICATE & END CERTIFICATEe salvá-lo em um arquivo. Mas, que tipo de arquivo deve ser? .pem, .crt? .. O que devo ser fazer depois disso?

Eu tentei isso - copiei o texto dentro BEGIN CERTIFICATE & END CERTIFICATEe salvei em um .crtarquivo - o nomeei como my-ca.crt(também tentei a mesma coisa nomeando-o como my-ca.pemarquivo) e fiz o seguinte:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

Mas tenho o mesmo erro.


Não tenho certeza sobre a solução que você está sugerindo, mas eu estava apenas procurando informações semelhantes e eu encontrei este site útil para usando curl com PHP unitstep.net/blog/2009/05/05/...
— MauroPerez

1
você também pode adicionar --insecurepara desconsiderar o erro SSL.
— Alexej Magura 27/03

versões mais recentes do cacho (por exemplo, 7,64) não reconheceria cifras mais velhos como RC4-SHA - usando a versão mais antiga do cacho (7,46) me ajudou a serverfault.com/questions/889631/...
— hello_earth

Respostas:


142

Eu tive o mesmo problema - estava buscando uma página do meu próprio site, que era veiculada por HTTPS, mas o curl estava dando a mesma mensagem "Problema no certificado SSL". Eu trabalhei com isso adicionando um -ksinalizador à chamada para permitir conexões inseguras.

curl -k https://whatever.com/script.php

Edit: Eu descobri a raiz do problema. Eu estava usando um certificado SSL (do StartSSL, mas não acho que isso importe muito) e não havia configurado o certificado intermediário corretamente. Se você está tendo o mesmo problema que o user1270392 acima, provavelmente é uma boa ideia testar seu certificado SSL e corrigir quaisquer problemas com ele antes de recorrer à curl -kcorreção.


5
-k flag é um bom atalho. Trabalhou para mim!
— Tidydee

45

Solução simples

Esse é o meu roteiro diário:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Resultado:

* 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

11
Assim, você está permitindo uma --insecureconexão através de TSL, todos os dias ...
— Brethlosze

2
@Brethlosze Obrigado pelo seu comentário. Mas não é esse o caso. O objetivo é obter as informações SSL de todos os tipos de certificados.
— Antonio Feitosa

30

Você precisa fornecer toda a cadeia de certificados para enrolar, pois o enrolamento não é mais enviado com certificados de CA. Como a opção cacert pode usar apenas um arquivo, é necessário concaturar as informações da cadeia completa em 1 arquivo

Copie a cadeia de certificados (do seu navegador, por exemplo) para o binário codificado em DER x.509 (.cer). Faça isso para cada certificado.

Converta as certs em PEM e concatide-as em 1 arquivo.

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"

Eu escrevi um blog sobre como fazer isso aqui: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
Você pode explicar o propósito de passar userName e senha? E se eu estiver escrevendo um cliente Java, preciso passar o nome de usuário e a senha no cabeçalho da solicitação GET, nesse caso?
— Shubhi224

@ Shubhi224 não se o servidor https não exigir uma autenticação simples para solicitações GET. Eu tive que usar autenticação, pois era uma chamada REST que exigia.
— Somaiah Kumbera

Como mencionado nesta resposta "Você precisa fornecer toda a cadeia de certificados para se enrolar, pois a onda não é mais fornecida com certificados de autoridade de certificação".
— Mohamed Bana

16

use --cacertpara especificar um .crtarquivo. ca-root-nss.crtpor exemplo.


6

Na verdade, eu tive esse tipo de problema e o resolvo com estas etapas:

  1. Obtenha o pacote de certificados de CA raiz aqui: https://curl.haxx.se/ca/cacert.pem e salve-o no local

  2. Encontre o php.iniarquivo

  3. Defina curl.cainfocomo o caminho dos certificados. Então será algo como:

curl.cainfo = /path/of/the/keys/cacert.pem



1

tendo resolvido o problema, fui capaz de usar o arquivo CA padrão do sistema existente, no debian6, é:

/etc/ssl/certs/ca-certificates.crt

como root, isso pode ser feito como:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

depois reinicie o servidor da web.


1

você poderia usar isso

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);


0

Para mim, eu só queria testar um site que tivesse um redirecionamento http-> https automático. Eu acho que já tinha alguns certificados instalados, então isso sozinho funciona para mim no Ubuntu 16.04 em execuçãocurl 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>


-2

Nas versões modernas do curl, você pode simplesmente substituir o endereço IP ao qual se conectar, usando --resolve ou --connect-to (curl mais recente que a versão 7.49). Isso funciona mesmo com SSL / SNI. Todos os detalhes estão na página do manual.

Por exemplo, para substituir o DNS e conectar-se a www.example.com com ssl usando um endereço IP específico: (Isso também substituirá o ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

Outro exemplo, para conectar-se a um servidor de back-end específico chamado backend1 na porta 8080

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

Lembre-se de adicionar o cabeçalho do host se o servidor precisar responder corretamente:

-H 'Host:www.example.com' 

Não tenho certeza de como isso responde à pergunta.
— Brethlosze 16/01/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.