Недійсний самопідписаний сертифікат SSL - "Альтернативна назва теми відсутня"


96

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

Тема Альтернативне ім’я відсутня Сертифікат для цього веб-сайту не містить розширення Тема Альтернативне ім’я, що містить доменне ім’я або IP-адресу.

Помилка сертифіката Є проблеми з ланцюжком сертифікатів сайту (net :: ERR_CERT_COMMON_NAME_INVALID).

Як я можу це виправити?


33
Як це не Питання програмування ..... це про сертифікати самопідпису, що є частиною створення вашого стека. ,,, Дякую Бред
Солодкий Чилі Філлі

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 від видавання помилок під час перегляду самопідписаного сертифіката, ви можете сказати 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, спробувавши все, і продовжив роботу з іншим браузером. Через кілька днів, сьогодні я перевірив хром, і він працює !!! Можливо, у Chrome виникла помилка, і вони її виправили. Ваш метод для альтернативного імені теми відсутній працює !!!! Просто додайте сертифіковані під надійні кореневі сертифікати у браузері.
Тарік

35
Я отримую unknown option -extfile. Як це виправити?
Нік Меннінг,

2
@NickManning - Може, ви використовуєте extfileдирективу в неправильній команді openssl? Замість того, щоб його використовувати в openssl req -new ..., він використовується в openssl x509 -req .... Принаймні, так сказав хтось тут , що здається вірним із прикладу, який я маю в іншій відповіді на подібне питання про те, як повністю генерувати ці сертифікати
Бред Паркс,

2
"поставити додатковий параметр до openssl" До якої команди конкретно?
Задіяно

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
Я спробував кілька альтернативних рішень, але це єдине, що працювало для мене. Дякую!!
Мірко

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

як ви імпортували в хром? Хіба тут не basicConstraints = CA:trueбракує?
woodz

19

Bash Script

Я створив скрипт 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, щоб генерувати сертифікати без запиту.


2
не працює для. здається, хром не розпізнає SAN таким чином
mononoke

Я отримав "проблеми із запитом на отримання сертифіката" на 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 Havránek

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 = ім'я домену.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 найкраще отримати файл openssl.exe з "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"


0

на 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/

ЗАВЕРШИТИ ОНОВЛЕННЯ

нарешті, я зміг побачити зелений захист, лише коли видалив мій сертифікат із системи та додав його до локального брелока. (якщо є - киньте його спочатку). Не знаю, чи це має значення, але в моєму випадку я завантажив сертифікат через 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.