Соединение https с использованием CURL из командной строки
Я новичок в мире Curl и Cacerts и сталкиваюсь с проблемой при подключении к серверу.
В принципе, мне нужно проверить подключение через https от одной машины к другой машине.
У меня есть URL-адрес, к которому мне нужно подключиться от Machine 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
file)
а затем сделал следующее:
cmd>curl --cacert my-ca.crt https://[my domain or IP address]
Но получил ту же ошибку.
Ответы
Ответ 1
У меня была такая же проблема - я извлекал страницу с моего собственного сайта, которая была передана через HTTPS, но завиток выдавал то же сообщение "проблема с сертификатом SSL". Я работал над этим, добавив флаг -k
к вызову, чтобы разрешить небезопасные соединения.
curl -k https://whatever.com/script.php
Изменить: я обнаружил корень проблемы. Я использовал SSL-сертификат (из StartSSL, но я не думаю, что это очень важно) и не настроил промежуточный сертификат должным образом. Если у вас такая же проблема, как и у пользователя1270392 выше, вероятно, хорошая идея проверить сертификат SSL и исправить любые проблемы с ним, прежде чем приступать к исправлению curl -k
.
Ответ 2
Простое решение
Вот мой повседневный сценарий:
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
Ответ 3
Вам нужно предоставить целую цепочку сертификатов для завивки, поскольку завиток больше не поставляется с сертификатами CA. Поскольку опция cacert может использовать только один файл, вам необходимо сконфигурировать всю информацию о цепочке в 1 файл
Скопируйте цепочку сертификатов (например, из вашего браузера) в двоичную кодировку DER, закодированную DER. x.509 (.cer). Сделайте это для каждого сертификата.
Преобразуйте сертификаты в 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
Ответ 4
используйте --cacert
, чтобы указать файл .crt
.
ca-root-nss.crt
например.
Ответ 5
Не уверен относительно решения, которое вы предлагаете, но я просто искал подобную информацию, и я нашел этот полезный сайт для использования curl с PHP
http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
Ответ 6
У меня действительно была такая проблема, и я решаю ее с помощью следующих шагов:
-
Получите пакет сертификатов корневого CA отсюда: https://curl.haxx.se/ca/cacert.pem и сохраните его на локальном
-
Найдите файл php.ini
-
Установите curl.cainfo
в качестве пути сертификатов. Так будет что то вроде
curl.cainfo =/path/of/the/keys/cacert.pem
Ответ 7
Здесь вы можете найти сертификаты CA с инструкциями по загрузке и конвертации сертификатов Mozilla CA.
Когда вы получите ca-bundle.crt
или cacert.pem
, вы просто используете:
curl.exe --cacert cacert.pem https://www.google.com
или
curl.exe --cacert ca-bundle.crt https://www.google.com
Ответ 8
поставив перед собой задачу
Я смог использовать существующий файл CA CA по умолчанию, на debian6 это:
/etc/ssl/certs/ca-certificates.crt
как root, это можно сделать следующим образом:
echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini
затем заново запустите веб-сервер.
Ответ 9
ты мог бы использовать это
curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);
Ответ 10
Для меня я просто хотел протестировать сайт с автоматическим перенаправлением 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>
Ответ 11
В современных версиях 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'