Недействительный самоподписанный сертификат SSL - «Отсутствует альтернативное имя субъекта»


98

Недавно Chrome перестал работать с моими самоподписанными сертификатами SSL и считает их небезопасными. Когда я смотрю на сертификат на DevTools | Securityвкладке, я вижу, что он говорит

Отсутствует альтернативное имя субъекта Сертификат для этого сайта не содержит расширения альтернативного имени субъекта, содержащего доменное имя или IP-адрес.

Ошибка сертификата Возникли проблемы с цепочкой сертификатов сайта (net :: ERR_CERT_COMMON_NAME_INVALID).

Как я могу это исправить?


33
Почему это не вопрос программирования ... он о самоподписывающихся сертификатах, которые являются частью создания вашего стека. ,,, Спасибо, Брэд
Sweet Chilly Philly

1
CN=www.example.comнаверное не так. Имена хостов всегда попадают в SAN . Если он присутствует в CN , то он также должен присутствовать в SAN (в этом случае вы должны указать его дважды). Дополнительные правила и причины см. В разделах «Как подписать запрос на подпись сертификата в центре сертификации» и « Как создать самоподписанный сертификат с помощью openssl?». Вам также необходимо будет поместить самозаверяющий сертификат в соответствующее хранилище доверенных сертификатов.
jww

@jww - это не дубликат этого вопроса, так как вам не нужно создавать сертификат с помощью openssl, вы можете создать его с помощью других инструментов.
Брэд Паркс

1
@BradParks - Хммм ... Вопрос был помечен как OpenSSL, и принятый ответ использует OpenSSL. Я снова открыл и удалил тег OpenSSL.
jww

Ответы:


104

Чтобы исправить это, вам нужно указать дополнительный параметр 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 игнорировать все ошибки SSL для ВСЕХ сайтов, запустив его со специальной опцией командной строки, как подробно описано здесь. на SuperUser


2
Не уверен, какую версию XAMPP вы используете, но если вы ищете в этом файле строку, содержащую «openssl x509», вы сможете добавить указанное выше в конец этой строки в файле. Например, эта версия makecert.bat , имеет его на линии 9, и будет в конечном итоге: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Конечно, вам все равно нужно сохранить v3.ext файл в той же папке.
Брэд Паркс

1
Я отказался от хрома, попробовав все, и продолжил работу с другим браузером. Через несколько дней, сегодня проверил с хромом, работает !!! Вероятно, в Chrome была ошибка, и они ее исправили. Ваш метод поиска альтернативного имени субъекта работает !!!! Просто добавьте в браузер сертифицированные корневые сертификаты.
Тарик

35
Я получаю unknown option -extfile. Как это исправить?
Nick Manning

2
@NickManning - Может быть, вы используете extfileдирективу не в той команде openssl? Вместо того, чтобы использоваться в openssl req -new ..., он используется в openssl x509 -req .... По крайней мере, это то, что здесь кто-то сказал , что кажется правдой из примера
Брэд Паркс

2
"предоставить дополнительный параметр для openssl" К какой конкретно команде? Есть несколько шагов , участвующих и этот ответ слишком расплывчатый: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/...
user145400

34

Следующее решение сработало для меня на 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

2
Это круто! Именно то, что мне нужно, и он пропускает раздражающие запросы о таких вещах, как название компании, штат и тому подобное.
coredumperror

2
Я пробовал несколько альтернативных решений, но это единственное, что сработало для меня. Спасибо!!
Mirko

1
Вы можете передать тему из командной строки: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Ярослав Заруба

как ты импортировал в хром? Здесь не basicConstraints = CA:trueпропали?
woodz

19

Bash скрипт

Я создал сценарий bash, чтобы упростить создание самозаверяющих сертификатов TLS, действующих в Chrome.

Протестировано Chrome 65.xи все еще работает. Обязательно перезапустите Chrome после установки новых сертификатов.

chrome://restart



Другие источники

Еще один (гораздо более надежный) инструмент, на который стоит обратить внимание - это cfsslнабор инструментов CloudFlare :


2
Вы должны добавить сюда сценарий и объяснить его.
jww

Вроде хороший сценарий. Но сценарий (напрямую) не дает реального ответа на вопрос, в чем проблема OP. Может быть, объясните, в чем его проблема.
bshea

4

Я просто использую -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, для создания сертификатов без запроса.


3
не работает для. кажется , хром не признает Сан - этот путь
Мононоке

У меня возникли «проблемы с запросом сертификата» на OpenSSL 1.1.0b с помощью этой команды.
Рик

Для меня (Windows) работал немного другой синтаксис: openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS затем нужен *.pfxформат:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán

3

У меня было так много проблем с получением самозаверяющих сертификатов, работающих в macos / Chrome. Наконец я нашел Mkcert, «простой инструмент с нулевой конфигурацией, позволяющий создавать локально доверенные сертификаты разработки с любыми именами». https://github.com/FiloSottile/mkcert


Он работает и на моей Windows 10 в новом Chrome. Хотя мне пришлось скопировать файлы .pem из папки Windows \ system32 по умолчанию в другую, потому что Nginx не может получить доступ к этой папке.
vatavale

2
  • Сделайте копию своей конфигурации 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


1

Мне удалось избавиться от (net :: ERR_CERT_AUTHORITY_INVALID), изменив значение DNS.1 файла v3.ext

[alt_names] DNS.1 = domainname.com

Измените domainname.com на свой собственный домен.


1

Вот очень простой способ создать сертификат 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"


0

на MAC, начиная с версии 67.0.3396.99 Chrome, мой самозаверяющий сертификат перестал работать.

регенерация со всем написанным здесь не сработала.

ОБНОВИТЬ

удалось подтвердить, что мой подход работает сегодня :). Если это не сработает, убедитесь, что вы используете этот подход.

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 и подтвердил, что дата создания - сегодня - так что это тот, который я только что создал.

надеюсь, что это будет полезно для кого-то потратить на это как день.

никогда не обновляйте хром!


0

Если вы хотите запустить свой сервер localhost, вам необходимо настроить 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.