Ошибка сертификата https Golang: удаленная ошибка: tls: неизвестный центр сертификации

Я сделал свой сертификат и ключ, используя следующие

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

И настроил его в моем коде Golang

log.Fatal(http.ListenAndServeTLS(":4201", "cert.pem", "key.pem", router))

Он работал хорошо при доступе с помощью Chrome, но выдает ошибку на консоли при доступе с помощью Firefox.

02.03.2018 16:54:11 http: ошибка рукопожатия TLS от 100.67.56.121:54397: удаленная ошибка: tls: неизвестный центр сертификации

Как я могу решить проблему?


person Peng Yang    schedule 02.03.2018    source источник
comment
Два варианта: использовать признанные полномочия подписи или настроить Firefox так, чтобы они распознавали используемые вами полномочия. Ни одна из этих задач здесь не по теме. Что касается последнего, SuperUser, вероятно, будет лучшим местом, где можно спросить (хотя я уверен, что Google уже может вам сказать).   -  person Flimzy    schedule 02.03.2018
comment
Как я могу контролировать на стороне сервера? Поскольку невозможно попросить всех настроить Firefox на их стороне. Я пробовал ниже, но безуспешно. http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} log.Fatal(http.ListenAndServeTLS(:4201, cert.pem, key.pem, router))   -  person Peng Yang    schedule 02.03.2018
comment
да. Как я уже сказал, вы можете использовать сертификат с признанным авторитетом на стороне сервера.   -  person Flimzy    schedule 02.03.2018
comment
Нет, вы не можете настроить серверы так, чтобы клиенты слепо им доверяли. Это разрушило бы весь смысл TLS. Если ваш сервер общедоступен или вы контролируете записи DNS, вы можете бесплатно получить надежный сертификат на сайте letsencrypt.org.   -  person Peter    schedule 03.03.2018


Ответы (1)


«Удаленная ошибка» означает ошибку, отправленную клиентом (в данном случае Firefox).

Решение состоит в том, чтобы выяснить, почему firefox не нравится сертификат, и исправить это.

Есть что-то, что Firefox не нравится в сертификате. Откройте инструменты разработчика Firefox и посмотрите, можете ли вы найти какие-либо предупреждения относительно сертификата. Если вам пришлось вручную принять сертификат в Firefox, возможно, Firefox по-прежнему сообщает серверу, что ему не нравится сертификат, даже если вы сказали Firefox загрузить страницу в любом случае (см. пример Chrome ниже).

Однако, поскольку это самогенерируемый/подписанный сертификат, предупреждение, вероятно, связано с тем, что Firefox не доверяет этому сертификату. Решение состоит в том, чтобы либо добавить этот сертификат в доверенные сертификаты Firefox, если этот сервер предназначен только для вашего личного использования... либо получить сертификат, подписанный коммерческим ЦС или letsencrypt.

«Исправить это на стороне сервера» означает исправить все, что касается того, как ваш сертификат/приложение обслуживается, чтобы Firefox доверял ему. Или я полагаю, игнорируя ошибки, если вы просто занимаетесь разработкой.

Подробнее…

Ключевым моментом здесь является то, что это «удаленная ошибка», означающая, что это ошибка от КЛИЕНТА tls, подключающегося к вашему серверу. В вашем случае Firefox жалуется во время рукопожатия TLS, что сертификат каким-то образом недействителен.

Я заметил то же самое с хромом. Сертификат подписан общедоступным ЦС (т.е. ЦС, которому должно доверять большинство браузеров), но поскольку я разрабатываю на своем локальном компьютере, сертификат недействителен, поскольку имя хоста (localhost) не соответствует сертификату CommonName (CN) или Subject Альтернативные имена (SAN).

Проще всего просто посмотреть на рукопожатие TLS в wireshark.

захват рукопожатия wireshark

Я сказал Chrome принять сертификат, начал захват и сделал ОДИН РАЗ обновление страницы (https://localhost:8081 в Это дело). Chrome не выводит мне страницу с предупреждением и показывает содержимое. Однако в адресной строке есть красное предупреждение.

Интересно (для меня) то, что кажется (я не эксперт TLS), что есть два рукопожатия TLS.

Клиент Hello Сервер Hello Alert (ошибка клиента) Клиент Hello Сервер Hello Клиент завершил рукопожатие ...зашифрованные данные приложения...

Поскольку хром не прерывает мое обновление страницы, я не уверен, почему хром выполняет рукопожатие дважды (в первый раз с предупреждением/сбоем) для обновления одной страницы.

Интересная часть, которую я узнал здесь (очевидно в ретроспективе), заключается в том, что можно получать отчеты от браузеров/клиентов, когда они отклоняют ваш сертификат. Это можно использовать на стороне сервера (при отслеживании) для обнаружения малозаметных неправильных конфигураций сертификатов в рабочей среде, которые могут не охватывать ваши тестовые примеры. К сожалению, поскольку это pre-http, вы не получите пользовательский агент или что-либо полезное, чтобы помочь с воспроизведением .... но большое количество этих ошибок в процентах от трафика сервера указывает на то, что вам нужно сделать серьезный кросс-браузер/ОС /тестирование устройства

person mattpr    schedule 17.04.2019
comment
Не эксперт, возможно, причина, по которой вы получаете два рукопожатия, заключается в том, что сервер не получил приемлемых вариантов от первого рукопожатия, поскольку вы используете самозаверяющий сертификат. 4.1.4. Hello Retry Request Сервер отправит это сообщение в ответ на сообщение ClientHello, если он сможет найти приемлемый набор параметров, но ClientHello не содержит достаточной информации для продолжения рукопожатия. Как обсуждалось в Разделе 4.1.3, HelloRetryRequest имеет тот же формат, что и сообщение ServerHello tools.ietf.org/html/rfc8446#section-4.1.4 - person JShade01; 18.09.2020