Как заставить браузер доверять SSL-сертификату localhost?

Хотя есть похожие вопросы и даже хорошие ответы, они либо не занимаются конкретно локальным хостом или спросите об одном конкретном варианте/решении (самоподписанный или CA).

Какие есть варианты? Как они сравниваются? Как мне это сделать?


person x-yuri    schedule 29.03.2018    source источник


Ответы (3)


tl;dr Создать сертификат, выданный собственным ЦС (см. сценарий ниже)

Вот что я нашел. Поправьте меня, где я не прав.

Есть ЦС (центры сертификации). Они выдают сертификаты (подписывают CSR) для других ЦС (промежуточные ЦС) или серверов (сертификаты конечных объектов). Некоторые из них являются корневыми. У них есть самоподписанные сертификаты, выпущенные ими самими. То есть обычно существует цепочка доверия, которая идет от сертификата сервера к корневому сертификату. А за корневой сертификат никто не поручится. Таким образом, у ОС есть хранилище корневых сертификатов (или хранилище политик доверия), общесистемный список доверенных корневых сертификатов. Браузеры имеют свои собственные списки доверенных сертификатов, которые состоят из общесистемного списка и сертификатов, которым доверяет пользователь.

В Chromium вы управляете сертификатами по адресу chrome://settings/certificates. В Firefox Preferences > Privacy & Security > Certificates > View Certificates. У обоих есть вкладка «Авторитеты», которая представляет собой список доверенных корневых сертификатов. И вкладка Серверы, список сертификатов доверенных серверов.

Для получения сертификата вы создаете CSR (запрос на подпись сертификата), отправляете его в CA. CA подписывает CSR, превращая его в доверенный сертификат в процессе.

Сертификаты и CSR представляют собой набор полей с информацией и открытым ключом. Некоторые поля называются расширениями. Сертификат ЦС — это сертификат с basicConstraints = CA:true.

Вы можете проверить ошибки сертификата в Chromium в Developer Tools > Security.

Доверительные сертификаты по всей системе

Когда вы меняете корневое хранилище сертификатов ОС, вам необходимо перезапустить браузер. Вы меняете его с помощью:

# trust anchor path/to/cert.crt
# trust anchor --remove path/to/cert.crt

trust помещает сертификаты ЦС в категорию "авторитетных" (trust list) или в категорию "другие записи" в противном случае. Сертификаты ЦС отображаются на вкладке «Центры» в браузерах или на вкладке «Серверы».

Firefox не доверяет сертификатам сервера из корневого хранилища сертификатов ОС, в отличие от Chromium. Оба доверяют сертификатам ЦС из корневого хранилища сертификатов ОС.

Доверие к сертификатам в браузере

В Chromium и Firefox вы можете добавлять (импортировать) сертификаты на вкладку «Уполномоченные». Если вы попытаетесь импортировать сертификат, отличный от центра сертификации, вы получите сообщение «Не центр сертификации». После выбора файла появляется диалоговое окно, в котором можно указать параметры доверия (когда доверять сертификату). Соответствующим параметром для обеспечения работы сайта является «Доверять этому сертификату для идентификации веб-сайтов».

В Chromium вы можете добавлять (импортировать) сертификаты на вкладке Серверы. Но они попадают либо на вкладку «Власти» (сертификаты ЦС, и после выбора файла вам не открывается диалоговое окно настроек доверия), либо на вкладку «Другие» (если сертификат не ЦС).

В Firefox вы не можете точно добавить сертификат на вкладку «Серверы». Вы добавляете исключения. И там можно доверять сертификату вообще без расширений (плохо).

Расширения самозаверяющих сертификатов

Моя система поставляется со следующими настройками по умолчанию (расширения, которые необходимо добавить) для сертификатов:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

Взято из /etc/ssl/openssl.cnf, раздел < a href="https://github.com/openssl/openssl/blob/OpenSSLPreferences > Privacy & Security > Certificates > View Certificates1_0h/apps/openssl.cnf#L224-L255" rel="noreferrer">v3_ca. Подробнее об этом здесь.

Кроме того, Chromium считает сертификат недействительным, если в нем нет subjectAltName = DNS:$domain.

Расширения несамоподписанного сертификата

Из раздела [ usr_cert ] документа /etc/ssl/openssl.cnf:

basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

Когда браузеры доверяют самоподписанному сертификату

Чтобы Chromium доверял самоподписанному сертификату, он должен иметь basicConstraints = CA:true и subjectAltName = DNS:$domain. Для Firefox недостаточно даже этого:

basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain

Когда браузеры доверяют сертификату, выданному собственным ЦС

Firefox не нуждается в расширениях, но Chromium требует subjectAltName.

openssl шпаргалка

openssl genpkey -algorithm RSA -out "$domain".key — сгенерировать закрытый ключ (man )

openssl req -x509 -key "$domain".key -out "$domain".crt — создать самоподписанный сертификат (man)

Без -subj он будет задавать вопросы, касающиеся отличительного имени (DN), например, общего имени (CN), организации (O), местности (L). Вы можете ответить на них «заранее»: -subj "/CN=$domain/O=$org".

Чтобы добавить расширение subjectAltName, вам нужно либо иметь конфиг, где все это указано, либо добавить раздел в конфиг и указать openssl его имя с переключателем -extensions:

    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

openssl req -new -key "$domain".key -out "$domain".csr — генерировать CSR, может использоваться опция -subj (мужчина)

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \ -CA ca.crt -CAkey ca.key -CAcreateserial - подписать CSR (man)

Без -CAcreateserial не работает. Он создает файл ca.srl, в котором хранится серийный номер последнего сгенерированного сертификата. Чтобы добавить subjectAltName, вам понадобится переключатель -extfile:

    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

openssl req -in $domain.csr -text -noout — просмотреть CSR (man)

openssl x509 -in $domain.crt -text -noout - просмотреть сертификат (man)

Создать самоподписанный сертификат

(вам понадобится исключение в Firefox, чтобы оно работало)

#!/usr/bin/env bash
set -eu
org=localhost
domain=localhost

sudo trust anchor --remove "$domain".crt || true

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -x509 -key "$domain".key -out "$domain".crt \
    -subj "/CN=$domain/O=$org" \
    -config <(cat /etc/ssl/openssl.cnf - <<END
[ x509_ext ]
basicConstraints = critical,CA:true
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
subjectAltName = DNS:$domain
END
    ) -extensions x509_ext

sudo trust anchor "$domain".crt

Генерация сертификата, выданного собственным ЦС

#!/usr/bin/env bash
set -eu
org=localhost-ca
domain=localhost

sudo trust anchor --remove ca.crt || true

openssl genpkey -algorithm RSA -out ca.key
openssl req -x509 -key ca.key -out ca.crt \
    -subj "/CN=$org/O=$org"

openssl genpkey -algorithm RSA -out "$domain".key
openssl req -new -key "$domain".key -out "$domain".csr \
    -subj "/CN=$domain/O=$org"

openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(cat <<END
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:$domain
END
    )

sudo trust anchor ca.crt

Конфигурация веб-сервера

Нгинкс:

server {
    listen  443  ssl;
    ssl_certificate  ssl/localhost.crt;
    ssl_certificate_key  ssl/localhost.key;
    ...

Морбо:

carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' \
    site.pl

P.S. Я использую Chromium 65.0.3325.162, Firefox 59.0 и openssl-1.1.0.g.

Окна

Судя по всему, в Windows нет утилиты trust. В Windows есть два хранилища: хранилища сертификатов локального компьютера и текущего пользователя. Нет смысла использовать хранилище сертификатов локального компьютера, поскольку мы заставляем его работать только для нашего текущего пользователя. Затем есть подмагазины. Два из них представляют наибольший интерес: доверенные корневые центры сертификации и хранилища промежуточных центров сертификации. Обычно упоминается в командной строке как root и CA.

Вы можете получить доступ к Диспетчеру сертификатов Chrome, перейдя по ссылке chrome://settings/?search=Manage%20certificates, а затем нажав Управление сертификатами. Наибольший интерес представляют вкладки Доверенные корневые центры сертификации и Промежуточные центры сертификации.

Одним из способов управления сертификатами является командная строка. :

>rem list Current User > Trusted Root Certification Authorities store
>certutil.exe -store -user root

>rem list Local Machine > Intermediate Certification Authorities store
>certutil.exe -store -enterprise CA

>rem GUI version of -store command
>certutil.exe -viewstore -user CA

>rem add certificate to Current User > Trusted Root Certification Authorities store
>certutil.exe -addstore -user root path\to\file.crt

>rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
>certutil.exe -delstore -user root 03259fa1

>rem GUI version of -delstore command
>certutil.exe -viewdelstore -user CA

Результаты следующие (как для локального компьютера, так и для хранилищ сертификатов текущего пользователя):

root
    localhost.crt
        error
    ca.crt
        appears in Trusted Root Certification Authorities tab
CA
    localhost.crt
        doesn't work, appears in Other People tab
    ca.crt
        doesn't work, appears in Intermediate Certification Authorities tab

Другими вариантами могут быть двойной щелчок по сертификату в проводнике, импорт сертификатов из диспетчера сертификатов Chrome, использование оснастки MMC «Сертификаты» (запустите certmgr.msc) или использование CertMgr.exe.

Для тех, у кого установлен grep, вот как быстро проверить, где находится сертификат:

>certutil.exe -store -user root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -user CA | grep "locahost\|^root\|^CA" ^
& certutil.exe -store -enterprise root | grep "localhost\|^root\|^CA" ^
& certutil.exe -store -enterprise CA | grep "localhost\|^root\|^CA"

Таким образом, установка сертификата CA в хранилище Current User > Trusted Root Certification Authorities кажется лучшим вариантом. И убедитесь, не забудьте перезапустить браузер.

Дополнительное чтение

OpenSSL
genpkey
req
x509
Центр сертификации OpenSSL
Сертификаты для локального хоста< br> iamaCA — Станьте собственным центром сертификации и выдавайте сертификаты
Firefox и самоподписанные сертификаты
< href="https://stackoverflow.com/a/ 47646463/52499">Обход страницы ошибки сертификата в Chrome

person x-yuri    schedule 29.03.2018
comment
Я добавил большую награду к своему вопросу о том, как заставить Chrome или Firefox принимать локальный сертификат: stackoverflow.com/q/48969083/470749 - person Ryan; 01.04.2018
comment
Спасибо за вашу работу. Правильно ли я понимаю, что теперь невозможно создать единый самоподписанный сертификат, который удовлетворил бы и Firefox, и Chrome? - person Oleg Neumyvakin; 17.05.2018
comment
@OlegNeumyvakin Когда браузеры доверяют самозаверяющему сертификату, он говорит, что Chrome может доверять самозаверяющему сертификату. А для Firefox можно добавить исключение, если мне не изменяет память. Так что это возможно. Кроме того, вы можете найти интересный проект easy-rsa. Я столкнулся с этим при настройке OpenVPN. Это должно упростить получение сертификатов CA (в частности, создание CA и серверных сертификатов). Хотя не пробовал. - person x-yuri; 17.05.2018
comment
Эта суть тоже полезна. - person Md Abdulla Al Mamun Nayon; 04.06.2021

В chrome можно перейти к chrome://flags/#allow-insecure-localhost и включить

Разрешить недействительные сертификаты для ресурсов, загружаемых с локального хоста. вариант

person Shashwat    schedule 20.06.2020

откройте эту ссылку в своем браузере и включите ее: chrome://flags/#temporary- unexpire-flags-m87

затем перезапустите хром и выполните поиск на локальном хосте, вы найдете его там.

person EspressoCode    schedule 27.01.2021
comment
Мой файрфокс отказывается открывать ссылку :) Что касается Хрома, то у меня там только М86 и М85. У меня 87.0.4280.141. И самое главное, таким образом вы пропустите все самое интересное с сертификатами :) - person x-yuri; 29.01.2021
comment
извините, я не уверен, как это можно исправить в Firefox :-( вы правы. - person EspressoCode; 29.01.2021