Сертификат OpenSSL (версия 3) с альтернативным именем субъекта

Я использую инструмент командной строки OpenSSL для создания самозаверяющего сертификата. Вроде работает правильно, за исключением двух проблем. Я не могу заставить его создать .cer с Альтернативным именем субъекта (критично) и не могу понять, как создать сертификат Версии 3 (не уверен, что это критично, но предпочел бы узнать, как установить версию).

Кто-нибудь сделал это успешно? Файл конфигурации по умолчанию (.cfg) имеет, казалось бы, четкую документацию (см. Ниже):

Это материал для subjectAltName и issuerAltname. Импортируйте адрес электронной почты. subjectAltName=электронная почта:копировать

Однако это не работает. Я предполагаю, что альтернативное имя темы не отображается, потому что его нет в спецификациях V1, поэтому я также пытаюсь установить версию.

Вот файл конфигурации, который я использую:

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
emailAddress        = [email protected]
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy

person Kandres22    schedule 31.05.2011    source источник


Ответы (9)


Вот простые шаги для вас

При создании CSR вы должны использовать -config и -extensions, а при создании сертификата вы должны использовать -extfile и -extensions

Вот пример:

openssl req -new -nodes -keyout test.key  -out test.csr -days 3650 -subj "/C=US/ST=SCA/L=SCA/O=Oracle/OU=Java/CN=test cert" -config /etc/pki/tls/openssl.cnf -extensions v3_req
openssl x509 -req -days 3650 -in test.csr -CA cacert.pem -CAkey rootCA.key -CAcreateserial -out test.pem -extfile /etc/pki/tls/openssl.cnf  -extensions v3_req

надеюсь это поможет

person Raghu K Nair    schedule 22.07.2014

Хорошо, ни один из других ответов на этой странице мне не помог, и я попробовал каждый из них до последнего. Что сработало для меня, так это небольшая хитрость:

при запросе сертификата:

-config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-reqexts SAN

и при подписании сертификата:

-extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
-extensions SAN

Обратите внимание, что это трюк с bash, <(some comamnds) делает вывод some commands на стандартный вывод some commands в виде временного файла для внешних команд в bash.

Чтобы не было путаницы, вот рабочий скрипт, который охватывает все с самого начала, включая создание центра сертификации:

# if the server name is undefined, lets default to 'Some-Server'
SERVER="${SERVER:-Some-Server}"

CORPORATION=My-Corp
GROUP=My-Corporate-Group
CITY=City
STATE=State
COUNTRY=US

CERT_AUTH_PASS=`openssl rand -base64 32`
echo $CERT_AUTH_PASS > cert_auth_password
CERT_AUTH_PASS=`cat cert_auth_password`

# create the certificate authority
openssl \
  req \
  -subj "/CN=$SERVER.ca/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -new \
  -x509 \
  -passout pass:$CERT_AUTH_PASS \
  -keyout ca-cert.key \
  -out ca-cert.crt \
  -days 36500

# create client private key (used to decrypt the cert we get from the CA)
openssl genrsa -out $SERVER.key

# create the CSR(Certitificate Signing Request)
openssl \
  req \
  -new \
  -nodes \
  -subj "/CN=$SERVER/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
  -sha256 \
  -extensions v3_req \
  -reqexts SAN \
  -key $SERVER.key \
  -out $SERVER.csr \
  -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -days 36500

# sign the certificate with the certificate authority
openssl \
  x509 \
  -req \
  -days 36500 \
  -in $SERVER.csr \
  -CA ca-cert.crt \
  -CAkey ca-cert.key \
  -CAcreateserial \
  -out $SERVER.crt \
  -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$SERVER")) \
  -extensions SAN \
  -passin pass:$CERT_AUTH_PASS

Затем мы можем убедиться, что альтернативное имя субъекта находится в окончательном сертификате:

openssl x509 -in Some-Server.crt -text -noout

Соответствующий раздел:

    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:Some-Server

Так это сработало! Это сертификат, который будет принят всеми основными браузерами (включая Chrome), если вы установите центр сертификации в браузере. Это ca-cert.crt, которое вам нужно будет установить.

Вот пример конфигурации для nginx, которая позволит вам использовать сертификат:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost:443;

    ssl_certificate /etc/ssl/certs/Some-Server.crt;
    ssl_certificate_key /etc/ssl/private/Some-Server.key;
    ssl_dhparam /etc/ssl/certs/https-dhparam.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
person Jack Davidson    schedule 18.12.2018
comment
Хороший скрипт работает везде кроме андроида. =( При попытке установить crt Android выдает следующую ошибку Для установки требуется закрытый ключ - person Michael Hobbs; 05.01.2020
comment
@Jack Davidson: Похоже, ваш скрипт имеет перенаправление ввода в стиле /bin/bash. Например: -config <(cat [snip]). Возможно, вы захотите отредактировать свой ответ, чтобы четко указать, что это сценарий bash. @Michael Hobbs: оболочка по умолчанию на Android может отличаться от bash. - person mpb; 12.05.2020
comment
Выше не заключайте одинарные кавычки в -config '<(cat ...)', иначе оболочка будет рассматривать его как литеральную строку. В скрипте отображается правильно. К сожалению, SO не позволит мне редактировать. - person rgov; 21.09.2020
comment
@rgov - спасибо, что заметили это. я обновил ответ - person Jack Davidson; 22.09.2020
comment
Очень красивое решение, где пароль ЦС используется только при создании ключей, а потом сбрасывается. Намного безопаснее, спасибо! - person Will59; 09.10.2020

Я заставил его работать со следующей версией (адрес электронной почты был размещен неправильно):

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
req_extensions          = v3_req
x509_extensions         = v3_ca

[req_distinguished_name]
C = [Press Enter to Continue]
C_default = US 
C_min = 2 
C_max = 2 

O = [Press Enter to Continue]
O_default = default 

0.OU=[Press Enter to Continue]
0.OU_default = default 
1.OU=[Press Enter to Continue]
1.OU_default = PKI 
2.OU=[Press Enter to Continue] 
2.OU_default = ABCD
commonName = Public FQDN of server 
commonName_max = 64
emailAddress = [Press Enter to Continue] 
emailAddress_default = [email protected]

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:[email protected]
issuerAltName          = issuer:copy

Примечания:

  • Для создания сертификата я использовал:

    openssl req -config req.cnf -new -nodes -out req.pem -x509
    
  • Я не видел большого применения для issuerAltname (если есть, мне было бы интересно узнать где).
  • Использование issuer:always не рекомендуется для authorityKeyIdentifier.
  • Использование email:copy теперь работает с subjectAltName.
  • Раздел v3_req лишний (как и строка req_extensions.
person Mathias Brossard    schedule 14.06.2011

Я только что разработал веб-инструмент, который автоматически сгенерирует эту команду на основе ввода формы и отобразит вывод.


ОБНОВЛЕНИЕ: см. certificatetools.com

Он стал настолько популярен, что я улучшил его и опубликовал под собственным доменным именем.

Он не только предоставит вам загружаемый файл .csr, но также предоставит команды openssl, которые использовались для его создания, и необходимые параметры конфигурации openssl.cnf.

Пример:

Команды OpenSSL

#generate the RSA private key
openssl genpkey -outform PEM -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out priv.key

#Create the CSR
openssl req -new -nodes -key priv.key -config csrconfig.txt -out cert.csr

Конфигурация OpenSSL CSR

[ req ]
default_md = sha256
prompt = no
req_extensions = req_ext
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
commonName = example.com
countryName = US
stateOrProvinceName = Louisiana
localityName = Slidell
organizationName = Acme Inc.
[ req_ext ]
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=critical,serverAuth,clientAuth
subjectAltName = @alt_names
[ alt_names ]
IP.0 = 1.1.1.1
IP.1 = 2.2.2.2
DNS.0 = server1.example.com
DNS.1 = server2.example.com
email.0 = [email protected]
email.1 = [email protected]
person Lyas Spiehler    schedule 27.10.2015
comment
Инструмент аккуратный и все такое, но я бы действительно предложил удалить генерацию закрытых ключей. Если вы создаете закрытые ключи на сервере вне вашего контроля (например, на том, на котором размещен ваш инструмент), они по определению НЕ больше не являются закрытыми. - person recke96; 17.01.2021
comment
Я не рекомендую использовать ключи, сгенерированные с помощью этого инструмента, в производственной среде, но я не смогу создавать CSR или сертификаты без предварительного создания закрытого ключа. Инструмент предназначен для обучения, тестирования и прототипирования. Каждая операция, выполняемая на сайте, возвращает все команды OpenSSL, поэтому все можно сделать конфиденциально, в автономном режиме. Это одно из преимуществ этого инструмента перед другими. - person Lyas Spiehler; 19.01.2021
comment
Ты больше доверяешь людям, чем я. Если он готов к работе, кто-нибудь им воспользуется... - person recke96; 19.01.2021

Какую команду вы использовали для запроса сертификата CSR? Какую команду вы использовали для создания файла сертификата? Разные ответы для разных обстоятельств вы знаете.

Может ты не ставишь

subjectAltName=электронная почта:копировать

в разделе

[v3_req]

Возможно, вы используете openssl x509 для создания сертификата, если это так, вы должны использовать

-extfile /etc/pki/tls/openssl.cnf

потому что без этого он не использует ваш файл конфигурации

Вам также может понадобиться

-расширения v3_req

переключатель командной строки

person user1844882    schedule 14.02.2014

Я упомянул несколько страниц, и наиболее важные справки находятся на 1. https://geekflare.com/san-ssl-certificate/, 2. https://certificatetools.com/ (см. ответ от user40662) и 3. ответ Raghu K Nair об использовании команды.

Тогда моя успешная попытка:

san.cnf

[ req ]
default_bits       = 2048
default_md         = sha256
distinguished_name = req_distinguished_name
req_extensions     = v3_req
[ req_distinguished_name ]
countryName            = CN                     # C=
stateOrProvinceName    = Shanghai               # ST=
localityName           = Shanghai               # L=
#postalCode             = 200000                 # L/postalcode=
#streetAddress          = "My Address"           # L/street=
organizationName       = My Corporation         # O=
organizationalUnitName = My Department          # OU=
commonName             = myname.mysoftware.mycorporation.com # CN=
emailAddress           = [email protected]     # CN/emailAddress=
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1   = myname.mysoftware.mycorporation.com
#DNS.2   = other2.com
#DNS.3   = other3.com

Команда:

openssl req -x509 -nodes -days 365 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=My Corporation/OU=My Department/CN=myname.mysoftware.mycorporation.com/[email protected]" -keyout privateKey.pem -out certificate.crt -config san.cnf -extensions v3_req
person robbie fan    schedule 17.04.2019

v3_req требуется с записью subjectAltName в файле конфигурации. Команда

openssl x509 ... -extfile openssl.cnf -extensions v3_req

вставит SAN в сертификат.

person Dominic    schedule 10.03.2016

Я знаю, что этот поток немного устарел, но на всякий случай, если он работает для всех в Windows, убедитесь, что файл закодирован в кодировке UTF-8, в моем случае я получил сообщение об ошибке, указывающее на ошибку с файлом .cnf, поэтому я открыл его в Notepad ++, установил кодировку файла в UTF-8, сохранил и снова запустил команду openssl, и это помогло.

person OscarG    schedule 28.07.2017

person    schedule
comment
Я попробовал, это работает, но CA, сгенерированный с опцией nodes (шаг 4), оставляет дыру в безопасности открытой, я думаю... - person Will59; 09.10.2020
comment
@Will59 - Является ли незашифрованный закрытый ключ дырой в безопасности, зависит (IMO) от вашего варианта использования и требований безопасности. В комментарии к сценарию четко указаны последствия -nodes. Если вам требуется зашифрованный закрытый ключ, внесите необходимые изменения. Если вы создаете свой собственный ЦС, надеюсь, у вас достаточно базовых знаний, чтобы понять выбор и связанные с ним последствия. Мой пример должен был быть простым и пояснительным, и (IMO) -nodes проще, чем шифрование закрытого ключа. - person mpb; 10.10.2020