Вопрос или проблема
Я работаю с контейнером Docker, который хостит веб-сайт, используя новый самоподписанный сертификат каждый раз при запуске. Я могу сказать Firefox добавлять исключение для сертификата каждый раз, когда сертификат генерируется заново и я посещаю веб-сайт, но это требует несколько кликов, что немного раздражает.
Я не могу изменить поведение генерации сертификата, поэтому подумал, что может быть способ сказать Firefox всегда доверять самоподписанным сертификатам с этого одного IP (или имени хоста, подсети и т. д.), или даже полностью отключить проверку сертификатов только для этого хоста. Я не смог найти ничего подобного в интернете, поэтому пришел сюда. Есть идеи по этому поводу?
Я нашел решение этой проблемы, которое мне подходит. Это не идеально, но, кажется, достаточно хорошим и должно быть гораздо безопаснее, чем глобальное отключение проверки сертификатов. Вот что я сделал:
- Установите
mitmproxy
- Запустите
mitmdump --mode reverse:https://<IP, назначенный контейнеру docker> --set ssl_insecure=true
Это позволяет мне подключаться к https://<host IP>:8080, и он будет обслуживать веб-сайт, но с важным отличием, что mitmproxy использует фиксированный корневой CA, которому я могу доверять в Firefox. Теперь, когда я перезапускаю контейнер и сертификат генерируется заново, это не имеет значения, потому что mitmproxy игнорирует ошибки сертификатов на вышестоящем уровне, и я настроил Firefox доверять корневому CA mitmproxy.
Единственная оставшаяся проблема заключалась в том, что mitmproxy, кажется, выбирает имя хоста для конечного сертификата на основе имени хоста контейнера, поэтому возникло несоответствие между Firefox, обращающимся к <host IP> и именем хоста в сертификате, созданном mitmproxy. Я должен был каждый раз сообщать Firefox добавить исключение для несоответствия, когда я перезапускал mitmproxy и он снова создавал конечный сертификат.
Я обошел это, отредактировав файл hosts, чтобы заставить <container hostname> разрешаться в <host IP>, и добавив <container hostname> в список network.trr.excluded-domains
в about:config, чтобы Firefox использовал IP, указанный в моем файле hosts, для этого домена. Теперь я могу подключиться к https://<container hostname>:8080, и имя хоста в URI совпадает с именем хоста в сертификате, и все работает нормально, независимо от того, сколько раз я перезапускаю mitmproxy или контейнер.
Это немного хаотично, но это работает! Я все еще открыт для более элегантного решения, если кто-то сможет его придумать.
Сделайте следующее:
-
Запустите Firefox
-
Перейдите в Настройки > Конфиденциальность и безопасность
-
В разделе Сертификаты нажмите “Просмотреть сертификаты…”
-
В Менеджере сертификатов нажмите на вкладку “Удостоверяющие центры”
-
Нажмите кнопку Импорт для импорта вашего сертификата
-
Возможно, вам будет предложено установить уровень доверия при импорте сертификата. Если нет, вы можете сделать это вручную через кнопку ‘Изменить доверие’.
-
Перезапустите Firefox.
Проще всего настроить Docker так, чтобы контейнер не был обязан воссоздавать сертификат. Это должно подойти и для базовых настроек контейнеров, если контейнер не работает активно против этого:
- Определите директорию или файл, который хранит сертификат внутри работающего контейнера, например
<cert-path-in-container>
- Создайте постоянное хранилище на хосте Docker, например
mkdir -p /var/lib/my-container/cert/
- При запуске контейнера сопоставьте постоянное хранилище в контейнере
docker run [...] --volume /var/lib/my-container/cert:<cert-path-in-container>
Смотрите также: https://docs.docker.com/storage/volumes/
Ответ @harrymc помог мне (хотя в моем случае не пришлось иметь дело с сертификатом, который регенерировался каждый раз, иначе пришлось бы снова проходить через эти шаги, что очевидно не оптимально).
Единственное отличие заключается в том, что самоподписанный сертификат не является CA, поэтому вместо добавления его через вкладку “Удостоверяющие центры” лучше использовать “Серверы” -> “Добавить исключение…” в Firefox -> Настройки -> Конфиденциальность и безопасность. В разделе Сертификаты нажмите “Просмотреть сертификаты…”, перейдите на вкладку Серверы и нажмите “Добавить исключение…” и нажмите “Получить сертификат”.
Затем “Подтвердить исключение безопасности” и, при желании, отметьте “Навсегда сохранить это исключение”
Ответ или решение
Чтобы настроить Firefox на автоматическое доверие к самоподписанным сертификатам для определенного хоста (IP-адреса или диапазона), вы можете воспользоваться несколькими подходами. Вот несколько решений, которые могут помочь:
1. Использование mitmproxy
Это расширенный способ, который подразумевает использование инструмента mitmproxy для промежуточного перехвата запросов. Вы можете настроить его, чтобы он обрабатывал сертификат и создавал стабильный корневой сертификат, который вы можете добавить в Firefox.
Шаги:
- Установите mitmproxy.
- Запустите команду:
mitmdump --mode reverse:https://<IP контейнера> --set ssl_insecure=true
- Убедитесь, что Firefox доверяет корневому сертификату mitmproxy.
2. Импорт самоподписанного сертификата в Firefox
Если вы хотите более простой способ, вы можете вручную импортировать ваш самоподписанный сертификат:
Шаги:
- Запустите Firefox.
- Перейдите в Настройки > Конфиденциальность и безопасность.
- В разделе Сертификаты нажмите кнопку Посмотреть сертификаты….
- На вкладке Удостоверяющие центры нажмите Импорт и выберите свой сертификат.
- При импорте установите уровень доверия для вашего сертификата и подтвердите действия.
3. Настройка Docker для сохранения сертификата
Если вы можете изменить способ генерации сертификатов в вашем контейнере Docker, лучше всего использовать постоянное хранилище для сертификата, чтобы он не регенерировался при каждом запуске контейнера.
Шаги:
- Определите путь к сертификату внутри работающего контейнера, например,
<cert-path-in-container>
. - Создайте постоянное хранилище на хосте Docker:
mkdir -p /var/lib/my-container/cert/
- При запуске контейнера смонтируйте это постоянное хранилище:
docker run [...] --volume /var/lib/my-container/cert:<cert-path-in-container>
4. Добавление исключения в Firefox
Если сертификату необходимо доверять только один раз, вы можете добавить исключение:
- Запустите Firefox.
- Перейдите в Настройки > Конфиденциальность и безопасность.
- В разделе Сертификаты нажмите Посмотреть сертификаты….
- Перейдите на вкладку Серверы, а затем нажмите Добавить исключение….
- Введите адрес хоста и нажмите Получить сертификат. Убедитесь, что включена опция Постоянно хранить это исключение.
Заключение
Каждое из этих решений имеет свои преимущества и недостатки. Использование mitmproxy может быть более гибким, но требует дополнительных настроек. Импорт сертификата в Firefox и конфигурация Docker более простые, но возможные изменения в способах генерации сертификата могут потребовать повторной настройки. Выберите тот способ, который лучше всего соответствует вашим требованиям и окружению.