Кошмар - создание самоподписанного SSL-сертификата, который работает

Кошмар - создание самоподписанного SSL-сертификата, который работает

У меня есть интранет-сервер, на котором мне нужно установить SSL.

Этоopenssl.cnf

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
req_extensions          = req_ext
#prompt = no

[ req_distinguished_name ]
countryName                     = US
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = CHICAGO
localityName                    = CHICAGO
0.organizationName              = MY COMPANY
organizationalUnitName          = IOS DEVELOPMENT
commonName                      = server2.myserver.local
commonName_max                  = 64
emailAddress                    = [email protected]
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = password
challengePassword_min           = 4
challengePassword_max           = 20

[ req_ext ]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = server2.myserver.local
DNS.2   = myserver.local

Вот команды, которые я использую для его создания.

  1. генерация корневого ключа CA

    openssl genrsa -des3 -out rootCA.key 4096
    

2. это генерация корневого сертификата CA

openssl req \
    -x509 -new -nodes \
    -key rootCA.key -sha256 \
    -days 825 \
    -out rootCA.crt \
    -subj /CN=server2.myserver.local \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:server2.myserver.local')) \
    -extensions 'req_ext'
  1. генерация ключа сертификата

    openssl genrsa -out mydomain.com.key 4096
    
  2. генерация сертификата

    openssl req -new -sha256 -key  mydomain.com.key \
     -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=server2.myserver.local" \
     -reqexts SAN \
     -config <(cat ./openssl.cnf \
         <(printf "\n[SAN]\nsubjectAltName=DNS:server2.myserver.local,DNS:myserver.local")) \
     -out mydomain.com.csr
    
  3. преобразование сертификата CA в p12

    openssl pkcs12 -export -out ca.p12 -inkey rootCA.key -in rootCA.crt  
    
  4. конвертация сертификата в p12

    openssl pkcs12 -export -out certificate.p12 -inkey mydomain.com.key -in mydomain.com.crt
    

Затем я устанавливаю ca.p12его certificate.p12на свой сервер IIS и на свои устройства.

Когда я пытаюсь посетитьserver2.myserver.local

я получил

введите описание изображения здесь

Как, во имя Святого Сертификата, мне это сделать?

решение1

Я бы сказал, что ваш корневой сертификат CA совершенно неверный. Сертификаты CA сильно отличаются от сертификатов TLS конечного хоста — вы не можете использовать одну и ту же конфигурацию для обоих.

  • Не указывайте домен сервера в теме — это бесполезно. Если это CA, то должно быть просто CN=My internal CAили что-то в этом роде.

  • Добавьте basicConstraintsрасширение. Оно должно указывать, что сертификат — это CA.

  • Добавьте правильный keyUsage. Вам нужно иметь 'keyCertSign' и (просто для полноты) 'cRLSign'.

  • Не добавляйте subjectAltName. Сертификат предназначен для органа/эмитента, а не для сервера!

  • Не добавляйте extendedKeyUsage. Иногда это используется для ограничения того, какие сертификаты может выдавать ЦС, но лучше начать без этой сложности.

  • Хорошая идея добавить subjectKeyIdentifier, на случай, если позже у вас окажется несколько внутренних CA с идентичными DN субъекта. (Обычно DN CA должны быть уникальными, но наличие SKI/AKI немного смягчает это.)

Итак, у вас должен быть файл конфигурации «CA», который выглядит примерно так (и прекратите добавлять SAN и прочее через командную строку — для этого и нужен этот файл конфигурации):

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
req_extensions          = req_ext

[ req_dn ]
countryName             = US
stateOrProvinceName     = Chicago
organizationName        = Company Name
organizationalUnitName  = iOS development
commonName              = Internal development CA

[ req_ext ]
basicConstraints        = critical, CA:TRUE
keyUsage                = keyCertSign, cRLSign
subjectKeyIdentifier    = hash

В то время как сертификат конечного объекта (TLS-сервера) должен иметь следующие расширения:

...
[ req_ext ]
basicConstraints        = CA:FALSE
keyUsage                = digitalSignature, keyEncipherment
extendedKeyUsage        = serverAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid, issuer
subjectAltName          = DNS:server2.myserver.local

Затем я устанавливаю ca.p12 и certificate.p12 на свой сервер IIS и на свои устройства.

Не устанавливайте закрытый ключ центра сертификации на свои устройства!Не устанавливайте его на сервер, также. Вы должны установитьтолькосертификат CA rootCA.crt(публичная часть) и ничего больше.


Моя последняя рекомендация: не тратьте время на попытки сделать CA с помощью raw openssl. Вместо этого используйтеEasy-RSA(тот, который идет с OpenVPN), или используйтеXCA(графическое приложение Linux) или используйте один извозможно, десяткиуже написанных и протестированных программ.

Связанный контент