Помилка сертифіката SSL: помилка перевірки: num = 20: неможливо отримати сертифікат локального емітента


11

Я намагався налагодити підключення SSL до сервера LDAPS (Active Directory), але все ще виникають проблеми. Я спробував скористатися цим:

openssl s_client -connect the.server.edu:3269 

З наступним результатом:

verify error:num=20:unable to get local issuer certificate 

Я подумав: гаразд, ну сервер - це старий виробничий сервер, який має кілька років. Можливо, ЦА немає. Потім я витягнув сертифікат з виводу у файл pem і спробував:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

І це теж не спрацювало.

Що я пропускаю? Чи не повинно це ЗАВЖДИ працювати?

ssl  openssl 

Для наочності виявляється, що LDAPS при обслуговуванні з Windows не надає сертифікат CA при встановленні з'єднання. Отже, вам слід отримати сертифікат CA X.509, експортувати як base64 та призначити, як описано у відповідях нижче. У моєму випадку, використовуючи python-ldap, ви присвоюєте його в області GLOBAL (не ваш екземпляр ldap.initialize ()): ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Після цього я зміг використати STARTTLS (у порту LDAP 389), як очікувалося.
mbrownnyc

Відповіді:


4

Отже, це те, що я бачу як ім'я cert CA:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

Це було ім'я сертифікату, який я імпортував після того, як я зробив -виставки в другій спробі вище. Я перерахував церти в сховищі ключів, зробивши це:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Я бачу там сертифікат CA.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

Щоб переконатися, що openssl використовує сховище ключів, яке я використовую з сервером, я використовую аргумент -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

Знаючи, що в магазині Java Java для CA є пароль, я спробував використовувати параметр -pass pass: password, як це:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

але і це не спрацювало.

Що смішного в тому, що у файлі cacerts на ньому є пароль, і openssl не скаржиться, що він не може прочитати файл cacerts. Це здається мені рибним. Це чи щось інше дзвонить у дзвін?


3

Ця помилка є способом opensl сказати: "Я не можу прослідкувати за ланцюжком сертифікатів до надійного кореня". Я просто зробив ту саму команду на своїх власних серверах AD, і я отримую повну ланцюжок cert, але у верхньому сертифікаті є саме така помилка. Якщо у вас є ключ ключа CA, який підписав cert, ви можете вказати його за допомогою параметрів -CAfileабо-CApath


Добре, дякую за відповідь. Тому я спробував це. Отримав сертифікат CA, зробивши те саме, що ввімкнено опцію -showcerts, схопив інший сертифікат. Це має бути сертифікат CA, правда? Спробував, що замість серверного сертифіката в файлі pem і отримав те саме повідомлення про помилку. Будь-які інші думки?

У такому випадку є ймовірність того, що це не вдалося перевірити з іншої причини, наприклад, термін дії якого минув.
sysadmin1138

1

Я намагався налагодити підключення SSL до сервера LDAPS (Active Directory), але все ще виникають проблеми. Я спробував скористатися цим:

Якщо ви використовуєте OpenLDAP, ви можете встановити:

TLS_REQCERT=never

у вашому openldap.confфайлі, який вказує OpenLDAP не намагатися перевірити сертифікат. Існує аналогічний варіант, якщо ви робите автентифікацію LDAP з Apache.

Якщо ви дійсно хочете провести перевірку сертифікатів, може допомогти наступне:

Що я пропускаю? Чи не повинно це ЗАВЖДИ працювати?

Я не думаю, що так. Хоча наступне може здатися остаточним, це справді просто мій найкращий гість:

Те, що ви спробували, працювало б лише на сертифікат, який підписав самостійно. Оскільки сертифікат був фактично виданий компанією Windows CA, намагаючись використовувати сертифікат сервера як аргумент, щоб -CAfileви нічого не отримали.

Отримав сертифікат CA, зробивши те саме, що ввімкнено опцію -showcerts, схопив інший сертифікат. Це має бути сертифікат CA, правда?

Не обов’язково, ні. Немає гарантії, що віддалений сервер представляє сертифікат CA у своєму висновку. Спочатку потрібно подивитися на емітента серверного сертифіката:

openssl x509 -in server.crt -noout -text | grep Issuer

... а потім подивіться, чи відповідає один з інших сертифікатів у вас емітента.

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