https-з'єднання за допомогою CURL з командного рядка


127

Я новачок у світі Curl and 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]

Але отримав таку ж помилку.


Не впевнений у запропонованому вами рішенні, але я просто шукав подібну інформацію і знайшов цей корисний сайт для використання curl з PHP unitstep.net/blog/2009/05/05/…
MauroPerez

1
Ви також можете додати, --insecureщоб знехтувати помилкою SSL.
Олексій Магура

новіші версії curl (наприклад, 7.64) не розпізнають старі шифри, такі як RC4-SHA - використання старшої версії curl (7.46) допомогло мені serverfault.com/questions/889631/…
hello_earth

Відповіді:


142

У мене була така ж проблема - я добирав сторінку з власного сайту, яку подавали через HTTPS, але curl давав те саме повідомлення "SSL сертифікат проблеми". Я працював над цим, додаючи -kпрапор до виклику, щоб дозволити небезпечні зв’язки.

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

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


5
-k прапор - хороший ярлик. Працювали для мене!
tidydee

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 більше не постачається з жодними сертифікатами CA. Оскільки параметр cacert може використовувати лише один файл, вам потрібно сформувати повну інформацію про ланцюг у 1 файл

Скопіюйте ланцюжок сертифікатів (наприклад, зі свого браузера) у кодований DER двійковий x.509 (.cer). Зробіть це для кожного cert.

Перетворіть серти в 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 більше не постачається з жодними сертифікатами CA".
Мохамед Бана

16

використовувати, --cacertщоб вказати .crtфайл. ca-root-nss.crtнаприклад.


6

У мене насправді була така проблема, і я вирішую її такими кроками:

  1. Отримайте пакет кореневих сертифікатів CA тут: https://curl.haxx.se/ca/cacert.pem та збережіть його на локальному

  2. Знайди php.ini файл

  3. Встановіть " curl.cainfoшлях" для сертифікатів. Тож буде щось на кшталт:

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



1

розібравшись із проблемою, я зміг використати існуючий системний файл 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.04curl 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>


-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' 

Я не впевнений, як це відповідає на питання.
Brethlosze
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.