як змусити Gnu / Linux довіряти сертифікату, якому довіряють Windows нестандартно?


11

Існує сервер із зламаною ланцюжком SSL, про що повідомляє ця перевірка SSL :

Звіт про перевірку SSL

Я знаю, що це проблема, яку слід вирішити на самому сервері, але іноді це важко виправити (я не адміністратор сервера).

Вся справа в тому, що Chrome / Mozilla / Edge в Windows все одно довіряють сертифікату сайту :

введіть тут опис зображення

Однак у розгортанні Gnu / Linux (Ubuntu 18.04 у Docker) сертифікату не довіряють:

curl: (60) SSL certificate problem: unable to get local issuer certificate

Я спробував update-ca-certificatesі навіть імпортував сертифікат Root Globalsign. update-ca-certificatesу цьому випадку повідомили про повторне посвідчення. У всякому разі, нічого не працює.

Як відтворювати

Використання Docker:

docker run -it ubuntu:18.04

# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it  # <---- "unable to get local issuer certificate"

Як я можу змусити Gnu / Linux довіряти цьому сертифікату?

PS: Цей же сертифікат правильно розгорнуто на іншому сервері .


чому потік?
Udo G

1
Я голосую за те, щоб закрити це питання поза темою, оскільки ОП задає щось, на що він не може вплинути на себе. Він сказав, що не може нічого змінити на стороні сервера , тому, напевно, це належить суперпользователю, я думаю, оскільки він описує проблему, яка не має рішення клієнта.
LinuxSecurityFreak

2
Я спеціально прошу рішення на стороні клієнта . Я не можу впливати на сервер, але я повністю контролюю клієнтський O / S (Ubuntu), і я хочу, щоб ця специфічна установка O / S довіряла сертифікату так само, як це роблять інші O / S (Windows). Справа не в тому, щоб виправити сайт HTTPS для інших.
Udo G


1
Ви не керуєте сервером, але ви все одно можете повідомити про проблему тому, хто керує сервером.
Майкл Хемптон

Відповіді:


11

Справжнє виправлення цього полягає в тому, щоб ваш сервер представляв усі сертифікати в ланцюжку, а не лише сертифікат кінцевої сутності (сервера).

Наведіть свого адміністратора сервера на RFC 5246 Розділ 7.4.2, де чітко зазначено, що це повідомлення передає клієнту ланцюжок сертифікатів .


Якщо ваш адміністратор відмовляється / не може цього зробити з якихось причин, ваш альтернативний варіант - спробувати приступити curlдо роботи з неправильним рукостисканням.

Відповідно до повідомлення у списку розсилки Curl:

Чи може хтось підтвердити, чи підтримує cURL проміжний сертифікат (чи ні)?

Так. Усі сертифікати ca мають ланцюжок сертифікатів, що йде до кореня. Пачка ca, яку ви використовуєте з завитком, повинна складатися з сертів для всього ланцюга.

/ daniel.haxx.se

Ви повинні мати можливість додати Root CA та всі сертифікати проміжних продуктів до пакету та вказати curlна нього за допомогою --cacert <file>параметра.

Оскільки ваші браузери працюють, ви можете отримати доступ до правильних сертифікатів CA звідти. На вкладці сертифікати (різні для кожного браузера, але я впевнений, що ви це зрозумієте) перегляньте ланцюжок сертифікатів. Двічі клацніть Root CA першого Globalsign Root CA - G1 і на Детальніше вкладці, клацніть Копіювати в файл ... . Збережіть як root.cer. Зробіть те саме з AlphaSSL CA - SHA256 - G2 і збережіть його як issuing.cer. Об’єднайте їх разом в один файл (наприклад chain.cer) і використовуйте це як аргумент -cacert.

Як люб’язно зазначає @AB, відсутній сертифікат можна також знайти тут .


Ваші браузери працюють, оскільки вони кешують сертифікати CA. Якщо ви перейшли на правильно налаштований веб-сайт у певний момент минулого, сертифікат якого виданий тим самим CA, що і сертифікат вашого сервера, він буде кешований браузером. Згодом, коли ви відвідуєте неправильно налаштований сайт, ваш веб-переглядач використовуватиме сертифікати CA у своєму кеші для створення ланцюга. Вам здається, що все добре, хоча за кадром, сервер неправильно налаштований.

Зауважте, що в Windows, IE / Edge та Chrome спільний кеш, а Firefox використовує свій власний.

На додаток до вищезазначеного, IE / Edge та Chrome (оскільки вони мають один і той же криптовалютний стек) використовуватимуть розширення в межах сертифікатів під назвою AuthorityInformationAccess . Це опція caIssuer, яка надає URL-адресу, з якої можна завантажити сертифікат CA сертифікату кінцевої особи. Тому, навіть якщо один із цих браузерів не кешував відсутніх сертифікатів попереднього перегляду, він може отримати його за потреби. Зауважте, що Firefox цього не робить, тому іноді Firefox може показувати помилки сертифікатів, коли IE / Edge та Chrome, здається, працюють.


1
Це не мій сервер, тому не можу нічого змінити на стороні сервера. Я спробував використовувати пакет CA від curl.haxx.se/docs/caextract.html (оскільки Firefox довіряє сертифікату) і передати його за допомогою, --cacert cacert.pemале CURL досі не приймає сертифікат.
Udo G

1
Це є сервер. Запустіть echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443і ви побачите лише один сертифікат, який представляє ваш сервер. Повинно бути два - сертифікат кінцевої особи (який представлений) та сертифікат видачі CA - сертифікат Alpha SSL - SHA256 - G2. Останній сервер не надсилається, але повинен.
garethTheRed

2
@garethTheRed: Я розумію, що сервер не представляє всіх сертифікатів, але сервер не під моїм контролем (саме це я мав на увазі під "не мій сервер"). Я просто намагаюся отримати доступ до API на іноземному сервері. У Windows жоден з моїх браузерів не скаржиться на сертифікат, лише Linux / Debian / Ubuntu.
Udo G

@AB: велике спасибі! Встановлення всіх кореневих сертифікатів на цій сторінці вирішило проблему . Однак я хотів би зрозуміти, чому цей крок необхідний вручну.
Udo G

2
Пропущений проміжний серт (як згадував @garethTheRed) можна знайти там: support.globalsign.com/customer/portal/articles/… . OP спочатку лише намагався додати кореневу серту, яка, ймовірно, вже була на місці, таким чином нічого не досягнувши.
AB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.