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 verification of the certificate, use
 the -k (or --insecure) option.

Ответ 1

Относится к "проблема с сертификатом 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 -files-the-new-htaccess/)

Ответ 2

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

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

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

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

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

Ответ 3

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

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

Ответ 4

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

git config --global http.sslVerify false

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

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

Ответ 5

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

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

$ cat intermediate.crt >> domain.crt

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

Ответ 6

Недавно мы столкнулись с этой ошибкой. Оказывается, это связано с тем, что корневой сертификат не установлен в каталоге хранилища CA должным образом. Я использовал команду 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, под обложками считывает cert.pem cert, определяет имя корневого файла cert (rootcert.pem), преобразовывает его в свое хеш-имя, затем выполняет поиск файла ОС, но не может его найти.

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

Ответ 7

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 8

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

sudo apt-get install ca-certificates

Ответ 9

В соответствии с документацией cURL вы также можете передать сертификат команде curl:

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

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

Например:

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

Ответ 10

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

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

Ответ 11

Да, вам также нужно добавить сертификат 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)

Ответ 12

В окнах - если вы запускаете из 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

Ответ 13

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

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

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


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

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

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

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

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

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

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

Ответ 14

-k

(SSL) Этот параметр явно разрешает завиток выполнять "небезопасный" SSL соединения и передачи. Начиная с curl 7.10, все SSL соединения будут пытаться быть безопасными, используя CA комплект сертификатов, установленный по умолчанию. Это делает все соединения считается "небезопасным" для отказа, если используется -k/- insecure.

man.cx/curl

Ответ 15

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

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

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

Ответ 16

Была эта проблема, и она не была решена с более новой версией. У /etc/certs был корневой сертификат, браузер сказал, что все в порядке. После некоторого тестирования я получил от ssllabs.com предупреждение о том, что моя цепочка не завершена (действительно, это была цепочка для старого сертификата, а не для нового). После исправления цепочки сертификатов все было хорошо, даже с локонами.

Ответ 17

Специально для пользователей Windows, использующих curl-7.57.0-win64-mingw или аналогичную версию.

Это немного поздно, и существующие ответы верны. Но мне все же пришлось немного потрудиться, чтобы заставить его работать на моей машине с Windows, хотя процесс на самом деле довольно прост. Итак, делимся пошаговым процессом.

Эта ошибка в основном означает, что curl не может проверить сертификат целевого URI. Если вы доверяете издателю сертификата (CA), вы можете добавить его в список доверенных сертификатов.

Для этого просмотрите URI (например, в Chrome) и выполните шаги

  1. Щелкните правой кнопкой мыши значок безопасного замка
  2. Нажмите на сертификат, откроется окно с информацией о сертификате
  3. Перейдите на вкладку "Путь сертификации"
  4. Нажмите ROOT сертификат
  5. Нажмите View Certificate, откроется другое окно сертификата.
  6. Перейти на вкладку Подробности
  7. Нажмите кнопку "Копировать в файл", откроется мастер экспорта
  8. Нажмите кнопку "Далее
  9. Выберите "X.509 (.CER) в кодировке Base-64"
  10. Нажмите кнопку "Далее
  11. Дайте понятное имя, например, "MyDomainX.cer" (перейдите к нужному каталогу)
  12. Нажмите кнопку "Далее
  13. Нажмите Finish, он сохранит файл сертификата
  14. Теперь откройте этот файл .cer и скопируйте его содержимое (включая -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----)
  15. Теперь перейдите в каталог, где сохранен curl.exe например, C:\SomeFolder\curl-7.57.0-win64-mingw\bin
  16. Откройте файл curl-ca-bundle.crt в текстовом редакторе.
  17. Добавьте скопированный текст сертификата в конец файла. Сохранить

Теперь ваша команда должна хорошо выполняться в curl.

Ответ 18

это может помочь вам для жрет:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

проверено на жрет/жрет 3. *

Ответ 19

Простое решение: IN ~/.sdkman/etc/config, измените sdkman_insecure_ssl=true

Шаги:
nano ~/.sdkman/etc/config
измените sdkman_insecure_ssl=false на sdkman_insecure_ssl=true
сохранить и выйти