Как доверять самозаверяющим сертификатам localhost в Linux Chrome и Firefox - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь сгенерировать самоподписанный сертификат для настраиваемого локального домена, указывающего на 127.0.0.1:

# /etc/hosts
127.0.0.1 subdomain.domain.local

Я сгенерировал самоподписанный сертификат с использованием openssl и помню, что все работалов прошлом.Но, похоже, что начиная с Chrome 58, есть гораздо больше ограничений на использование самозаверяющих сертификатов.

Мои попытки заканчиваются " Ваше соединение не является частным " с одной из следующих ошибок:

  • " сертификат безопасности не является доверенным ", если я продолжу, как в прошлом.
  • " не является центром сертификации ", когдапытаюсь импортировать его в Chrome.
  • " отсутствует альтернативное имя субъекта " при использовании сертификата после импорта его CA.

Я почти уверен, что 'Я что-то упустил в процессе.Кто-нибудь может предоставить действительную конфигурацию для обработки альтернативных имен вместе с точными шагами по созданию соответствующего ЦС и сертификата, чтобы Chrome и Firefox могли обрабатывать мой локальный настраиваемый домен?

1 Ответ

0 голосов
/ 11 июня 2018

TLDR

  1. Создать файл generate.sh

    #!/usr/bin/env bash
    find . \( -name "$1.*" -o -name "*.srl" \) -type f -delete
    cp /usr/lib/ssl/openssl.cnf $1.cnf
    python <(
    cat << "END"
    import sys
    from ConfigParser import ConfigParser
    from StringIO import StringIO
    
    domain = sys.argv[1]
    
    config = ConfigParser()
    config.optionxform = lambda option: option
    
    name = "{}.cnf".format(domain)
    
    with open(name, "rb") as stream:
      config.readfp(StringIO("[top]\n" + stream.read()))
    
    config.set(" v3_ca ", "subjectKeyIdentifier", "hash")
    config.set(" v3_ca ", "authorityKeyIdentifier", "keyid:always,issuer")
    config.set(" v3_ca ", "basicConstraints", "critical, CA:TRUE, pathlen:3")
    config.set(" v3_ca ", "keyUsage", "critical, cRLSign, keyCertSign")
    config.set(" v3_ca ", "nsCertType", "sslCA, emailCA")
    
    config.set(" v3_req ", "basicConstraints", "CA:FALSE")
    config.set(" v3_req ", "keyUsage", "nonRepudiation, digitalSignature, keyEncipherment")
    config.set(" v3_req ", "subjectAltName", "@alt_names")
    config.remove_option(" v3_req ", "extendedKeyUsage")
    
    config.add_section(" alt_names ")
    config.set(" alt_names ", "DNS.1", domain)
    config.set(" alt_names ", "DNS.2", "*.{}".format(domain))
    
    config.set(" req ", "req_extensions", "v3_req")
    
    with open(name, "wb") as stream:
        config.write(stream)
    END
    ) $1
    tail -n +2 $1.cnf > $1.cnf.tmp && mv $1.cnf.tmp $1.cnf
    echo "$1\n" | openssl genrsa -aes256 -out $1.ca.key 2048
    chmod 400 $1.ca.key
    openssl req -new -x509 -subj "/CN=$1" -extensions v3_ca -days 3650 -key $1.ca.key -sha256 -out $1.ca.crt -config $1.cnf
    openssl genrsa -out $1.key 2048
    openssl req -subj "/CN=$1" -extensions v3_req -sha256 -new -key $1.key -out $1.csr
    openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $1.csr -CA $1.ca.crt -CAkey $1.ca.key -CAcreateserial -out $1.crt -extfile $1.cnf
    openssl x509 -in $1.crt -text -noout
    
  2. Вызов ./generate.sh example.com

    Требуется Python 2


Все кредиты отправляются этой превосходной статье Фабиана Ли.

Создание доверенного сертификата CA и SAN с использованием OpenSSL

  1. Настройка openssl.cnf
  2. Создание сертификата CA
  3. Создание сертификата сервера с SAN, подписанного CA

Предварительное условие

В качестве предварительного условия убедитесь, что установлены пакеты SSL:

$ sudo apt install libssl1.0.0 -y

Настроенный openssl.cnf

Первый шаг - захватить openssl.cnf шаблон доступен в вашей системе.В Ubuntu это можно найти на /usr/lib/ssl/openssl.cnf.Вы можете найти это в /System/Library/OpenSSL/ для MacOS и /etc/pki/tls для вариантов Redhat.

export prefix="mydomain"

cp /usr/lib/ssl/openssl.cnf $prefix.cnf

$prefix.cnf необходимо изменить, указав конкретную информацию о сертификате, который мы собираемся создать.

В разделе [ v3_ca ] добавьте следующие значения.Для ЦС это означает, что мы создаем ЦС, который будет использоваться для подписи ключей.

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:3
keyUsage = critical, cRLSign, keyCertSign
nsCertType = sslCA, emailCA

Затем в разделе [ v3_req ] задайте следующее вместе со всеми действительными альтернативными именами для этого сертификата.

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#extendedKeyUsage=serverAuth
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = mydomain.com 
DNS.2 = *.dydomain.com

Также раскомментируйте следующую строку в разделе [ req ], чтобы запросы сертификатов создавались с расширениями v3.

req_extensions = v3_req

Когда мы генерируем каждый тип ключа, мы указываем, какойраздел расширения, который мы хотим использовать, поэтому мы можем поделиться $prefix.cnf для создания как CA, так и сертификата SAN.

Создать сертификат CA

Теперь мы начнем использовать OpenSSL длясоздать необходимые ключи и сертификаты.Сначала сгенерируйте пару закрытых / открытых ключей RSA:

openssl genrsa -aes256 -out ca.key.pem 2048

chmod 400 ca.key.pem

Кодирует файл ключа с использованием ключевой фразы на основе AES256.Затем нам нужно создать самозаверяющий сертификат корневого CA.

openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf

Вы можете проверить этот сертификат корневого CA, используя:

openssl x509 -in ca.pem -text -noout

Это покажет сертификат корневого CA иIssuer и Subject будут одинаковыми, поскольку они являются самозаверяющими.Это помечено как CA:TRUE, что означает, что он будет распознан как сертификат корневого ЦС;Это означает, что браузеры и ОС позволят импортировать его в хранилище доверенных корневых сертификатов.

Issuer: CN=myca 
... 
Subject: CN=myca 
... 
X509v3 Basic Constraints: 
  critical CA:TRUE, pathlen:3 
X509v3 Key Usage: 
  critical Certificate Sign, CRL Sign 
Netscape Cert Type: 
  SSL CA, S/MIME CA

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

После создания корневого CA мы переключаемся насертификат сервера.Сначала сгенерируйте пару закрытых / открытых ключей RSA:

openssl genrsa -out $prefix.key.pem 2048

Мы не ставили парольную фразу для этого ключа просто потому, что ЦС является более ценной целью, и мы всегда можем восстановить сертификат сервера, но не стесняйтесьпримите дополнительные меры предосторожности.

Затем создайте запрос на подпись сертификата сервера:

openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr

Затем сгенерируйте сертификат сервера, используя: запрос на подпись сервера, ключ подписи CA и сертификат CA.

openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $prefix.csr -CA ca.pem -CAkey ca.key.pem -CAcreateserial -out $prefix.crt -extfile $prefix.cnf

$prefix.key.pem - это закрытый ключ сервера, а $prefix.crt - сертификат сервера.Проверьте сертификат:

openssl x509 -in $prefix.crt -text -noout

Это покажет сертификат, и Issuer будет именем CA, а Subject является префиксом.Это не установлен как CA, и поле Subject Alternative Name содержит URL-адреса, которые будут считаться действительными браузерами.

Issuer: 
 CN=myca 
... 
Subject: 
  CN=mydomain 
... 
X509v3 Basic Constraints: 
  CA:FALSE 
X509v3 Key Usage: 
  Digital Signature, Non Repudiation, Key Encipherment 
X509v3 Subject Alternative Name:
  DNS:mydomain.com, DNS:*.mydomain.com

Оценка браузера

Когда вы впервые указываете Chrome или Firefoxна сайте с вашим сертификатом SAN с подписью CA он выдаст исключения того же типа, что и самозаверяющий сертификат SAN.Это связано с тем, что сертификат корневого центра сертификации не известен как надежный источник для подписанных сертификатов.

Chrome

Linux

В Linux Chrome управляет собственным хранилищем сертификатов и сноваследует импортировать ca.pem в Authorities.Теперь значок безопасности должен стать зеленым.enter image description here

Windows

В настройках Chrome (chrome://settings) найдите certificates и нажмите Manage Certificates.В Windows откроется диспетчер сертификатов Windows, и вы должны импортировать файл ca.pem на вкладке Trusted Root Certification Authorities.Это эквивалентно добавлению через mmc.exe в local user доверенном корневом хранилище (не на уровне компьютера).

Firefox

В параметрах Firefox about:preferences найдите certificates и нажмите View Certificates.Перейдите на вкладку Authorities и импортируйте ca.pem.Установите флажок, чтобы он доверял веб-сайтам, и теперь значок замка должен становиться зеленым при посещении страницы.enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...