Ответ 1
У меня была такая же проблема и она была решена путем передачи пути в каталог, где хранятся ключи CA. На Ubuntu это было:
openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443
Я запускаю Windows Vista и пытаюсь подключиться через https для загрузки файла в виде нескольких частей, но у меня возникают проблемы с сертификатом локального эмитента. Я просто пытаюсь понять, почему это не работает сейчас, и вернемся к моему коду cURL позже после этого. Im работает с командой:
openssl s_client -connect connect_to_site.com:443
Он дает мне цифровой сертификат от VeriSign, Inc., но также выдает ошибку:
Verify return code: 20 (unable to get local issuer certificate)
Что такое сертификат локального эмитента? Это сертификат с моего компьютера? Есть ли способ обойти это? Я попытался использовать файл -CAfile mozilla.pem, но все равно дает мне такую же ошибку.
У меня была такая же проблема и она была решена путем передачи пути в каталог, где хранятся ключи CA. На Ubuntu это было:
openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443
У меня была такая же проблема на OSX OpenSSL 1.0.1i из Macports, а также пришлось указать CApath как обходной путь (и, как упоминалось в отчете об ошибке Ubuntu, даже недопустимый путь CA заставит opensl искать в каталоге по умолчанию). Интересно, что подключение к тому же серверу с использованием функций PHP openssl (как используется в PHPMailer 5) отлично работало.
Эта ошибка также возникает, если вы используете самозаверяющий сертификат с keyUsage
без значения keyCertSign
.
Решение:
Вы должны явно добавить параметр -CAfile your-ca-file.pem
.
Примечание. Я попробовал также параметр -CApath
, упомянутый в других ответах, но это не работает для меня.
Объяснение:
Ошибка unable to get local issuer certificate
означает, что openssl
не знает ваш корневой сертификат CA.
Примечание. Если у вас веб-сервер с большим количеством доменов, не забудьте добавить также параметр -servername your.domain.net
. Этот параметр будет "Установить имя сервера расширения TLS в ClientHello". Без этого параметра ответ всегда будет содержать сертификат SSL по умолчанию (не сертификат, соответствующий вашему домену).
Установлен ли ваш сервер для проверки подлинности клиента? Если это так, вам нужно передать сертификат клиента при подключении к серверу.
Я столкнулся с той же проблемой, Он был исправлен после сохранения значения субъекта эмитента в сертификате, поскольку он является субъектом сертификата эмитента.
поэтому, пожалуйста, проверьте "значение предмета эмитента в сертификате (cert.pem) == субъект эмитента (CA.pem)"
openssl verify -CAfile CA.pem cert.pem
cert.pem: ОК
С проверкой подлинности клиента:
openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443
поместите свой CA и корневой сертификат в /usr/share/ca -certificate или/usr/local/share/ca-certificate. Тогда
dpkg-reconfigure ca-certificates
или даже переустановить пакет ca-сертификата с помощью apt-get.
После этого ваш сертификат будет собран в системную БД: /etc/ssl/certs/ca -certificates.crt
Тогда все должно быть хорошо.