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.

user1270392
fonte
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.

Dave Child
fonte
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
Antonio Feitosa
fonte
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

Somaiah Kumbera
fonte
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.

ano
fonte
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

geckob
fonte
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.

Jasen
fonte
1

você poderia usar isso

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

Ahmed Ali
fonte
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>

SamCyanide
fonte
-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' 
ingvarha
fonte
Não tenho certeza de como isso responde à pergunta.
Brethlosze 16/01/19