curl https проблемы с отправкой запроса. Curl запрос https


php - cURL жалуется на локальные запросы SSL https

У меня есть сервер Ubuntu LAMP на Digital Ocean и настроен SSL-сертификат (который отлично работает). Веб-сайт работает через https (http-запросы перенаправляются на https). В одном из моих PHP-скриптов мне нужно отправить запрос cURL на локальный сервер. Я в основном отправляю запрос POST с данными JSON, которые будут использоваться для шаблонирования документа на другом конце. Короче говоря, оба конца размещаются на одном и том же сайте:

  • https://example.com/form.php
  • https://example.com/templates/document.php

Ошибка cURL, которую я получаю при отправке данных из form.php в templates/document.php:

Ошибка сертификата SSL: невозможно получить сертификат локального эмитента

Я прочитал как минимум 20 статей, в которых мне хотелось добавить эти строки в php.ini на своих исходных позициях:

  • curl.cainfo="/etc/ssl/certs/cacert.pem"
  • openssl.cafile="/etc/ssl/certs/cacert.pem"

Сертификат ЦС расположен, как описано выше, но ошибка cURL сохраняется.

Я могу обойти эту ошибку, заставив CURLOPT_SSL_VERIFYPEER false в запросе cURL. Тем не менее, я знаю, что это не вариант для веб-сайта в режиме производства.

Невозможно ли выполнить такой запрос SSL cURL на свой собственный хост? Или это так, что я могу фактически отключить CURLOPT_SSL_VERIFYPEER для этого очень конкретного запроса, так как он просто локальный запрос?

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Добавление подробного варианта к запросу cURL показывает следующую информацию:

  • Попытка 123.456.789.01...
  • Подключено к example.com(123.456.789.01) порт 443 (# 0)
  • ALPN, предлагая http/1.1
  • Cipher selection: ALL:! EXPORT:! EXPORT40:! EXPORT56:! ANULL:! LOW:! RC4: @STRENGTH
  • успешно установите места для проверки сертификатов:
  • CAfile: /etc/ssl/certs/cacert.pem CApath: /etc/ssl/certs
  • Ошибка сертификата SSL: невозможно получить сертификат локального эмитента
  • Закрывающее соединение 0

Однако, похоже, это не поможет.

источник поделиться

qaru.site

pycurl и curl запрос по протоколу https: pycurl.error: server certificate verification failed

server certificate verification failed CAfile: /etc/ssl/certs/ca-certificates.crt

Сообщение об ошибке говорит, что согласно информации в указанном CAfile, присланный с данного сайта сертификат не проходит проверку.

Для сравнения, с yandex сайтом тот же код без проблем работает:

import pycurl c = pycurl.Curl() c.setopt(c.URL, 'https://ya.ru') c.perform()

Команда curl -k у вас работает так как ключ -k (--insecure) выключает проверку, что позволяет третьим лицами подслушивать/изменять сообщения от/к сайту (делает соединение уязвимым к MITM атаке). Ожидаемо просто curl ошибку возвращает:

curl: (60) SSL certificate problem: self signed certificate

IP частный в вопросе указан, попросите у администратора сайта сертификат, который можно в curl --cacert опцию передать. Если у вас нет возможности получить сертификат напрямую, то чтобы не использовать небезопасное соединение при каждом соединении, вы можете один раз скачать сертификат:

$ openssl s_client -prexit -servername $host -connect $host:443 </dev/null | openssl x509 >server.crt

где host=192.168.2.1.

Если предположить, что соединение не было скомпрометировано когда вы server.crt получали, то после этого можно безопасно запрашивать url:

$ curl --cacert server.crt https://$host/path?query

или в Питоне:

import pycurl c = pycurl.Curl() c.setopt(c.URL, url) c.setopt(c.CAINFO, 'server.crt') c.perform()

или используя requests модуль:

import requests r = requests.get(url, verify='server.crt') print(r.text)

или используя urllib из стандартной библиотеки:

import ssl import urllib.request context = ssl.create_default_context(cafile='server.crt') with urllib.request.urlopen(url, context=context) as r: print(r.read().decode(r.headers.get_content_charset('utf-8')))

Проверка сертификатов включена по умолчанию начиная с Python 2.7.9 и Python 3.4.3.

Чтобы выключить проверку сертификатов (не рекомендуется) для pycurl:

c.setopt(c.SSL_VERIFYPEER, 0) # default 1 c.setopt(c.SSL_VERIFYHOST, 0) # default 2

для requests модуля, чтобы выключить защиту, можно передать verify=False.

Чтобы открыть себя к MITM атаке при использовании стандартной библиотеки: urlopen(url, context=ssl._create_stdlib_context()).

python-scripts.com

Ошибка запроса curl по протоколу https? — Toster.ru

Написал я скрипт для python 3.4.3, который использует библиотеку requests. На компьютере под управлением Linux Mint, все отлично запускается, данные запрашиваются и приходят. Стал переносить на виртуальную машину под управлением Ubuntu Server 15.10. Запустил скрипт и он повис. Начал копаться и дошел до строки где происходит post запрос к серверу по протоколу https. import requests pl = {'test':'test'} r = requests.Session() r.post("https://toster.ru",verify=False,data=pl) Попробовал просто командами продублировать код и при зависании запроса жму Ctrl+C получаю следующее:File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 343, in _make_request self._validate_conn(conn) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 780, in _validate_conn conn.connect() File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 241, in connect ssl_version=resolved_ssl_version) File "/usr/lib/python3/dist-packages/urllib3/util/ssl_.py", line 276, in ssl_wrap_socket return context.wrap_socket(sock, server_hostname=server_hostname) File "/usr/lib/python3.4/ssl.py", line 362, in wrap_socket _context=self) File "/usr/lib/python3.4/ssl.py", line 580, in __init__ self.do_handshake() File "/usr/lib/python3.4/ssl.py", line 807, in do_handshake self._sslobj.do_handshake() KeyboardInterrupt Увидев, что процесс зависает на процессе sslobj.do_handshake(). Попробовал сделать запрос curl (для примера запрос делал к https://toster.ru):curl -v https://toster.ru * Rebuilt URL to: https://toster.ru/ * Trying 178.248.236.52... * Connected to toster.ru (178.248.236.52) port 443 (#0) * found 187 certificates in /etc/ssl/certs/ca-certificates.crt * found 748 certificates in /etc/ssl/certs * ALPN, offering http/1.1 И процесс также завис. Аналогично и с gnutls:Processed 187 CA certificate(s). Resolving 'toster.ru'... Connecting to '178.248.236.52:443'... *** Fatal error: The operation timed out *** Handshake has failed GnuTLS error: The operation timed out Версии:OpenSSL 1.0.2d 9 Jul 2015 gnutls-cli 3.3.15 curl 7.43.0 (x86_64-pc-linux-gnu) libcurl/7.43.0 GnuTLS/3.3.15 zlib/1.2.8 libidn/1.28 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets Сразу скажу, что в настройках всего этого слабо понимаю, но прошу направить в нужное направление.

toster.ru

curl https проблемы с отправкой запроса | PHPClub

Первый шаг для тестового и основного получаются одинаковые запрос-ответ (ну примерно, за исключением куки):

запрос

POST /ibe/deeplink/apiEntryPoint.do HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729) Host: ********** Accept: */* Connection: close Content-Length: 1346 Content-Type: application/x-www-form-urlencoded Expect: 100-continue

ответ

HTTP/1.1 302 Moved Temporarily Server: nginx Date: Wed, 12 May 2010 08:52:40 GMT Content-Type: text/html;charset=UTF-8 Connection: close Set-Cookie: JSESSIONID=564D137CC17343796D477BA07BA7E683; Path=/ibe Cache-Control: no-store Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=564D137CC17343796D477BA07BA7E683 Location: http://**********/ibe/deeplink/apiEntryPointResponse.do Content-Length: 0

отсюда получаем куки и location и вот тут начинается непонятное: тестовый сервер:

запрос: POST /ibe/deeplink/apiEntryPointResponse.do HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729) Host: ********** Accept: */* Cookie: JSESSIONID=564D137CC17343796D477BA07BA7E683 Content-Length: 0 Content-Type: application/x-www-form-urlencoded Expect: 100-continue

ответ:

HTTP/1.0 200 OK Server: nginx Date: Wed, 12 May 2010 08:52:41 GMT Content-Type: text/html;charset=UTF-8 Cache-Control: no-store Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT X-Cache: MISS from adam X-Cache-Lookup: MISS from adam:3128 Via: 1.0 adam:3128 (squid/2.6.STABLE21) Connection: close

{длинный XML}

основной сервер:

(тут куки другие потому что запрос другой, но первая часть за исключением куки такая же) POST /ibe/deeplink/apiEntryPointResponse.do HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729) Host: ********** Accept: */* Cookie: JSESSIONID=2CBE5ED6081D12D8F9A32FE00491D7C6 Content-Length: 0 Content-Type: application/x-www-form-urlencoded Expect: 100-continue

HTTP/1.1 302 Moved Temporarily Server: nginx Date: Wed, 12 May 2010 09:18:06 GMT Content-Type: text/html;charset=UTF-8 Connection: close Set-Cookie: JSESSIONID=2CBE5ED6081D12D8F9A32FE00491D7C6; Path=/ibe Cache-Control: no-store Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=2CBE5ED6081D12D8F9A32FE00491D7C6 Location: http://**********/ibe/deeplink/apiEntryPointResponse.do Content-Length: 0

Т.е. вместо ответа 200 снова происходит редирект. На тестовом такого нет.

 

phpclub.ru

Как пользоваться curl | Losst

Нам часто приходится загружать различные файлы из интернета, например, исполняемые файлы программ, файлы скриптов, архивы с исходниками. Но не всегда это нужно делать через браузер. Во многих ситуациях гораздо проще выполнить все действия через терминал. Поскольку таким образом вы можете автоматизировать процесс. С другой стороны, веб-мастерам время от времени приходится тестировать доступность веб-сайтов, проверять отправляемые и получаемые заголовки и многое другое.

Для решения таких задач и задач подобного круга можно воспользоваться утилитой curl. Она позволяет решить намного более широкий круг задач, среди которых даже имитация действий пользователя на сайте. В этой статье мы рассмотрим как пользоваться curl, что это такое и зачем нужна эта программа.

Содержание статьи:

Что такое curl?

На самом деле, curl - это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.

Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl - это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.

Команда curl

Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост:

$ curl опции ссылка

Теперь рассмотрим основные опции:

  • -# - отображать простой прогресс-бар во время загрузки;
  • -0 - использовать протокол http 1.0;
  • -1 - использовать протокол шифрования tlsv1;
  • -2 - использовать sslv2;
  • -3 - использовать sslv3;
  • -4 - использовать ipv4;
  • -6 - использовать ipv6;
  • -A - указать свой USER_AGENT;
  • -b - сохранить Cookie в файл;
  • -c - отправить Cookie на сервер из файла;
  • -C - продолжить загрузку файла с места разрыва или указанного смещения;
  • -m - максимальное время ожидания ответа от сервера;
  • -d - отправить данные методом POST;
  • -D - сохранить заголовки, возвращенные сервером в файл;
  • -e - задать поле Referer-uri, указывает с какого сайта пришел пользователь;
  • -E - использовать внешний сертификат SSL;
  • -f - не выводить сообщения об ошибках;
  • -F - отправить данные в виде формы;
  • -G - если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
  • -H - передать заголовки на сервер;
  • -I - получать только HTTP заголовок, а все содержимое страницы игнорировать;
  • -j - прочитать и отправить cookie из файла;
  • -J - удалить заголовок из запроса;
  • -L - принимать и обрабатывать перенаправления;
  • -s - максимальное количество перенаправлений с помощью Location;
  • -o - выводить контент страницы в файл;
  • -O - сохранять контент в файл с именем страницы или файла на сервере;
  • -p - использовать прокси;
  • --proto - указать протокол, который нужно использовать;
  • -R -  сохранять время последнего изменения удаленного файла;
  • -s - выводить минимум информации об ошибках;
  • -S - выводить сообщения об ошибках;
  • -T - загрузить файл на сервер;
  • -v - максимально подробный вывод;
  • -y - минимальная скорость загрузки;
  • -Y - максимальная скорость загрузки;
  • -z - скачать файл, только если он был модифицирован позже указанного времени;
  • -V - вывести версию.

Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать.

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

Загрузка файлов

Самая частая задача - это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

curl https://raw.githubusercontent.com/curl/curl/master/README.md

Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

Если загрузка была неожиданно прервана, вы можете ее возобновить:

curl -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

 

Если нужно, одной командой можно скачать несколько файлов:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Еще одна вещь, которая может быть полезной администратору - это загрузка файла, только если он был изменен:

curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Передача файлов

Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:

curl -T login.txt ftp://speedtest.tele2.net/upload/

Или проверим отправку файла по HTTP, для этого существует специальный сервис:

curl -T ~/login.txt http://posttestserver.com/post.php

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

curl -c cookie.txt http://posttestserver.com/post.php

Затем можно отправить cookie curl обратно:

curl -b cookie.txt http://posttestserver.com/post.php

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

curl -I https://losst.ru

А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

curl -I --header 'If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT' https://losst.ru

Аутентификация curl

Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Точно так же будет выполняться аутентификация на серверах HTTP.

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

curl -x proxysever.test.com:3128 http://google.co.in

Выводы

В этой статье мы рассмотрели как пользоваться curl, зачем нужна эта утилита и основные ее возможности. Несмотря на свою схожесть с wget, они очень сильно отличаются. Команда curl linux предназначена больше для анализа и имитации различных действий на сервере, тогда как wget больше подходит для загрузки файлов и краулинга сайтов.

losst.ru