Рейтинг:0

WSL-Docker: curl: (60) не удалось получить сертификат локального эмитента

флаг cn

После реконфигурации ПК я не могу правильно использовать Docker, так как некоторые команды curl отклоняются из-за проблем с SSL/TLS.

Всего в одном примере curl -vfsSL https://apt.releases.hashicorp.com/gpg возвращает следующую ошибку:

* Попытка 52.222.214.125:443...
* Установлен TCP_NODELAY
* Подключено к apt.releases.hashicorp.com (52.222.214.125), порт 443 (#0)
* ALPN, предлагая h2
* ALPN, предлагающий http/1.1
* успешно установить места проверки сертификата:
* CA-файл: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.3 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.3 (IN), рукопожатие TLS, зашифрованные расширения (8):
* TLSv1.3 (IN), рукопожатие TLS, сертификат (11):
* TLSv1.3 (OUT), оповещение TLS, неизвестный ЦС (560):
* Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
* Закрытие соединения 0
curl: (60) Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
Подробнее здесь: https://curl.haxx.se/docs/sslcerts.html

curl не смог проверить легитимность сервера и поэтому не смог
установить с ним безопасное соединение. Чтобы узнать больше об этой ситуации и
как это исправить, пожалуйста, посетите веб-страницу, указанную выше.

После некоторых копаний я теперь знаю, что это проблема также возникает в моем образе WSL, но не в основной ОС Windows. Следовательно, я считаю, что это должна быть проблема, возникающая из-за моей настройки WSL, а не из-за самого Docker (?).

Есть довольно много связанных вопросов по serverfault/stackoverflow, но решения, которые я нашел, действительно применимы к этому случаю:

FWIW Я работаю на предприятии, с ОС, выпущенной ИТ.Очевидно, что это может быть источником ошибки, но они не могут помочь мне отладить эту проблему. Однако на одном ПК коллеги он работает без нареканий.

Любые идеи?


Настройка ПК:

  • Windows 10 Корпоративная
    • Версия: 21H1
    • Сборка ОС: 19043.1645
    • Пакет возможностей Windows: 120.2212.4170.0
  • WSL 2 с Ubuntu-20.04
  • Docker Desktop 4.7.1 (77678) с движком на базе WSL 2

Обновление 1

Как предложил @Martin, я попытался загрузить https://www.amazontrust.com/repository/AmazonRootCA1.pem, положить внутрь /tmp в WSL Ubuntu и повторно запустил команду curl --cacert /tmp/AmazonRootCA1.pem -vfsSL https://apt.releases.hashicorp.com/gpg но безрезультатно:

curl --cacert /tmp/AmazonRootCA1.pem -vfsSL https://apt.releases.hashicorp.com/gpg
* Попытка 52.222.214.72:443...
* Установлен TCP_NODELAY
* Подключено к apt.releases.hashicorp.com (52.222.214.72), порт 443 (#0)
* ALPN, предлагая h2
* ALPN, предлагающий http/1.1
* успешно установить места проверки сертификата:
* CA-файл: /tmp/AmazonRootCA1.pem
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.3 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
* TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
* TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
* TLSv1.3 (IN), рукопожатие TLS, зашифрованные расширения (8):
* TLSv1.3 (IN), рукопожатие TLS, сертификат (11):
* TLSv1.3 (OUT), оповещение TLS, неизвестный ЦС (560):
* Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
* Закрытие соединения 0
curl: (60) Проблема с сертификатом SSL: невозможно получить сертификат локального эмитента
Подробнее здесь: https://curl.haxx.se/docs/sslcerts.html

curl не смог проверить легитимность сервера и поэтому не смог
установить с ним безопасное соединение. Чтобы узнать больше об этой ситуации и
как это исправить, пожалуйста, посетите веб-страницу, указанную выше.
Martin avatar
флаг kz
Скорее всего, это проблема с вашим локальным файлом root-ca... каждая ОС должна иметь список корневых ЦС, которым доверяет ваша ОС или, в вашем случае, подсистема докеров. Если корневой ЦС удаленного хоста нет в вашем локальном списке доверенных ЦС, подключение отклоняется. Присутствует ли файл ```/etc/ssl/certs/ca-certificates.crt```?
casparjespersen avatar
флаг cn
Да. Оказывается, он содержит множество сертификатов.
Martin avatar
флаг kz
загрузите ```https://www.amazontrust.com/repository/AmazonRootCA1.pem```, поместите его в ```/tmp``` и повторите команду следующим образом: ```curl --cacert / tmp/AmazonRootCA1.pem -vfsSL https://apt.releases.hashicorp.com/gpg``` — если это удастся, в вашем пакете ca-certificates отсутствует корневой ca amazon!
casparjespersen avatar
флаг cn
@Martin, я только что попробовал, и, к сожалению, это не решает проблему. Я обновил свой исходный вопрос, указав подробные сведения о выводе повторного запуска.
флаг cn
Можно ли подключиться к crl?
casparjespersen avatar
флаг cn
@GregAskew Я новичок в этой области. Мне понадобится немного более прямой указатель :) подключиться к crl.. Что это такое, как мне его проверить?
флаг cn
Конечная точка должна иметь возможность проверить сертификат. Одна проверка подключается к списку отзыва сертификатов crl на tcp/80.
casparjespersen avatar
флаг cn
Извините, но это не помогло мне, как я могу проверить, возможно ли это. Можно ссылку на гайд?
Martin avatar
флаг kz
GregAskew имеет в виду ссылку, которая написана непосредственно внутри сертификата. (откройте ссылку в браузере и нажмите «Просмотреть сертификат») Я думаю, что это ссылка ```http://crl.sca1b.amazontrust.com/sca1b-1.crl``` - попробуйте перейти по этой ссылке изнутри контейнера...
casparjespersen avatar
флаг cn
Хорошо. Глядя на свою ОС Windows, я вижу, что конечной точкой CRL сертификата является http://gateway.zscaler.net/zscaler-zscrl--4.crl, и я могу получить ее с помощью CURL в WSL.
Martin avatar
флаг kz
Возможно ли, что между вашим док-контейнером и Интернетом есть шлюз/брандмауэр, который перехватывает SSL-соединения? Этот CRL, который вы там разместили, не выглядит так, как будто он исходит из исходного сертификата...
casparjespersen avatar
флаг cn
Это, конечно, вполне возможно. Наш ИТ-отдел контролирует это удаленно.
Martin avatar
флаг kz
пожалуйста, выполните следующее и укажите цепочку доверия внутри вашего ответа, пожалуйста: ```echo "" | openssl s_client -connect apt.releases.hashicorp.com:443 -servername apt.releases.hashicorp.com:443 | openssl x509 -text -noout```.
casparjespersen avatar
флаг cn
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/136157/discussion-between-casparjespersen-and-martin).
Рейтинг:2
флаг kz

Мы наконец-то разобрались. Проблема здесь заключалась в том, что ИТ-отдел установил брандмауэр, который перехватывает SSL-соединения (многие брандмауэры делают это, чтобы иметь возможность блокировать «плохой» трафик, который мог пройти незамеченным из-за шифрования).

Чтобы иметь возможность перехватывать SSL-соединение, брандмауэр помещает в ссылку собственный сертификат и действует как прокси. Вот откуда возникает проблема: контейнер Docker не доверяет ЦС, используемому вашим брандмауэром, и поэтому отклоняет установление соединения.Очевидно, что для вашего компьютера с Windows ЦС уже добавлен в хранилище доверенных сертификатов — это необходимо сделать и для вашего контейнера докеров — или вам нужно добавить --ненадежный переключитесь на команду curl, чтобы игнорировать эти ошибки сертификатов.

Обратите внимание, что curl корректно выдает ошибку, так как механизм https-сертификата был придуман для обнаружения атаки «Человек посередине» — а здесь именно это и происходит. (Я просто пропущу здесь свое мнение о брандмауэрах, нарушающих безопасность SSL, чтобы иметь возможность проверять содержимое пакетов...)

Чтобы это исправить, вам нужен файл ЦС с вашего шлюза, который «подписывает» все эти сертификаты, и добавьте этот ЦС в список доверенных.

Просто для полноты, это сертификат, который вы видите:

Сертификат:
    Данные:
        Версия: 3 (0x2)
        Серийный номер:
            6a:7b:6c:fd:70:b2:68:1a:56:e3:11:3c:43:ed:ae:29
        Алгоритм подписи: sha1WithRSAEncryption
        Эмитент: C = США, ST = Калифорния, L = Саннивейл, O = неверный сертификат сервера [недействительный сертификат сервера], CN = неверный сертификат сервера
        Срок действия
            Не раньше: 26 января 07:08:23 2011 по Гринвичу
            Не после : 11 ноября 07:08:23 22:84 по Гринвичу
        Тема: CN = apt.releases.hashicorp.com
[резать]

это оригинал:

Сертификат:
    Данные:
        Версия: 3 (0x2)
        Серийный номер:
            03:57:ef:0e:70:b2:68:1a:56:e3:11:3c:43:ed:ae:29
        Алгоритм подписи: sha256WithRSAEncryption
        Эмитент: C = США, O = Amazon, OU = сервер CA 1B, CN = Amazon
        Срок действия
            Не раньше: 27 апреля 00:00:00 2022 GMT
            Не после : 26 мая 23:59:59 2023 GMT
        Тема: CN = apt.releases.hashicorp.com
casparjespersen avatar
флаг cn
Спасибо. Для меня невозможно/невозможно добавить флаг --insecure в команду curl. Так что я заинтересован в правильном решении. Я пошел в хранилище сертификатов в Windows и экспортировал файл CER из сертификата Zscaler Root CA, и теперь он работает при выполнении `curl --cacert ca.cer -fsSL https://apt.releases.hashicorp.com/gpg` Ура! Наконец, как правильно добавить этот сертификат «глобально», чтобы мне не приходилось указывать его каждый раз?
casparjespersen avatar
флаг cn
Nevermind — найдено по адресу: https://ubuntu.com/server/docs/security-trust-store. Благодаря тонну!
Martin avatar
флаг kz
Рад, что смог помочь!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.