Неверный самозаверяющий сертификат SSL - "Отсутствует альтернативное имя субъекта"
Недавно Chrome перестал работать с моими самозаверяющими сертификатами SSL и считает, что они небезопасны. Когда я смотрю на сертификат в DevTools | Security
вкладка, я вижу, что это говорит
Альтернативное имя субъекта отсутствует Сертификат для этого сайта не содержит расширение альтернативного имени субъекта, содержащее доменное имя или IP-адрес.
Ошибка сертификата. Существуют проблемы с цепочкой сертификатов сайта (net::ERR_CERT_COMMON_NAME_INVALID).
Как я могу это исправить?
12 ответов
Чтобы это исправить, вам нужно указать дополнительный параметр для openssl
когда вы создаете сертификат, в основном
-sha256 -extfile v3.ext
где v3.ext
это файл вроде так, с %%DOMAIN%%
заменяется тем же именем, которое вы используете в качестве вашего Common Name
, Больше информации здесь и здесь. Обратите внимание, что обычно вы устанавливаете Common Name
а также %%DOMAIN%%
в домен, для которого вы пытаетесь создать сертификат. Так что, если это было www.mysupersite.com
тогда вы бы использовали это для обоих.
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
Примечание. Сценарии, которые решают эту проблему и создают полностью доверенные ssl-сертификаты для использования в Chrome, Safari и на клиентах Java, можно найти здесь.
Еще одно примечание: если все, что вы пытаетесь сделать, это остановить Chrome от выдачи ошибок при просмотре самозаверяющего сертификата, вы можете указать Chrome игнорировать все ошибки SSL для ВСЕХ сайтов, запустив его с помощью специального параметра командной строки, как подробно описано здесь. на SuperUser
Следующее решение работало для меня на Chrome 65 ( ref) -
Создайте файл конфигурации OpenSSL (пример: req.cnf)
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = company.net
Создайте сертификат, ссылающийся на этот файл конфигурации
openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
-keyout cert.key -out cert.pem -config req.cnf -sha256
Я создал скрипт bash, чтобы упростить создание самозаверяющих сертификатов TLS, которые действительны в Chrome.
После установки сертификатов обязательно перезапустите Chrome (chrome://restart
). Проверено на Chrome 65.x
и это все еще работает.
Еще один (гораздо более надежный) инструмент, заслуживающий внимания, - CloudFlare's cfssl
Инструментарий:
Вот очень простой способ создать сертификат IP, которому будет доверять Chrome.
Файл ssl.conf...
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
commonName = 192.168.1.10
[ req_ext ]
subjectAltName = IP:192.168.1.10
Где, конечно же, 192.168.1.10 - это IP-адрес локальной сети, которому Chrome должен доверять.
Создайте сертификат:
openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem
В Windows импортируйте сертификат в хранилище доверенных корневых сертификатов на всех клиентских машинах. На телефоне или планшете Android загрузите сертификат, чтобы установить его. Теперь Chrome будет доверять сертификату в Windows и Android.
В Windows Dev Box лучше всего получить openssl.exe из "c:\Program Files\Git\usr\bin\openssl.exe"
Сделайте копию вашей конфигурации OpenSSL в вашем домашнем каталоге:
cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
или в Linux:
cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
Добавить альтернативное имя субъекта в
openssl-temp.cnf
, под[v3_ca]
:[ v3_ca ] subjectAltName = DNS:localhost
замещать
localhost
доменом, для которого вы хотите создать этот сертификат.Создать сертификат:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -config ~/openssl-temp.cnf -keyout /path/to/your.key -out /path/to/your.crt
Вы можете удалить openssl-temp.cnf
Я просто использую -subj
Параметр добавления IP-адреса машины. Так что решается только одной командой.
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt
Вы можете добавить другие атрибуты, такие как C, ST, L, O, OU, emailAddress, чтобы генерировать сертификаты без запроса.
У меня было так много проблем с получением самозаверяющих сертификатов, работающих в macos/Chrome. Наконец, я нашел Mkcert, "простой инструмент с нулевой конфигурацией, позволяющий создавать локально доверенные сертификаты разработки с любыми именами". https://github.com/FiloSottile/mkcert
Мне удалось избавиться от (net::ERR_CERT_AUTHORITY_INVALID), изменив значение DNS.1 файла v3.ext
[alt_names] DNS.1 = domainname.com
Измените domainname.com своим собственным доменом.
Мне удалось создать самозаверяющий сертификат, исправляющий эту ошибку, с помощью следующей команды powershell:
openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout server.key -out server.crt -subj "/C=$countryCode/ST=$stateCode/L=$city/O=$company/CN=$cn" -addext "subjectAltName=DNS:$cn"
где переменные powershell могут быть, например:
$countryCode : США
$stateCode : Флорида
$город : Майами
$компания : NewCo
$cn : мой.домен.здесь
и если вам нужна версия сертификата PFX (например, для использования в nginx), просто запустите эту команду openssl, чтобы преобразовать созданный выше CRT в PFX:
openssl x509 -in server.crt -out server.pem
На MAC, начиная с версии Chrome 67.0.3396.99, мой самозаверяющий сертификат перестал работать.
регенерация со всем, что написано здесь, не сработало.
ОБНОВИТЬ
был шанс подтвердить, что мой подход работает сегодня:). Если это не работает для вас, убедитесь, что вы используете этот подход
v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$
скопировано здесь https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/
КОНЕЦ ОБНОВЛЕНИЯ
наконец-то смог увидеть зеленый Secure только тогда, когда удалил мой сертификат из системы и добавил его в локальную цепочку для ключей. (если есть - бросьте первым). Не уверен, что это имеет значение, но в моем случае я скачал сертификат через Chrome и проверил, что дата создания сегодня - так что это я только что создал.
надеюсь, что это будет полезно для кого-то потратить как день на это.
никогда не обновлять хром!
Если вы хотите запустить локальный сервер на своем сервере, вам необходимо настроить CN = localhost
а также DNS.1 = localhost
.
[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req
[req_distinguished_name]
C = BR
CN = localhost
emailAddress=contact@example.com
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo
[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost