Неверный самозаверяющий сертификат 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.

самоподписанный скрипт bls

После установки сертификатов обязательно перезапустите Chrome (chrome://restart). Проверено на Chrome 65.x и это все еще работает.


Еще один (гораздо более надежный) инструмент, заслуживающий внимания, - CloudFlare's cfssl Инструментарий:

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

Обновлено июнь 2021 г. - Windows 10 - ответ Chrome v91 здесь

На 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
Другие вопросы по тегам