Когда я некоторое время назад запустил сервис, написанный на языке go, я обнаружил, что всеhttpsЗапрашивая все повесило, даетсяx509 certificate signed by unknown authority, Поскольку доменные имена, к которым обращаются онлайн-среда и тестовая среда, различаются, эта проблема не возникала в тестовой среде, а в начале доступ к онлайн-среде осуществлялся с помощью эликсира, и проблем не было, поэтому я могу только попробовать сначала решить самому.Эта статья предназначена для записи процесса решения проблемы.
Решение
Прежде всего, конечноGoogleСмотри, обнаружил, что решение большинства людей состоит в том, чтобы установитьTLSClientConfig
ПропуститьhttpsПроверка сертификата. Это, очевидно, прямое решение проблемы, но на самом деле это избегает решения проблемы, поэтому мы отказываемся от этой идеи решения и непосредственно находим первопричину проблемы.
Изначально этот сервис используетelixirнаписано, то же самоеhttps endpointбез проблем, это яgolangЕсть ли проблема с написанным кодом? Начните с этого шага, но, к сожалению, используйте код для доступа к другимhttpsНа сайте компании все возможно, но доменное имя онлайн-среды компании не очень, поэтому я стал думать, в онлайне эта проблема или нет.tlsЭто вызвано неправильной конфигурацией? ОткрытьChrome, вводить доменное имя для доступа, и вообще находить предупреждения и ошибки, нет смысла, если серверtlsЕсли проблема с конфигурацией, почему могут запрашиваться другие языки, почему?ChromeДоступ без ошибок?
К счастью, есть другое оружие, которое можно использовать,ssllabsВы можете проанализировать сертификат, чтобы увидеть, есть ли какие-либо проблемы.После его решительного использования выясняется, что проблема есть.После анализа оценка толькоB:
Тогда внимательно посмотрите на следующий отчет, там есть один пункт, который прямо указывает на проблему:
Согласно отчету, естьChain issues,ВключаяCOMODO RSA Domain Validation Secure Server CAЭтот сертификат требует дополнительной загрузки. Это легко понять, проблема должна быть с конфигурацией на стороне сервера, поэтому есть два пути решения этой проблемы:
- Восстановить конфигурацию сервера;
- Сделать совместимость в коде;
Учитывая, что онлайн-среда для меня черный ящик, я ее поменяю, не утруждайте себя изменением конфигурации сервера. Способ замены прост:
- поместите недостающий файл сертификатаpublic keyсохранить как файлcomodo.crt,затем добавьте его вDockerв контейнере
/usr/local/share/ca-certificates/
под дорожкой; - воплощать в жизнь
update-ca-certificates
Заказ; - Готово.
Это решение равносильно тому, если вы скажете, что у вас есть некий сертификат, то я вам этот сертификат добавлю, так что проблем нет. Но зная решение, почему возникает такая проблема?Chain issuesВ чем проблема?
корень проблемы
Прежде всего, нам нужно понять концепцию цепочки сертификатов.Цепочка сертификатов фактически представляет собой основу доверия всего сертификата.Проверщик сертификатов должен правильно проверить цепочку сертификатов. мы можем использоватьChromeпосмотриgithub.comЦепочка сертификатов для:
Связь цепочки сертификатов, показанная на рисунке выше, такова:github.com -> DigiCert SHA2 Extended Validation Server CA -> DigiCert High Assurance EV Root CAВся цепочка разделена на три типа сертификатов, а именно сертификат объекта сервера, промежуточный сертификат и корневой сертификат. Процесс проверки по цепочке сертификатов выглядит следующим образом:
- Получить сеть сертификатов: клиент/браузер подключается к https-серверу, и сервер возвращает полную цепочку сертификатов клиенту/браузеру.
- Проверьте отношение цепочки сертификатов:Клиент/браузер гарантирует, что эмитент каждого сертификата, кроме вторичного сертификата, является пользователем его вышестоящего сертификата.Если он несовместим, проверка сертификата завершится ошибкой.
- Итеративная проверка подписи: клиент/браузер получает сертификат верхнего уровня сертификата объекта сервера (при условии, что это сертификат B).public keyЧтобы проверить подпись сертификата объекта сервера, после успеха получите сертификат верхнего уровня сертификата B (при условии, что это сертификат C)public keyЧтобы проверить подпись сертификата B, продолжайте после успеха и продолжайте повторять до тех пор, пока не будет получен тот же результат, что эмитент и пользователь корневого сертификата, после чего проверка будет успешной.
А у нас проблемаhttps Когда веб-сайт развернул сертификат, цепочка сертификатов была развернута неправильно, и возникла проблема при получении цепочки сертификатов на первом этапе. Но дляChromeДля браузеров или некоторых других языков разработки, если цепочка сертификатов, возвращаемая сервером, неполная, они дополнят отсутствующий сертификат отдельно, но golang не выполняет эту операцию, в результате чего всяhttpsПодтверждение протокола не удалось, отсюда и проблема.