2012-04-09 5 views
61

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

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] 

Но такая же ошибка.

ответ

9

Не уверены, что решение вы предлагаете, но я просто искал подобную информацию, и я нашел этот полезный сайт для использования завитка с PHP

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

+0

Ссылка выше для решения PHP. Тем не менее, в этой статье в блоге технику можно легко адаптировать к командной строке. –

9

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

73

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

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

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

+1

-k флаг хороший ярлык. Работал для меня! – tidydee

13

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

Скопируйте цепочку сертификатов (например, из вашего браузера) в двоичную кодировку 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

+0

Не могли бы вы объяснить цель передачи имени пользователя и пароля? Что делать, если я пишу Java-клиент, мне нужно передать имя пользователя и пароль в заголовке запроса GET, в таком случае? – Shubhi224

+0

@ Shubhi224 нет, если ваш сервер https не требует простой аутентификации для запросов GET. Мне пришлось использовать аутентификацию, так как это был вызов REST, который требовал этого. –

14

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

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

Ouput:

* 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 
1

Я на самом деле был этот вид проблемы, и я решаю это следующими шагами:

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

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

  3. Установите curl.cainfo быть путь сертификатов. Так что это будет что-то вроде:

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

1

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

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

как корень этого можно сделать следующим образом:

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

затем заново запустить веб сервер.

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>

Смежные вопросы