Как исправить curl: (60) SSL-сертификат: неверная цепочка сертификатов при использовании sudo

12

Таким образом, поскольку у обновления Mavericks есть больше проблем с сертификатами.

При попытке свернуть файл с моего веб-сервера с помощью его самозаверяющего сертификата он получал сообщение об ошибке «Сертификат SSL: недопустимая цепочка сертификатов».

Это было исправлено путем добавления сертификата в мою системную цепочку для ключей и установки его для разрешения SSL, информация, которую я нашел здесь и здесь .

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

Однако, если я запускаю curl с помощью sudo (например, у меня есть скрипт, который нужно запустить с помощью sudo и выполняет в нем curl), то я возвращаюсь к тому же сообщению об ошибке.

Я предполагаю, что root не читает из системной цепочки для ключей, возможно?

Кто-нибудь знает способ это исправить?

Джейкоб Томлинсон
источник

Ответы:

17

если вы храните сертификаты CA в файловой системе (в формате PEM), вы можете указать curl использовать их с

sudo curl --cacert /path/to/cacert.pem ...

Вы также можете отключить проверку сертификата с помощью

sudo curl --insecure ...

Изменить: Обновлено с учетом обратной связи

Если вы хотите установить это навсегда, вы должны создать .curlrcфайлы и поместить их в свой домашний каталог. sudoКоманды могут нуждаться в этом файле в /var/root. Файл принимает те же параметры, что и командная строка, но без тире. Один вариант в строке:

cacert=/path/to/my/certs.pem
Дэн
источник
Спасибо за ваш ответ, скрипт, который запускается с помощью sudo, от стороннего производителя, поэтому я не могу изменить саму команду curl. Небезопасно не совсем вариант. Можно ли это сделать глобально?
Джейкоб Томлинсон
Вы можете создать файл .curlrc и сохранить его в своей домашней папке, хотя для использования sudo может потребоваться /var/root/.curlrc. Файл должен содержать параметры без тире, по одному на строку. Так что "cacert = / path / to / my / certs.pem"
Дан
1
+1 за настройку root-доступно .curlrcвместо --insecure. Что именно так и сказано - для злоумышленника, находящегося в сетевой позиции, сделать это было бы тривиально для MITM и внедрить код.
зигг
Спасибо за это, звучит как то, что я ищу. Я попробую завтра и награду, если это сработает.
Джейкоб Томлинсон
6

Root не читает из текущих настроек доверия пользователя, но есть как настройки доверия администратора, так и настройки доверия пользователя root. (Они также отличаются от настроек доверия системы .) Также обратите внимание, что настройки доверия сертификата несколько отличаются от простого добавления сертификата в цепочку ключей; Вы можете пометить сертификат как доверенный, не добавляя его полностью. (Точная ситуация здесь мне не ясна, и документы, которые я видел, расплывчаты.)

Вы можете пометить сертификат как доверенный для текущего пользователя как

$ security add-trusted-cert /path/to/cert.pem

но это не помогает с рутом. Решение, как вы можете теперь догадаться, заключается либо в sudoприведенном выше, который затем помечает его как доверенного для пользователя root:

$ sudo security add-trusted-cert /path/to/cert.pem

или использовать -dфлаг, чтобы добавить его в настройки доверия администратора:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X откроет диалоговое окно с паролем, чтобы подтвердить это.)

Любой из последних двух кажется достаточным для sudo curl.

Ссылка: https://developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html

Уэс Кампейн
источник
Как я уже сказал в вопросе, я уже добавил их в системную цепочку для ключей, а также в цепочку для ключей входа в систему.
Джейкоб Томлинсон
Ты действительно попробовал то, что я предложил? Я проверил это точно в ситуации, которую вы описываете, и это сработало. Я не понимаю всех деталей - документация нечеткая - но вы должны знать, что настройки доверия сертификатов НЕ совсем синонимичны с простым добавлением сертификата в цепочку для ключей, и что настройки доверия сертификата администратора существуют отдельно от системы и пользовательские настройки / брелки. (Похоже, в миксе также есть набор пользовательских настроек пользователя root). Я отредактировал свой ответ, чтобы прояснить этот момент. Пожалуйста, попробуйте это решение.
Wes Campaigne
Да, я попробовал это решение, когда вы впервые опубликовали его. Сертификаты находятся в системной цепочке для ключей и установлены как доверенные. Все еще не повезло.
Джейкоб Томлинсон
5

Это действительно в выходной подсказке:

echo insecure >> ~/.curlrc

Преимущество использования вышеуказанного решения заключается в том, что оно работает для всех curlкоманд, но это не рекомендуется, поскольку оно может вводить атаки MITM при подключении к незащищенным и ненадежным хостам.

Кованые изделия
источник
2

Если вы используете MacPorts (и третья сторона сценарий вы упомянули не удаляет его из $PATHили вызовов /usr/bin/curl) вы можете установить certsyncи curlпорты в этом порядке.

certsyncэто инструмент и соответствующий список launchd, который будет экспортировать вашу системную цепочку для ключей $prefix/etc/openssl/cert.pemи установить символическую ссылку, $prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pemчтобы MacPorts curl автоматически брал сертификаты. certsyncтакже автоматически обновит сгенерированные файлы при изменении системной цепочки для ключей.

neverpanic
источник
Спасибо за это, я хотел бы по возможности избегать использования MacPorts.
Джейкоб Томлинсон
0

Документация, которую вы ищете, находится здесь. В нем объясняется, как использовать cURL на Mavericks и как предоставлять ваши сертификаты: http://curl.haxx.se/mail/archive-2013-10/0036.html

Фабиан Фрэнк
источник
-1

Чтобы заставить sudo curlработать (на OSX Sierra), нам пришлось импортировать сертификат в System.keychainи доверять ему там. Это можно сделать вручную в приложении Keychain или с помощью этой команды:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

Было важно как указать, так -dи вручную установить путь к системной цепочке -kдля ключей, чтобы убедиться, что сертификат действительно импортируется туда, если это еще не сделано.

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

Александр Климетчек
источник
Я получаю ошибкуSecCertificateCreateFromData: Unknown format in import.
rraallvv
Кто бы не проголосовал, пожалуйста, знайте, что я четко написал "на OSX Sierra", и это было для нас рабочим решением. Если он не работает в более новых версиях OSX, это может быть связано с изменением поддержки или инструментов OSX. Или проблема, подобная предыдущему комментарию, когда входной файл не в поддерживаемом формате (вопрос не указывает это).
Александр Климетчек