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

188

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

curl: (77) ошибка установки сертификата проверки местоположения:
  CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: нет

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

moorecats
источник
2
На какой ОС / дистрибутиве вы работаете? Вам следует установить пакет ca-Certificates (так он называется в Debian / Ubuntu).
Игорь
40
Для дальнейшего использования я уже ca-certificatesустановил, но ошибка не исчезла. Проблема заключалась в том, что /etc/ssl/certs/ca-certificates.crtвместо них были расположены мои сертификаты /etc/pki/tls/certs/ca-bundle.crt, поэтому мне просто пришлось установить переменную среды CURL_CA_BUNDLEс правильным путем.
Роберт Смит
13
Прохладно! Это работает для меня, когда я установил export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt.
аккуратный

Ответы:

83

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

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

# apt-get install ca-certificates

В CygWin через Apt-Cyg

# apt-cyg install ca-certificates

В Arch Linux (Raspberry Pi)

# pacman -S ca-certificates

Документация рассказывает:

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

Как видно по адресу: Debian - Подробная информация о пакетах CA-сертификатов в Squeeze

Рубенс Мариуццо
источник
97
CA-Certificates уже самая новая версия, но я все еще получаю сообщение об ошибке
Pastor Bones
2
Конечно, вы получите ту же ошибку, если попытаетесь установить apt-cyg рекомендованным способом, используя curl и raw.github.com .
10
11
В Arch Linux вам также может понадобиться pacman -S ca-certificates-utils. Я сделал.
Марк Граймс
8
Этот пакет уже установлен. Этот ответ не полезен.
JimmyJames
9
@PastorBones У меня была та же проблема, что пакет был уже последним, но я думаю, что он был поврежден, поэтому sudo apt install --reinstall ca-certificatesпереустановил пакет и исправил ошибки, которые я видел
Will
153

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

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

Проблема заключалась в том, что curl ожидал, что сертификат будет в пути, /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:» в сообщении об ошибке.

Скотт Эммонс
источник
31
Вы также можете создать символическую ссылку, ln -sесли не хотите повторять ее каждый раз, когда обновляете.
starbeamrainbowlabs
4
Была такая же проблема для rescuetimeприложения на Fedora 25. sudo ln -s /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-certificates.crtРешил проблему. ( CURL_CA_BUNDLEenv var не работал)
GabLeRoux
На моем убунту это исправили проблему: sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.pem. Я фактически получал, The repository ... does not have a Release fileчто было вызвано отсутствующим сертификатом ( Could not load certificates from ...).
Marinos
84

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

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

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

Евгений Якимович
источник
8
Спасибо за предоставленный метод, который не требует, чтобы я копировал системные файлы вручную, но при этом сохраняет безопасность использования сертификатов!
Стивен Джонсон
Спасибо. Это решило мою похожую проблему с pyenv & curl. Я использовал Ubuntu 14.04 и уже установил ca-сертификаты.
Давида
Этот подход также работает с xonsh (добавьте $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"к .xonshrc).
27:00
На всякий случай: версия с одним вкладышем:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew
30

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

cacert=/etc/ssl/certs/ca-certificates.crt
prabeesh
источник
1
лучший ответ, это сработало для меня на Linux Mint 17
Сантьяго
На Mac, он работал со следующими в~/.curlrc cacert=/etc/openssl/cert.pem
amirathi
21

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

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

Например:

$ 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-сертификаты.

10gistic
источник
10
Это может обойти ошибку, но также делает «безопасное» соединение незащищенным.
Тим
1
На самом деле, нет. Насколько я знаю, вы не можете просто обойти шифрование безопасного соединения, поэтому оно все еще зашифровано и отправляется только на одну конечную точку. Кто-то поправит меня, если я ошибаюсь, но единственный риск, с которым вы столкнетесь, заключается в том, что вы можете стать жертвой атаки «человек посередине». Все еще маловероятно риск, если вы используете curl.
10
18
Да, действительно. Опция "-k" является сокращением для "--insecure". Если у вас есть посредник, что, по вашему мнению, он делает с вашими данными? Оповещение о спойлере: он расшифровывает его, крадет его и, возможно, модифицирует и внедряет обратно в небезопасный поток. Прямо со страницы руководства: "-k, --insecure (SSL)" Этот параметр явно позволяет curl выполнять "небезопасные" соединения и передачи SSL. Все соединения SSL пытаются сделать безопасными с помощью пакета сертификатов CA, установленного по умолчанию. Это делает все соединения, считающиеся «небезопасными», неудачными, если не используется -k, --insecure ».
Тим
2
Если вам нужен SSL, вам нужны конфиденциальность и проверка - -kфлаг означает, что вы теряете проверку. В зависимости от ваших потребностей это может быть приемлемым. MITM - это нетривиальные атаки, если вы предполагаете, что ваша сеть и сервер, с которым вы общаетесь, защищены от посторонних (вы можете сделать такое предположение?). Риск возрастает в зависимости от типа ваших данных (исходный код и сертификаты более рискованны, чем изображения). Вы можете проверить целостность данных после передачи (контрольные суммы и т. Д.), Но теперь вы переключаете свое доверие на этот канал контрольной суммы. В конце концов, -kвы получите немного больше работы.
Марк Фокс
Значит ли это, что если я использую самоподписанный сертификат. Я должен использовать опцию -k. Как это может быть невозможно проверить самоподписанный сертификат?
Линус
15

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

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

  1. Переименуйте бинарный файл Anaconda curl :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. ИЛИ удалить Anaconda локон
    conda remove curl

$ which curl /usr/bin/curl

[0] Anaconda Ubuntu curl Github выпуск https://github.com/conda/conda-recipes/issues/352

Харша Манджунатх
источник
Хорошая находка, я не знала, что Анаконда крала мой приоритет. Это сработало, как только я заменил curlна полный путь/usr/bin/curl
jxramos
Это очень помогло! Спасибо.
Шабабб Карим
12

От $ 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.
Пурначандар Рао Волети
источник
7

Для 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 (я не смог заставить работать curl.capath) , Я также обнаружил, что CAbundle на сайте cURL недостаточно для удаленного сайта, к которому я подключался, поэтому использовал тот, который указан с предварительно скомпилированной версией Windows curl 7.47.1 на http://winampplugins.co.uk / ротор /

LJT
источник
В Windows вы также можете просто добавить «xampp» перед php следующим образом: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Райан Стейн
7

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

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

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

Это было очень неприятно узнать, так как моя 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 
ShrimpPhaser
источник
6

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

sudo apt-get install ca-certificates

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

sudo cd /etc/ssl/certs

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

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

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

Кваме Йебоа
источник
1
Я попробовал это, но это не сработало для меня, и я все еще получаю ту же ошибку. Любые идеи ?
Anirudh
6

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

echo insecure >> ~/.curlrc
Пабло Р. Мьер
источник
1
Обходной путь, но он помогает мне после слишком много времени с сертификатами curl. Спасибо.
К. Гол
4

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

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

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

например

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

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

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

Даниэль Стенберг
источник
3

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

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

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

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

а затем скопируйте и вставьте сертификат в папку назначения, которая отображается в вашей ошибке. Мой был " 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

Исправлена.

Ману РС
источник
Ни один из лучших ответов не сработал для меня, но это сработало!
Прачити Пракаш Прабху
2

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

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

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

Если у кого-то все еще есть проблемы, попробуйте это, у меня получилось. Удалите файлы в вашем /etc/ssl/certs/каталоге, затем переустановите ca-сертификаты:

sudo apt install ca-certificates --reinstall

Сделал это, когда я попытался установить Linuxbrew.

Майкл Энитан
источник
1
Это помогло мне, но я не удалял файлы на моей машине. Просто запустил простую команду и curl начал работать.
Josefhu15
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

Ссылки:

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

У меня та же проблема: я создаю образ докера на альпийской основе, и когда я хочу свернуться на веб-сайт своей организации, появляется эта ошибка. Чтобы решить эту проблему, мне нужно получить сертификат CA моей компании, а затем добавить его в сертификаты CA моего изображения.

Получить сертификат CA

Используйте OpenSSL для получения сертификатов, связанных с сайтом:

openssl s_client -showcerts -servername my.company.website.org -connect my.company.website.org:443

Это выведет что-то вроде:

CONNECTED(00000005)
depth=2 CN = UbisoftRootCA
verify error:num=19:self signed certificate in certificate chain
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... 
-----END CERTIFICATE-----
...

Получите последний сертификат (содержимое между пометками -----BEGIN CERTIFICATE-----и
-----END CERTIFICATE-----включенными) и сохраните его в файл (например, mycompanyRootCA.crt)

Создайте свой имидж

Затем, когда вы создадите свой образ докера из alpine, сделайте следующее:

FROM alpine
RUN apk add ca-certificates curl
COPY mycompanyRootCA.crt  /usr/local/share/ca-certificates/mycompanyRootCA.crt
RUN update-ca-certificates

Ваше изображение теперь будет работать правильно! \ О /

alphayax
источник
1

Просто найдите, что это решение идеально подходит для меня.

echo 'cacert=/etc/ssl/certs/ca-certificates.crt' > ~/.curlrc

Я нашел это решение отсюда

Даниил
источник
0

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

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 сейчас, установите свой rpm:

rpm2cpio your_url_donwload_ca-ceritificated.rpm | cpio -idmv

Теперь перезапустите свой сервис: мой пример этой команды:

sudo service2 httpd restart
Сантос Л. Виктор
источник
0

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

git config --global http.sslverify "false"
J4cK
источник
0

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

curl --remote-name --time-cond cacert.pem \
    https://curl.haxx.se/ca/cacert.pem
Реза Фарши
источник
0

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

тапас талукдер
источник
0

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

Джошуа Дэвис
источник
0

В моем случае /etc/ssl/certs/ca-certificates.crtфайл отсутствовал. Как оказалось, я удалил содержимое /etc/ssl/certsиз Dockerfile при создании образа Docker. После настройки моих команд сценариев / bash команды запускаются из Dockerfile - curl теперь отлично работает из нового контейнера.

Tech Nomad
источник