OpenSSL Перевірка коду повернення: 20 (не вдається отримати сертифікат місцевого емітента)


77

Я працюю під управлінням Windows Vista і намагаюся підключитися через https, щоб завантажити файл у багатокомпонентній формі, але у мене виникають проблеми з сертифікатом місцевого видавця. Я просто намагаюся зрозуміти, чому це зараз не працює, і повернутися до мого коду cURL пізніше після того, як це буде розроблено. Я запускаю команду:

openssl s_client -connect connect_to_site.com:443

Це дає мені цифровий сертифікат від VeriSign, Inc., але також видає помилку:

Verify return code: 20 (unable to get local issuer certificate)

Що таке сертифікат місцевого емітента? Це сертифікат з мого власного комп’ютера? Чи є спосіб обійти це? Я спробував використовувати файл -CAfile mozilla.pem, але все одно видає мені таку ж помилку.


Stack Overflow - це сайт для питань програмування та розробки. Здається, це питання не є темою, оскільки мова не йде про програмування чи розробку. Подивіться, які теми я можу запитати тут, у довідковому центрі. Можливо, кращим місцем для запиту буде обмін стеками Unix та Linux або обмін стеками інформації .
jww

Яка URL-адреса сайту? Жодна з відповідей не надто вражаюча, але вони не можуть відповісти на запитання, оскільки ви відредагували важливі деталі, такі як ім'я сервера. Крім того, connect_to_site.comє (або може бути) реальним сайтом. Ви повинні використовувати, example.comоскільки IANA резервує його для цієї мети.
jww

@jww ні, це не може, підкреслення не є дійсними в іменах доменів.
Doktor J

@DoktorJ - Підкреслення в доменних іменах в порядку, тоді як підкреслення в іменах хостів раніше було заборонено. connect_to_site.com- це доменне ім’я, а не ім’я хоста. Не знаю, чи допускає IDNA підкреслення імен хостів. Також див. Чи можуть субдомени (доменного імені) мати підкреслення “_”? .
jww

Відповіді:


93

У мене була та ж проблема, і я вирішив її, передавши шлях до каталогу, де зберігаються ключі ЦС. На Ubuntu це було:

openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443

1
Ця проблема обговорюється у ваді Ubuntu # 396818 .
Håkon A. Hjortland

1
Дуже дякую! Це було просто приголомшливо, це був другий день, коли я шукав це, і я впадав у божевілля, я навіть зробив ще один сервер для свого додатка (один на DigitalOcean та інший на Amazon). Знову дякую. Ура.
Феліпе

3
Ви також можете встановити шлях до того, /dev/nullщоб ваш клієнт сам шукав сертифікати у всіх звичних місцях.
mulllhausen

1
Зверніть увагу, що цей шлях зазвичай заповнюється пакетом ca-certificates.
Йосип Роден,

16

Ця помилка також трапляється, якщо ви використовуєте самопідписаний сертифікат із keyUsageвідсутнім значенням keyCertSign.


2
Я годинами відслідковував це. Дякую!
Натан Мойнвазірі,

Я просто спробував навіть сертифікат ЦС із використанням: keyCertSign, проблема та сама. Здається, сертифікат CA або кореневий сертифікат слід додати до certsDB openssl (/etc/ssl/certs/ca-certificates.crt)
user1462586

Цю проблему виправлено сьогодні в OpenSSL (див. Github.com/openssl/openssl/issues/1418 ), і виправлення має бути доступне найближчим часом.
дво

12

Рішення: Ви повинні явно додати параметр -CAfile your-ca-file.pem.

Примітка: Я спробував також param, -CApathзгаданий в інших відповідях, але це не працює для мене.

Пояснення: Помилка unable to get local issuer certificateозначає, що opensslне знає вашого кореневого сертифіката ЦС.


Примітка: Якщо у вас веб-сервер з більшою кількістю доменів , не забудьте також додати -servername your.domain.netпараметр. Цей параметр буде "Встановити ім'я сервера розширення TLS у ClientHello". Без цього параметра відповідь завжди міститиме сертифікат SSL за замовчуванням (не сертифікат, який відповідає вашому домену).


Щиро дякую, я займаюся цим годинами. Нічого не працювало, але це !!
Аюш

3

Ваш сервер налаштований на автентифікацію клієнта? Якщо так, вам потрібно передати сертифікат клієнта під час з’єднання з сервером.


3

У мене була та ж проблема на OSX OpenSSL 1.0.1i від Macports, і мені також довелося вказати CApath як обхідний шлях (і, як згадується у звіті про помилки Ubuntu, навіть недійсний CApath зробить openssl виглядати в каталозі за замовчуванням). Цікаво, що підключення до того самого сервера за допомогою PHP-функцій openssl (як у PHPMailer 5) працювало нормально.


2

З автентифікацією клієнта:

openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443

2

помістіть свій сертифікат CA & root у / usr / share / ca-certificate або / usr / local / share / ca-certificate. Тоді

dpkg-reconfigure ca-сертифікати

або навіть перевстановити пакет ca-certificate за допомогою apt-get.

Після цього ваш сертифікат збирається в системну БД: /etc/ssl/certs/ca-certificates.crt

Тоді все повинно бути добре.


Цікаво, чи є у Windows папка / usr / share / ca-certificate або / usr / local / share / ca-certificate. А що означало б dpkg-reconfigure у термінах Windows?
Гаральд

У Windows ви можете помістити сертифікат у місцевий магазин сертифікатів машин. Запустіть mmc.exe, а потім додайте / видаліть snapin> сертифікати> локальний комп'ютер. Потім покладіть будь-які сертифікати кінцевих сутностей в Особистий магазин, проміжні сертифікати в папку Intermedate тощо тощо
Чак Херрінгтон

2

Створіть файл ланцюжка сертифікатів з проміжним та кореневим ca.

cat intermediate/certs/intermediate.cert.pem certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem

chmod 444 intermediate/certs/ca-chain.cert.pem

Потім верфіфікуйте

openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \
  intermediate/certs/www.example.com.cert.pem

www.example.com.cert.pem: Добре Розгорніть сертифікат


будь ласка, поясніть свою відповідь
Intsab Haider

1

Я зіткнувся з такою ж проблемою: це було виправлено після збереження в сертифікаті вартості предмета емітента, оскільки воно є предметом сертифіката емітента.

тому перевірте "значення предмета емітента в сертифікаті (cert.pem) == предмет емітента (CA.pem)"

openssl перевірка -CAfile CA.pem cert.pem
cert.pem: Добре


0

це повідомлення про помилку означає, що CABundle не надається (-CAfile ...) АБО файл CABundle не закривається самопідписаним кореневим сертифікатом.

Не хвилюйся. Підключення до сервера працюватиме, навіть якщо ви отримаєте це повідомлення з openssl s_client ... (передбачається, що ви також не приймаєте іншої помилки)

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