https-соединение с использованием CURL из командной строки

127

Я новичок в мире Curl и Cacerts и столкнулся с проблемой при подключении к серверу. По сути, мне нужно проверить возможность подключения по https с одной машины на другую. У меня есть URL-адрес, к которому мне нужно подключиться с машины A (Linux-машины). Я попробовал это в командной строке.

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

и получил следующее:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Просматривая некоторые статьи в Интернете, я сделал следующее:

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

и получил ответ, включая сертификат сервера (внутри -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Что мне делать дальше? Думаю, мне нужно будет просто скопировать, вставить текст внутри BEGIN CERTIFICATE & END CERTIFICATEи сохранить в файл. Но какой это должен быть тип файла? .pem, .crt? .. Что мне делать после этого?

Я попробовал это - скопировал текст внутри BEGIN CERTIFICATE & END CERTIFICATEи сохранил его в .crtфайле - назвал его как my-ca.crt(также попробовал то же самое, назвав его my-ca.pemфайлом), а затем сделал следующее:

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

Но получил ту же ошибку.

user1270392
источник
Не уверен в решении, которое вы предлагаете, но я просто искал аналогичную информацию и нашел этот полезный сайт для использования curl с PHP unitstep.net/blog/2009/05/05/…
MauroPerez
1
вы также можете добавить, --insecureчтобы игнорировать ошибку SSL.
Alexej Magura
более новые версии curl (например, 7.64) не распознают старые шифры, такие как RC4-SHA - использование более старой версии curl (7.46) помогло мне serverfault.com/questions/889631/…
hello_earth 01

Ответы:

142

У меня была та же проблема - я загружал страницу со своего сайта, которая обслуживалась по HTTPS, но curl выдавал то же сообщение «Проблема с сертификатом SSL». Я обошел это, добавив -kк вызову флаг, разрешающий небезопасные соединения.

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

Изменить: я обнаружил корень проблемы. Я использовал сертификат SSL (от StartSSL, но я не думаю, что это имеет большое значение) и неправильно настроил промежуточный сертификат. Если у вас та же проблема, что и у пользователя 1270392, описанного выше, вероятно, рекомендуется протестировать сертификат SSL и исправить любые проблемы с ним, прежде чем прибегать к curl -kисправлению.

Дэйв Чайлд
источник
5
-k flag - хороший ярлык. Сработало у меня!
tidydee 09
45

Простое решение

Это мой повседневный сценарий:

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

Вывод:

* 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
Таким образом, вы разрешаете --insecureсоединение через TSL каждый день ...
Brethlosze
2
@Brethlosze Спасибо за ваш комментарий. Но это не так. Дело в том, чтобы получить информацию об SSL от всевозможных сертификатов.
Антонио
30

Вам необходимо предоставить всю цепочку сертификатов для curl, поскольку curl больше не поставляется с какими-либо сертификатами CA. Поскольку параметр cacert может использовать только один файл, вам необходимо объединить всю информацию о цепочке в 1 файл.

Скопируйте цепочку сертификатов (например, из браузера) в двоичный код x.509 (.cer) в кодировке DER. Сделайте это для каждого сертификата.

Преобразуйте сертификаты в PEM и объедините их в 1 файл.

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"

Я написал блог о том, как это сделать, здесь: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

Сомаиа Кумбера
источник
1
Не могли бы вы объяснить цель передачи имени пользователя и пароля? Что, если я пишу Java-клиент, нужно ли мне в этом случае передавать имя пользователя и пароль в заголовке запроса GET?
Shubhi224
@ Shubhi224 нет, если ваш https-сервер не требует простой аутентификации для запросов GET. Мне пришлось использовать аутентификацию, так как это был вызов REST.
Сомаайя Кумбера
Как упоминалось в этом ответе, «вам необходимо предоставить всю цепочку сертификатов для curl, поскольку curl больше не поставляется с какими-либо сертификатами CA».
Мохамед Бана
16

используйте --cacertдля указания .crtфайла. ca-root-nss.crtнапример.

ано
источник
6

У меня действительно была такая проблема, и я решил ее следующими шагами:

  1. Получите комплект сертификатов корневого ЦС отсюда: https://curl.haxx.se/ca/cacert.pem и сохраните его на локальном компьютере.

  2. Найдите php.iniфайл

  3. Задайте curl.cainfoпуть к сертификатам. Это будет примерно так:

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

geckob
источник
1

Решив проблему, я смог использовать существующий системный файл CA по умолчанию, на debian6 это:

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

как root это можно сделать так:

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

затем перезапустите веб-сервер.

Jasen
источник
1

ты мог бы использовать это

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

Ахмед Али
источник
0

Что касается меня, я просто хотел протестировать веб-сайт с автоматическим перенаправлением http-> https. Я думаю, что у меня уже были установлены некоторые сертификаты, поэтому только это работает для меня на Ubuntu 16.04, работающем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>

SamCyanide
источник
-3

В современных версиях curl вы можете просто переопределить, к какому IP-адресу подключаться, используя --resolve или --connect-to (curl новее, чем версия 7.49). Это работает даже с SSL / SNI. Все подробности находятся на странице руководства.

Например, чтобы переопределить DNS и подключиться к www.example.com с помощью ssl, используя определенный IP-адрес: (Это также переопределит ipv6)

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

Другой пример, для подключения к определенному внутреннему серверу с именем backend1 через порт 8080

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

Не забудьте добавить заголовок хоста, если серверу это нужно для правильного ответа:

-H 'Host:www.example.com' 
ingvarha
источник
Я не уверен, как это ответить на вопрос.
Brethlosze