it-swarm.com.ru

curl: (60) SSL сертификат: невозможно получить сертификат локального эмитента

[email protected]:/home/sclr/certs/FreshCerts# curl --ftp-ssl --verbose ftp://{abc}/ -u trup:trup --cacert /etc/ssl/certs/ca-certificates.crt
* About to connect() to {abc} port 21 (#0)
*   Trying {abc}...
* Connected to {abc} ({abc}) port 21 (#0)
< 220-Cerberus FTP Server - Home Edition
< 220-This is the UNLICENSED Home Edition and may be used for home, personal use only
< 220-Welcome to Cerberus FTP Server
< 220 Created by Cerberus, LLC
> AUTH SSL
< 234 Authentication method accepted
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
150
user3812540

Относится к «проблема с сертификатом SSL: невозможно получить сертификат локального эмитента». Скорее всего, это относится к системе, отправляющей запрос CURL (а не к серверу, получающему запрос)

1) Загрузите последнюю версию cacert.pem с https://curl.haxx.se/ca/cacert.pem

2) Добавьте следующую строку в php.ini (если это общий хостинг, и у вас нет доступа к php.ini, вы можете добавить его в .user.ini в public_html)

curl.cainfo="/path/to/downloaded/cacert.pem"

Убедитесь, что вы заключили путь в двойные кавычки !!!

3) По умолчанию процесс FastCGI будет анализировать новые файлы каждые 300 секунд (при необходимости вы можете изменить частоту, добавив пару файлов, как предлагается здесь https://ss88.uk/blog/fast-cgi-and-user -ini-файлы-новый-htaccess/ )

162
Dahomz

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

Есть два варианта, чтобы заставить это работать:

  1. Используйте cURL с опцией -k, которая позволяет curl устанавливать небезопасные соединения, то есть cURL не проверяет сертификат.

  2. Добавьте корневой CA (CA, подписывающий сертификат сервера) в etc/ssl/certs/ca-certificates.crt

Вам следует использовать вариант 2, так как он обеспечивает подключение к защищенному FTP-серверу.

83
Yuvika

Я решил эту проблему, добавив однострочный код в сценарии cURL:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Предупреждение : Это делает запрос абсолютно небезопасным (см. Ответ @YSU)!

58
Vijay Bhandari

Возникла эта проблема после установки Git Extensions v3.48. Попытался установить mysysgit снова, но та же проблема. В конце пришлось отключить (учтите, пожалуйста, последствия для безопасности!) Проверки Git SSL с помощью:

git config --global http.sslVerify false

но если у вас есть сертификат домена лучше добавить его в (Win7)

C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
18
Riga

В моем случае это была проблема с установкой моего сертификата на службу, которую я пытался использовать с помощью cURL. Мне не удалось связать/объединить промежуточные и корневые сертификаты в мой сертификат домена . Сначала не было очевидно, что это была проблема, потому что Chrome разработал ее и принял сертификат, несмотря на то, что пропустил промежуточный и корневой сертификаты.

После связывания сертификата все заработало как положено. Я в комплекте так

$ cat intermediate.crt >> domain.crt

И повторяется для всех промежуточных и корневых сертификатов.

12
Daniel Watrous

Мы столкнулись с этой ошибкой недавно. Оказывается, это было связано с неправильной установкой корневого сертификата в каталоге хранилища ЦС. Я использовал команду curl, где я указывал директорию CA напрямую. curl --cacert /etc/test/server.pem --capath /etc/test ... Эта команда каждый раз терпела неудачу с curl: (60) Проблема с сертификатом SSL: не удалось получить сертификат локального эмитента.  

После использования strace curl ... было определено, что curl ищет корневой файл сертификата с именем 60ff2731.0, который основан на соглашении об именовании хэшей openssl. Поэтому я нашел эту команду для правильного импорта корневого сертификата: 

ln -s rootcert.pem `openssl x509 -hash -noout -in rootcert.pem`.0

который создает мягкую ссылку 

60ff2731.0 -> rootcert.pem

curl под обложками прочитал сертификат server.pem, определил имя корневого файла сертификата (rootcert.pem), преобразовал его в свое хеш-имя, затем выполнил поиск файла ОС, но не смог его найти. 

Итак, выгода заключается в том, что используйте strace при запуске curl, когда ошибка curl неясна (была огромная помощь), а затем убедитесь, что правильно установили корневой сертификат, используя соглашение об именах openssl.

10
gp-coder

Скорее всего, отсутствует сертификат от сервера.

Root-> средне-> Сервер

Сервер должен отправить Сервер и Промежуточное звено как минимум.

Используйте openssl s_client -showcerts -starttls ftp -crlf -connect abc:21 для устранения проблемы.

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

  1. починить сервер
  2. доверяйте этому сертификату и добавляйте его в свой магазин сертификатов CA (не лучшая идея)
  3. отключить доверие, например curl -k (очень плохая идея)

Если сервер вернул, более одного, но не включая самоподписанный (корневой) сертификат:

  1. установите сертификат CA (root) в вашем магазине CA для этой цепочки, например, гугл эмитент. (ТОЛЬКО, если вы доверяете этому CA)
  2. иметь фиксированный сервер для отправки CA как часть цепочки
  3. доверять сертификату в цепи
  4. отключить доверие

Если сервер вернул сертификат корневого ЦС, то его нет в вашем хранилище ЦС, вы можете выбрать следующие варианты:

  1. Добавить (доверять) это
  2. отключить доверие

Я проигнорировал сертификаты с истекшим сроком действия или отменил, потому что не было сообщений, указывающих на это. Но вы можете проверить сертификаты с openssl x509 -text

Учитывая, что вы подключаетесь к домашней версии ( https://www.cerberusftp.com/support/help/install-a-certificate/ ) ftp-сервера, я скажу, что он самоподписан.

Пожалуйста, опубликуйте больше деталей, например, вывод openssl.

5
Jason Pyeron

Для меня простая установка сертификатов помогла:

Sudo apt-get install ca-certificates
5
Maxim Krušina

На окнах - если вы запускаете из cmd

> curl -X GET "https://some.place"

Загрузите cacert.pem с https://curl.haxx.se/docs/caextract.html

Установите переменную среды:

CURL_CA_BUNDLE = C:\Program Files\curl-7.57.0\src\cacert.pem

и перезагрузить среду

refreshenv

Теперь попробуйте еще раз

Причина возникновения проблемы: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate/replies/95548

1
RaSor

Мой случай был другим. Я размещаю сайт за брандмауэром. Ошибка была вызвана pfSense.

Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|

Я случайно нашел причину, благодаря этот ответ .


Все хорошо, когда я зашел мой сайт из WAN.

Однако когда к сайту обращались изнутри локальной сети (например, когда Wordpress сделал запрос curl на свой собственный сервер, несмотря на использование WAN IP 49.x.x.x), ему была предоставлена ​​страница входа в систему pfSense.

Я идентифицировал сертификат как pfSense webConfigurator Self-Signed Certificate. Не зря curl сгенерировал ошибку.

Причина: Произошло то, что curl использовал WAN IP-адрес сайта 49.x.x.x. Но в контексте веб-сервера IP-адрес WAN был брандмауэром.

Debug: Я обнаружил, что получаю сертификат pfSense.

Решение: На сервере, на котором размещен сайт, укажите собственное доменное имя на 127.0.0.1.

Благодаря применению этого решения запрос curl был надлежащим образом обработан веб-сервером и не переадресован брандмауэру, который ответил отправкой страницы входа.

1
Gene

На окнах у меня была эта проблема. Curl был установлен mysysgit, поэтому загрузка и установка последней версии устранили мою проблему. 

В противном случае это хорошие инструкции о том, как обновить сертификат CA, который вы можете попробовать.

1
Steve

Согласно cURL docs вы также можете передать сертификат в команду curl

Получите сертификат CA, который может проверить удаленный сервер и использовать правильный вариант указать этот сертификат CA для проверки, когда подключения. Для хакеров libcurl: curl_easy_setopt (curl, CURLOPT_CAPATH, capath);

С помощью инструмента командной строки curl: --cacert [file]

Например: 

curl --cacert mycertificate.cer -v https://www.google.com
0
Giorgos Myrianthous

До сих пор я видел эту проблему в корпоративных сетях по двум причинам, одна или обе из которых могут иметь место в вашем случае:

  1. Из-за способа сетевые прокси работают, они имеют свои собственные сертификаты SSL, тем самым изменяя сертификаты, которые видит curl. Многие или большинство корпоративных сетей вынуждают вас использовать эти прокси.
  2. Некоторые антивирусные программы работающие на клиентских ПК также работают аналогично прокси-серверу HTTPS, поэтому они могут сканировать ваш сетевой трафик. Ваша антивирусная программа может иметь возможность отключить эту функцию (если ваши администраторы разрешат ее).

Как примечание № 2 выше, вы можете почувствовать беспокойство по поводу сканирования вашего предположительно безопасного трафика TLS. Это корпоративный мир для вас.

0
rdguam

Да, вам также необходимо добавить сертификат CA. Добавление фрагмента кода в Node.js для четкого просмотра.

var fs = require(fs)
var path = require('path')
var https = require('https')
var port = process.env.PORT || 8080;
var app = express();

https.createServer({
key: fs.readFileSync(path.join(__dirname, './path to your private key/privkey.pem')),
cert: fs.readFileSync(path.join(__dirname, './path to your certificate/cert.pem')),
ca: fs.readFileSync(path.join(__dirname, './path to your CA file/chain.pem'))}, app).listen(port)
0
Ravi Prakash