Як мені працювати з сертифікатами, використовуючи cURL, намагаючись отримати доступ до URL-адреси HTTPS?


188

Я отримую таку помилку за допомогою curl:

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

Як встановити цей сертифікат для підтвердження місцезнаходження? Дякую.


2
На якій ОС / дистрибутиві ви працюєте? Вам слід встановити пакет ca-сертифікатів (саме так він називається в debian / ubuntu).
igorw

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-сертифікатів у стисканні


97
ca-сертифікати - це вже найновіша версія, але я все ще отримую помилку
Пастор Кости

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перевстановив пакет і усунув помилки, які я бачив
буде

153

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

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

Якщо потрібно, змініть вищевказану команду, щоб ім'я цільового файлу відповідало шляху, очікуваному завитком, тобто замініть /etc/pki/tls/certs/ca-bundle.crtна шлях, який слід у вашому повідомленні "CAfile:".


31
Ви також можете створити символічне посилання, ln -sякщо не хочете повторно копіювати його щоразу, коли ви його оновлюєте.
starbeamrainbowlabs

4
У програмі rescuetimeFedora 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 ...).
Марінос

84

Покладіть це у своє .bashrc

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

(див. коментар від Роберта)


8
Дякуємо, що надали метод, який не вимагає від мене системного файлу вручну, але все-таки зберігає безпеку використання сертифікатів!
Стівен Джонсон

Дякую. Це вирішило мою подібну проблему з pyenv & curl. Я використовував Ubuntu 14.04 і вже мав встановлені ca-сертифікати.
davidA

Цей підхід також працює з xonsh (додати $CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"до .xonshrc).
m00am

Про всяк випадок: Один варіант цього вкладиша:CURL_CA_BUNDLE=/path/to/bundle.crt curl http://example.com
jmathew

30

Створіть файл ~/.curlrcіз наступним вмістом

cacert=/etc/ssl/certs/ca-certificates.crt

1
найкраща відповідь, це працювало для мене на Linux Mint 17
Сантьяго

На Mac він працював з наступним в~/.curlrc cacert=/etc/openssl/cert.pem
amirathi

21

Найшвидший спосіб подолати помилку - додати в опцію -k десь у вашому запиті на вигин. Ця опція "дозволяє з'єднання з цитатами SSL без certs." (від 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-сертифікати.


10
Це може уникнути помилки, але це також робить "безпечне" з'єднання небезпечним.
Тім

1
Не зовсім. Наскільки я знаю, ви не можете просто обійти шифрування захищеного з'єднання, тому воно все ще зашифроване і збирається лише до однієї кінцевої точки. Хтось мене виправить, якщо я помиляюся, але єдиний ризик, який ти побіжиш - це те, що ти можеш стати здобиччю атаки чоловіка в середині. Все ще не існує ризику, якщо ви використовуєте curl.
10гіст

18
Так, насправді. Варіант "-k" є скороченим для "- незахищеним". Якщо у вас є людина в середині, що ви думаєте, що він робить з вашими даними? Попередження спойлера: він розшифровує його, викрадає його і, можливо, модифікує його та вводить назад у незахищений потік. Прямо зі сторінки man: "-k, --insecure (SSL) Ця опція явно дозволяє curl виконувати" незахищені "SSL-з'єднання та передачі. Усі SSL-з'єднання намагаються зробити захищеними за допомогою пакета сертифікатів CA, встановленого за замовчуванням. Це робить усі з'єднання, які вважаються "небезпечними", невдало, якщо не використовується -k, - незахищеність. "
Тім

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 :)
    mv /path/to/anaconda/bin/curl /path/to/anaconda/bin/curl_anaconda

  2. АБО видаліть завиток Анаконда
    conda remove curl

$ which curl /usr/bin/curl

[0] Анаконда Ubuntu curl випуск Github https://github.com/conda/conda-recipes/isissue/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 path (я не зміг заставити curl.capath працювати) . Я також виявив, що CAbundle на сайті cURL був недостатній для віддаленого сайту, до якого я підключався, тому використовував той, який вказаний за попередньо складеною версією Windows curl 7.47.1 за адресою http://winampplugins.co.uk / завиток /


У Windows ви також можете просто додати "xampp" перед php, як-от так: curl.cainfo = "C: \ xampp \ php \ extras \ cacert.pem"
Ryan Steyn

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 

6

Це працювало для мене

sudo apt-get install ca-certificates

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

sudo cd /etc/ssl/certs

потім ви копіюєте файл ca-certifikat.crt у /etc/pki/tls/certs

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

якщо немає папки tls / certs: створіть її та змініть дозволи, використовуючи папку chmod 777 -RNAME


1
Я спробував це, але це не спрацювало для мене, і я все одно отримую ту ж помилку. Будь-які ідеї?
Аніруд

6

Іншою альтернативою для вирішення цієї проблеми є відключення перевірки сертифікату:

echo insecure >> ~/.curlrc

1
Обхід, але це допомагає мені після занадто багато часу з сертифікатами на вигин. Дякую.
К. Гол

4

curl виконує SSLперевірку сертифікатів за замовчуванням, використовуючи "розшарування" Certificate Authority (CA)відкритих ключів (CA certs). Типовий пакет називається curl-ca-bundle.crt; Ви можете вказати альтернативний файл за допомогою параметра --cacert.

Якщо цей HTTPSсервер використовує сертифікат, підписаний CA, представленим у пакеті, перевірка сертифікату, ймовірно, не вдалася через проблему з сертифікатом (він може закінчитися, або ім'я може не відповідати доменному імені в URL).

Якщо ви хочете вимкнути перевірку сертифікату curl, скористайтеся --insecureопцією -k (або ).

наприклад

curl --insecure http://........

3
Тільки осторонь, що "довіряти джерелу" тут неактуально, оскільки без належної перевірки сертифіката щодо ЦА ви не маєте поняття, хто "джерело".
Джефф Аллен


3

Просто створіть папки, яких немає у вашій системі ..

/ etc / pki / tls / certs /

і створити файл за допомогою наступної команди,

sudo apt-get install 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-certificate.crt /etc/pki/tls/certs/ca-bundle.crt

Виправлено.


Жоден із найкращих відповідей не працював для мене, але це було!
Прачіті Пракаш Прабху

2

Для того, що варто, перевірка which curlтакож ведеться дуже важливо.

Користувач на спільній машині, яку я підтримую, отримував цю помилку. Але причина виявилася тому, що вони встановили Anaconda ( http://continuum.io ). Це поклало двійковий шлях Анаконди перед стандартом $PATH, і він приходить зі своїм власним curlдовічним, який мав проблеми з пошуком сертифікатів за замовчуванням , які були встановлені на цій машині Ubuntu.


1
Рекомендую перевірити, which -a curlщоб побачити все, що є в наявності, і звичайно зазначити, хто з них зверху.
jxramos

2

Якщо у когось все-таки виникають проблеми, спробуйте це, це спрацювало на мене. Видаліть файли у своєму /etc/ssl/certs/каталозі та перевстановіть ca-сертифікати:

sudo apt install ca-certificates --reinstall

Це робив, коли я спробував встановити Linuxbrew.


1
Це допомогло мені, але я не видалив файли на своїй машині. Просто запустив просту команду і завиток почав працювати.
Йозеф15

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)

Побудуйте свій образ

Потім, коли ви будете будувати своє зображення докера з альпійського, виконайте наступне:

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

Тепер ваше зображення буде працювати належним чином! \ o /


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-сертифікати , отримайте свій сертифікат 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

0

Виконайте наступну команду в git bash, яка добре працює для мене

git config --global http.sslverify "false"



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 під час створення зображення докера. Після коригування моїх скриптів оболонок / команд bash виконуються з Dockerfile - curl працює ідеально з нового контейнера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.