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.