Как мне работать с сертификатами с использованием cURL при попытке получить доступ к URL-адресу HTTPS?

160

Я получаю следующую ошибку, используя curl:

curl: (77) error setting certificate verify locations:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none

Как установить этот сертификат для проверки местоположения? Благодарю.

  • 2
    На какой ОС / дистрибутиве вы работаете? Вам следует установить пакет ca-Certificates (так он называется в Debian / Ubuntu).
  • 35
    Для дальнейшего использования у меня уже были установлены ca-certificates но ошибка не исчезла. Проблема заключалась в том, что мои сертификаты были расположены в /etc/ssl/certs/ca-certificates.crt вместо /etc/pki/tls/certs/ca-bundle.crt , поэтому мне просто нужно было установить переменную среды CURL_CA_BUNDLE для правильный путь
Показать ещё 2 комментария
Теги:
curl
https

23 ответа

64
Лучший ответ

Эта ошибка связана с отсутствующим пакетом: ca-certificates. Установите его.

В Ubuntu Linux (и аналогичном дистрибутиве):

# apt-get install ca-certificates

В CygWin через Apt-Cyg

# apt-cyg install ca-certificates

В Arch Linux (малина Pi)

# pacman -S ca-certificates

В документации указано:

Этот пакет включает файлы PEM сертификатов CA, позволяющие приложениям на основе SSL проверять подлинность SSL-соединений.

Как видно по адресу: Debian - информация о пакете ca-сертификатов в сжатии

  • 80
    CA-Certificates уже самая новая версия, но я все еще получаю сообщение об ошибке
  • 2
    Конечно, вы получите ту же ошибку, если попытаетесь установить apt-cyg рекомендованным способом, используя curl и raw.github.com .
Показать ещё 8 комментариев
133

У меня также была установлена ​​самая новая версия ca-сертификатов, но все еще получалась ошибка:

curl: (77) error setting certificate verify locations:
  CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none

Проблема заключалась в том, что завиток ожидал, что сертификат находится на пути /etc/pki/tls/certs/ca-bundle.crt, но не смог найти его, потому что он был на пути /etc/ssl/certs/ca-certificates.crt.

Копирование моего сертификата в ожидаемый пункт назначения, запустив

sudo cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

работал у меня. Вам нужно будет создать папки для целевого адресата, если они не существуют, запустив

sudo mkdir -p /etc/pki/tls/certs

При необходимости измените приведенную выше команду, чтобы имя файла назначения соответствовало пути, ожидаемому с помощью curl, т.е. замените /etc/pki/tls/certs/ca-bundle.crt на путь, следующий за "CAfile:" в сообщении об ошибке.

  • 28
    Вы также можете создать символическую ссылку с помощью ln -s если не хотите повторять ее каждый раз, когда обновляете.
  • 4
    У него была rescuetime же проблема для приложения rescuetime на Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crt решила эту проблему. ( CURL_CA_BUNDLE env var не работал)
75

Поместите это в свой .bashrc

# fix CURL certificates path
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

(см. комментарий от Роберта)

  • 8
    Спасибо за предоставленный метод, который не требует от меня взламывать системные файлы вручную, но при этом сохраняет безопасность использования сертификатов!
  • 0
    это сработало для меня
Показать ещё 6 комментариев
27

Создайте файл ~/.curlrc со следующим содержимым

cacert=/etc/ssl/certs/ca-certificates.crt
  • 2
    работает для Ubuntu 14.10
  • 1
    и Ubuntu 14.04
Показать ещё 3 комментария
15

Самый быстрый способ обойти ошибку - добавить опцию -k где-нибудь в вашем запросе на завивание. Этот параметр "позволяет подключаться к SSL-ссылкам без сертификатов". (от curl --help)

Помните, что это может означать, что вы не разговариваете с конечной точкой, о которой вы думаете, поскольку они представляют сертификат, не подписанный CA, которому вы доверяете.

Например:

$ curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg

дал мне следующий ответ об ошибке:

curl: (77) error setting certificate verify locations:
  CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none

Я добавил в -k:

curl -o /usr/bin/apt-cyg https://raw.github.com/cfg/apt-cyg/master/apt-cyg -k

и не появляется сообщение об ошибке. В качестве бонуса теперь у меня установлен apt-cyg. И ca-сертификаты.

  • 9
    Это может обойти ошибку, но также делает «безопасное» соединение незащищенным.
  • 1
    На самом деле, нет. Насколько я знаю, вы не можете просто обойти шифрование безопасного соединения, поэтому оно все еще зашифровано и отправляется только на одну конечную точку. Кто-то поправит меня, если я ошибаюсь, но единственный риск, с которым вы столкнетесь, состоит в том, что вы можете стать жертвой атаки «человек посередине». Все еще маловероятно риск, если вы используете curl.
Показать ещё 5 комментариев
12

@roens - это правильно. Это влияет на всех пользователей Anaconda, с нижеприведенной ошибкой
curl: (77) error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none

Обходной путь заключается в использовании зависания системы по умолчанию и избегать вовлечения с добавленной переменной Anaconda PATH. Вы можете либо

  • Переименуйте двоичный файл curl Anaconda:)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  • ИЛИ удалить завиток Anaconda
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl Проблема Github https://github.com/conda/conda-recipes/issues/352

  • 0
    Хорошая находка, я не осознавал, что Анаконда крала мой приоритет. Это сработало, как только я заменил curl на полный путь /usr/bin/curl
9

От $ man curl:

--cert-type <type>
    (SSL) Tells curl what certificate type the provided  certificate
    is in. PEM, DER and ENG are recognized types.  If not specified,
    PEM is assumed.

    If this option is used several times, the last one will be used.

--cacert <CA certificate>
    (SSL) Tells curl to use the specified certificate file to verify
    the peer. The file may contain  multiple  CA  certificates.  The
    certificate(s)  must be in PEM format. Normally curl is built to
    use a default file for this, so this option is typically used to
    alter that default file.
6

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

echo insecure >> ~/.curlrc
  • 1
    Обходной путь, но он помогает мне после слишком много времени с сертификатами curl. Благодарю.
5

Для PHP-кода, запущенного на XAMPP в Windows, я обнаружил, что мне нужно отредактировать php.ini, чтобы включить ниже

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = curl-ca-bundle.crt

а затем скопируйте в файл https://curl.haxx.se/ca/cacert.pem и переименуйте в curl-ca-bundle.crt и поместите его в путь \xampp (I не смог заставить curl.capath работать). Я также обнаружил, что CAbundle на сайте cURL недостаточно для удаленного сайта, к которому я подключался, поэтому использовал тот, который указан с предварительно скомпилированной версией Windows curl 7.47.1 на http://winampplugins.co.uk/curl/

  • 0
    В Windows вы также можете просто добавить «xampp» перед php следующим образом: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
5

Это сработало для меня

sudo apt-get install ca-certificates

затем перейдите в папку сертификатов в

sudo cd /etc/ssl/certs

то вы скопируете файл ca-certificates.crt в /etc/pki/tls/certs

sudo cp ca-certificates.crt /etc/pki/tls/certs

если нет папки tls/certs: создайте ее и измените разрешения с помощью chmod 777 -R folderNAME

  • 1
    Я попробовал это, но это не сработало для меня, и я все еще получаю ту же ошибку. Есть идеи ?
4

Кажется, ваши завитки указывают на несуществующий файл с сертификатами CA или аналогичными.

Для первичной ссылки на сертификаты CA с curl см.: https://curl.haxx.se/docs/sslcerts.html

2

У меня была такая же проблема. Как оказалось, мой файл /etc/ssl/certs/ca-certificates.crt искажен. Последняя запись показала что-то вроде этого:

-----BEGIN CERTIFICATE-----
MIIEDTCCAvWgAwIBAgIJAN..lots of certificate text....AwIBAgIJAN-----END CERTIFICATE-----

После добавления новой строки перед -----END CERTIFICATE----- завиток мог обрабатывать файл сертификатов.

Это было очень неприятно, потому что моя команда update-ca-certificates не давала мне предупреждения.

Это может быть или не быть проблемой, зависящей от версии curl, поэтому вот моя версия, просто для полноты:

curl --version
# curl 7.51.0 (x86_64-alpine-linux-musl) libcurl/7.51.0 OpenSSL/1.0.2j zlib/1.2.8 libssh2/1.7.0
# Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
# Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 
  • 0
    у меня работает update-ca-trust (на Arch).
2

Для того, что стоит, проверка выполнения which curl также значительна.

Пользователь на общей машине, которую я поддерживаю, получал эту ошибку. Но причиной оказалось то, что они установили Anaconda (http://continuum.io). Для этого ставим бинарный путь Anaconda до стандартного $PATH, и он поставляется со своим собственным бинарником curl, у которого возникли проблемы с поиском сертификатов по умолчанию, установленных на этой машине Ubuntu.

  • 1
    Я рекомендую проверить, which -a curl чтобы увидеть все доступное, и, конечно, отметить, какой из них стоит сверху.
2

curl выполняет проверку сертификата SSL по умолчанию, используя "bundle"  Certificate Authority (CA) открытых ключей (сертификатов CA). По умолчанию  пучок называется curl-ca-bundle.crt; вы можете указать альтернативный файл  используя опцию --cacert.

Если этот сервер HTTPS использует сертификат, подписанный ЦС, представленный в  пакет, проверка сертификата, вероятно, не удалась из-за  проблема с сертификатом (может истек или имя может  не соответствует доменному имени в URL-адресе).

Если вы хотите отключить проверку верности сертификата, используйте  параметр -k (или --insecure).

например

curl --insecure http://........
  • 3
    Кроме того, «доверие к источнику» здесь не имеет значения, поскольку без надлежащей проверки сертификата в отношении CA вы не представляете, кто является «источником».
1

Если вы используете homebrew на macOS или linuxbrew в linux, попробуйте переустановить openssl и curl выполнив следующие действия на этой странице.

Это сообщение об ошибке указывает на то, что curl не может установить безопасное соединение с использованием openssl. Переустановка openssl должна решить проблему. Чтобы временно использовать небезопасное соединение для curl и git для загрузки любых необходимых файлов, выполните:

echo insecure >> ~/.curlrc
git config --global http.sslVerify false

Затем установите или переустановите openssl и curl:

HOMEBREW_CURLRC=1 brew reinstall openssl curl

Наконец, отмените изменения безопасности, чтобы curl и git снова использовали безопасные соединения:

sed -i '/^insecure$/d' ~/.curlrc
git config --global http.sslVerify true

Возможно, вам придется запустить новый сеанс оболочки, чтобы проверить результат с

curl -v https://github.com # or any other https urls.

Если в выводе показывается следующий вывод, проблема должна быть решена!

* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
    CApath: /usr/local/etc/openssl/certs

Рекомендации:

  • 0
    После нескольких часов попыток. Это спасло меня. Правильное решение для Macos, наконец. Большое спасибо! :)
1

Запустите следующую команду в git bash, которая отлично работает для меня

git config --global http.sslverify "false"
0

У меня была эта проблема, и оказалось, что моя версия CURL не может анализировать закодированные DER сертификаты (и не обращала внимания на параметр --cert-type). Когда я конвертировал сертификат в формат PEM, он работал.

0

Просто создайте папки, которых нет в вашей системе..

/И т.д./ИПК /TLS/сертификаты/

и создайте файл, используя следующую команду,

sudo apt-get установить ca-сертификаты

а затем скопируйте и вставьте сертификат в папку назначения, которая отображается в вашей ошибке. with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in " with message 'error setting certificate verify locations: CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none' in убедитесь, что вы вставили файл в точное место, указанное в ошибке. Используйте следующую команду для копирования вставки.

sudo cp/etc/ssl/certs/ca-certificates.crt/etc/pki/tls/certs/ca-bundle.crt

Исправлена.

0

Ниже описываются шаги, чтобы исправить проблемы.
1. Узнайте, что файл существует по определенному URL.
2. Если нет, то загрузите файл с URL. https://curl.haxx.se/ca/cacert.pem
3. Скопируйте и вставьте файл в файл по указанному пути в файле php.ini.
4. Перезапустите сервис apache.

0

Я нашел это исправление простым и безопасным. Это просто включает изменение пути двух значений в файле php.ini. Следуйте инструкциям здесь: https://ourcodeworld.com/articles/read/196/xampp-wampp-php-ssl-certificate-error-unable-to-get-local-issuer-certificate

0

Это исправлено для меня:

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem
0

У меня такая же проблема.

Это была моя ошибка

  error setting ce                                                                     
  rtificate verify locations:
  CAfile: D:/git_repo/mingw32/ssl/certs/ca-bundle.crt
  CApath: none

Он отлично работает для меня

Я переименую имя установочного каталога git в git_repo ".

0

Ошибка связана с повреждением или отсутствием файлов сертификатов цепочки SSL в каталоге PKI. Вам нужно убедиться, что файлы ca-bundle, следуя шагам: В консоли/терминале:

mkdir /usr/src/ca-certificates && cd /usr/src/ca-certificates

Введите этот сайт: https://rpmfind.net/linux/rpm2html/search.php?query=ca-certificates, получите свой сертификат ca, для SO. Скопируйте URL-адрес для загрузки и вставки URL-адреса:   wget your_url_donwload_ca-ceritificated.rpm теперь установите yout rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

теперь перезапустите службу: мой пример этой команды:

sudo service2 httpd restart

Ещё вопросы

Сообщество Overcoder
Наверх
Меню