curl: (60) SSL-сертификат: невозможно получить сертификат локального эмитента
root@sclrdev:/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's verification of the certificate, use
the -k (or --insecure) option.
39 ответов
Сбой, так как cURL не может проверить сертификат, предоставленный сервером.
Есть два варианта, чтобы заставить это работать:
Используйте cURL с
-k
опция, которая позволяет curl устанавливать небезопасные соединения, то есть cURL не проверяет сертификат.Добавьте корневой CA (CA, подписывающий сертификат сервера) в
etc/ssl/certs/ca-certificates.crt
Вы должны использовать опцию 2, так как она обеспечивает соединение с защищенным FTP-сервером.
Относится к "проблема с сертификатом 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/)
Я решил эту проблему, добавив однострочный код в сценарии cURL:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Предупреждение: это делает запрос абсолютно небезопасным (см. Ответ @YSU)!
Для меня простая установка сертификатов помогла:
sudo apt-get install ca-certificates
В моем случае это была проблема с установкой моего сертификата на службу, которую я пытался использовать с помощью cURL. Мне не удалось связать / объединить промежуточные и корневые сертификаты в мой сертификат домена. Сначала было неочевидно, что это была проблема, потому что Chrome разработал и принял сертификат, несмотря на то, что пропустил промежуточный и корневой сертификаты.
После связывания сертификата все заработало как положено. Я в комплекте так
$ cat intermediate.crt >> domain.crt
И повторяется для всех промежуточных и корневых сертификатов.
Возникла эта проблема после установки Git Extensions v3.48. Попытался установить mysysgit снова, но та же проблема. В конце пришлось отключить (учтите, пожалуйста, последствия для безопасности!) Проверки Git SSL с помощью:
git config --global http.sslVerify false
но если у вас есть сертификат домена лучше добавить его в (Win7)
C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
Скорее всего, отсутствует сертификат от сервера.
Root-> средне-> Сервер
Сервер должен отправить Сервер и Промежуточное звено как минимум.
использование openssl s_client -showcerts -starttls ftp -crlf -connect abc:21
отладить проблему.
Если возвращается только один сертификат (либо самоподписанный, либо выданный), вы должны выбрать:
- починить сервер
- доверяйте этому сертификату и добавляйте его в свой магазин сертификатов CA (не лучшая идея)
- отключить доверие, например
curl -k
(очень плохая идея)
Если сервер вернулся, более одного, но не включая самоподписанный (корневой) сертификат:
- установите CA (корневой) сертификат в вашем магазине CA для этой цепочки, например, Google, эмитент. (ТОЛЬКО если вы доверяете этому CA)
- иметь фиксированный сервер для отправки CA как часть цепочки
- доверять сертификату в цепи
- отключить доверие
Если сервер вернул сертификат корневого ЦС, то его нет в вашем хранилище ЦС, вы можете выбрать следующие варианты:
- Добавить (доверять) это
- отключить доверие
Я проигнорировал просроченные / отозванные сертификаты, потому что не было сообщений, указывающих на это. Но вы можете проверить сертификаты с openssl x509 -text
Учитывая, что вы подключаетесь к домашней версии ( https://www.cerberusftp.com/support/help/installing-a-certificate/) ftp-сервера, я скажу, что он самоподписан.
Пожалуйста, опубликуйте больше деталей, например, вывод openssl.
Мы столкнулись с этой ошибкой недавно. Оказывается, это было связано с неправильной установкой корневого сертификата в каталоге хранилища 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 под обложками прочитал сертификат server.pem, определил имя корневого файла сертификата (rootcert.pem), преобразовал его в свое хеш-имя, затем выполнил поиск файла ОС, но не смог его найти.
Итак, выгода заключается в том, что используйте strace при запуске curl, когда ошибка curl неясна (была огромная помощь), а затем убедитесь, что правильно установили корневой сертификат, используя соглашение об именах openssl.
Достаточно просто обновить список сертификатов.
sudo update-ca-certificates -f
update-ca-Certificates - это программа, которая обновляет каталог /etc/ssl/certs для хранения сертификатов SSL и генерирует ca-Certific.crt, объединенный однофайловый список сертификатов.
Загрузите https://curl.haxx.se/ca/cacert.pem
После загрузки переместите этот файл на ваш wamp-сервер.
Для exp: D:\wamp\bin\php\
Затем добавьте следующую строку в файл php.ini внизу.
curl.cainfo= "D: \ wamp \ bin \ php \ cacert.pem"
- Теперь перезапустите ваш Wamp-сервер.
Я тоже столкнулся с этой проблемой. Я прочитал эту ветку, и большинство ответов информативны, но для меня слишком сложны. У меня нет опыта в сетевых темах, поэтому этот ответ для таких людей, как я.
В моем случае эта ошибка возникла из-за того, что я не включил промежуточный и корневой сертификаты рядом с сертификатом, который я использовал в своем приложении.
Вот что я получил от поставщика сертификатов SSL:
- abc.crt
- abc.pem
- abc-bunde.crt
в abc.crt
файл был только один сертификат:
-----BEGIN CERTIFICATE-----
/*certificate content here*/
-----END CERTIFICATE-----
Если бы я предоставил его в этом формате, браузер не отображал бы никаких ошибок (Firefox), но я бы получил curl: (60) SSL certificate : unable to get local issuer certificate
ошибка, когда я сделал запрос на завиток.
Чтобы исправить эту ошибку, проверьте свой abc-bunde.crt
файл. Скорее всего, вы увидите что-то вроде этого:
-----BEGIN CERTIFICATE-----
/*additional certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*other certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*different certificate content here*/
-----END CERTIFICATE-----
Это ваш промежуточный и корневой сертификаты. Ошибка возникает из-за того, что они отсутствуют в сертификате SSL, который вы предоставляете своему приложению.
Чтобы исправить ошибку, объедините содержимое обоих этих файлов в следующем формате:
-----BEGIN CERTIFICATE-----
/*certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*additional certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*other certificate content here*/
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
/*different certificate content here*/
-----END CERTIFICATE-----
Обратите внимание, что между сертификатами в конце или в начале файла нет пробелов. Как только вы предоставите этот комбинированный сертификат вашему приложению, ваша проблема должна быть исправлена.
Согласно документам cURL, вы также можете передать сертификат curl
команда:
Получите сертификат CA, который может подтвердить удаленный сервер, и используйте соответствующую опцию, чтобы указать этот сертификат CA для проверки при подключении. Для хакеров libcurl: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
С помощью инструмента командной строки curl:
--cacert [file]
Например:
curl --cacert mycertificate.cer -v https://www.google.com
Попробуйте переустановить curl в Ubuntu и обновить мои сертификаты CA с помощью sudo update-ca-certificates --fresh
который обновил сертификаты
Если вы просто хотите протестировать это, передайте --insecure вместе с командой curl, чтобы пропустить проверку.
Моя работала, просто добавляя -k к моему завитку. Не нужно усложнять.
ssl-сертификат Введите эти два кода, чтобы отключить проблему с ssl-сертификатом, он сработал для меня после многих исследований, которые я нашел
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, ложь);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, ложь);
Вам нужно изменить сертификат сервера с cert.pem
к fullchain.pem
У меня была такая же проблема с Perl HTTPS Daemon:
я изменил:SSL_cert_file => '/etc/letsencrypt/live/mydomain/cert.pem'
кому:SSL_cert_file => '/etc/letsencrypt/live/mydomain/fullchain.pem'
Да, вам также необходимо добавить сертификат 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)
На окнах у меня была эта проблема. Curl был установлен mysysgit, поэтому загрузка и установка последней версии устранили мою проблему.
В противном случае это хорошие инструкции по обновлению сертификата CA, которые вы можете попробовать.
Мой случай был другим. Я размещаю сайт за брандмауэром. Ошибка была вызвана pfSense.
Network layout: |Web Server 10.x.x.x| <-> |pfSense 49.x.x.x| <-> |Open Internet|
Я случайно нашел причину, благодаря этому ответу.
Все хорошо, когда я зашел на свой сайт из WAN.
Тем не менее, когда сайт был доступен из локальной сети (например, когда Wordpress сделал curl
запрос к собственному серверу, несмотря на использование WAN IP 49.x.x.x
), он обслуживался страницей входа в систему pfSense.
Я идентифицировал сертификат как pfSense webConfigurator Self-Signed Certificate
, Неудивительно curl
скинул ошибку.
Причина: случилось то, что curl
использовал WAN IP-адрес сайта 49.x.x.x
, Но в контексте веб-сервера IP WAN был межсетевым экраном.
Отладка: я обнаружил, что получаю сертификат pfSense.
Решение. На сервере, на котором размещен сайт, укажите собственное доменное имя на 127.0.0.1.
Применяя решение, curl
Запрос был правильно обработан веб-сервером и не переадресован брандмауэру, который ответил отправкой страницы входа.
Я собирался прокомментировать ответ Ювика, но мне не хватает очков репутации.
Когда вы импортируете файл .crt в
/usr/share/local/ca-certificates
, он должен быть в правильном формате. Некоторые из них были упомянуты ранее, но никто не упомянул о необходимости только символа новой строки, и никто не собрал контрольный список, поэтому я подумал, что предоставлю его, пока я на нем.
Сертификат должен заканчиваться на
.crt
. От страницы человека в Ubuntu :Сертификаты должны иметь расширение .crt, чтобы их можно было включить в update-ca-Certificates.
Файлы сертификатов в
/usr/local/share/ca-certificates
может содержать только один сертификатФайлы сертификатов должны заканчиваться новой строкой.
update-ca-certificates
будет работать, если каждая строка содержит, например, возврат каретки + новую строку (как это стандартно в Windows), но как только сертификат будет добавлен к/etc/ssl/ca-certificates.crt
, это все равно не сработает. Это конкретное требование укусило меня, поскольку мы загружаем сертификаты из внешнего источника.
Это проблема с хранилищем сертификатов ssh. Вам необходимо загрузить действующий pem-файл сертификата с веб-сайта целевого центра сертификации, а затем создать файл программной ссылки, чтобы указать ssl на доверенный сертификат.
openssl x509 -hash -noout -in DigiCert_Global_Root_G3.pem
ты получишь dd8e9d41
создать ссылку solf с хеш-номером и суффиксом файла с.0 (точка-ноль)
dd8e9d41.0
Затем попробуйте еще раз.
Это может помочь вам для жрет:
$client = new Client(env('API_HOST'));
$client->setSslVerification(false);
проверено на жрет / жрет 3.*
На окнах - если вы запускаете из 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
В некоторых системах эта проблема может возникать из-за среды conda. Если у вас установлена conda, то ее отключение может решить вашу проблему. В моем случае, когда я отключил conda, эта ошибка curl-SSL была решена. В ubuntu или MacOS попробуйте эту команду
conda deactivate
Для меня проблемой стал « веб-щит » антивируса AVG . Отключение веб-экрана в сочетании с решениями, приведенными в других ответах, устранило мою проблему.
Использование опции--trace-ascii
было полезно для отладки:
curl --trace-ascii - https://www.example.com
(с использованием-
в--trace-ascii -
вызывает вывод трассировки на стандартный вывод).
Если AVG вызывает проблемы, вы увидите текст, похожий на
0040: .U.../generated by AVG Antivirus for SSL/TLS scanning1.0...U....
0080: AVG Web/Mail Shield1!
Я несколько дней ломал голову над этой проблемой при установке Wordpress, пытаясь связаться с внутренней службой ElasticSearch через ElasticPress и самозаверяющий корневой ЦС, управляемый AWS ACM PCA.
В моем конкретном случае я получал ответ 200 OK от транспорта cURL по умолчанию, а также ожидаемое тело, но Wordpress возвращался с сообщением
WP_Error
объект, который ElasticPress собирал из-за этой проблемы с сертификатом, но никогда не регистрировал.
Когда дело доходит до Wordpress, стоит отметить две вещи:
- Транспорт cURL по умолчанию для всех вызовов wp_remote_* будет обращаться к CA Bundle, расположенному в . Этот пакет служит в основном той же цели, что и тот, что находится по адресу https://curl.haxx.se/docs/caextract.html , и охватывает большинство вариантов использования, которые обычно не включают более экзотические настройки.
- Порядок действия/фильтра имеет значение в Wordpress, и в случае с ElasticPress многие из его собственных внутренних функций используют эти удаленные вызовы. Проблема в том, что эти удаленные вызовы выполнялись во время
plugins_loaded
жизненного цикла, что слишком рано для логики темы, чтобы иметь возможность переопределить. Если вы используете какие-либо плагины, которые делают внешние вызовы к другим службам, и вам нужно иметь возможность изменять запросы, вы должны внимательно следить за тем, КОГДА эти плагины выполняют эти запросы.
Это означает, что даже с правильной настройкой сервера, хуками, обратными вызовами и логикой, определенными в вашей теме, вы все равно можете получить неработающую настройку, потому что базовые вызовы плагинов выполняются задолго до загрузки вашей темы и никогда не смогут сказать Wordpress о новых сертификатах.
В контексте приложений Wordpress есть только два известных мне способа обойти эту проблему без обновления базовой или сторонней логики кода:
- ( Рекомендуется) Добавьте в установку «Обязательный» подключаемый модуль, который настраивает нужные вам параметры. Плагины MU загружаются первыми в жизненном цикле Wordpress и могут дать вам возможность переопределить ваши плагины и ваше ядро, не изменяя их напрямую. В моем случае я установил простой плагин MU со следующей логикой:
// ep_pre_request_args is an ElasticPress-specific call that we need to adjust for all outbound HTTP requests
add_filter('ep_pre_request_args', function($args){
if($_ENV['ELASTICSEARCH_SSL_PATH'] ?? false) {
$args['sslcertificates'] = $_ENV['ELASTICSEARCH_SSL_PATH'];
}
return $args;
});
- (Не рекомендуется) Если у вас нет других вариантов, вы также можете добавить свой корневой ЦС в
wp-includes/certificates/ca-bundle.crt
. Это, по-видимому, «исправит» основную проблему, и вы получите надлежащую проверку своих SSL-сертификатов, но этот метод будет давать сбой каждый раз, когда вы обновляете Wordpress, если вы не запекаете дополнительную автоматизацию.
Я добавляю этот ответ, потому что я думал, что делаю что-то неправильно или шатко в своей настройке в течение нескольких дней, прежде чем я даже удосужился углубиться в исходный код плагина. Надеюсь, это может сэкономить кому-то время, если они делают что-то подобное.
В Amazon Linux (CentOS / Red Hat и т. Д.) Я сделал следующее, чтобы исправить эту проблему. Сначала скопируйте cacert.pem, загруженный с http://curl.haxx.se/ca/cacert.pem и поместите его в
/etc/pki/ca-trust/source/anchors/
каталог. Затем запустите
update-ca-trust
команда.
Вот один лайнер, взятый из https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat
curl https://curl.se/ca/cacert.pem -o /etc/pki/ca-trust/source/anchors/curl-cacert-updated.pem && update-ca-trust
Однако, поскольку curl был сломан, я фактически использовал эту команду для загрузки файла cacert.pem.
wget --no-check-certificate http://curl.haxx.se/ca/cacert.pem
Также, если у вас возникли проблемы с php, вам может потребоваться перезагрузить веб-сервер.
service httpd restart
для apache или
service nginx restart
для nginx.
Ни в одном из ответов не упоминалось, что это может быть ролью для подключения к внутренней vpn. У меня была эта проблема раньше, и я просил быть в частной сети.