Версия OpenSSL V3 с альтернативным именем объекта

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

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

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

Однако это не работает. Моя догадка заключается в том, что тема Alternative Name не отображается в b/c, ее нет в спецификациях 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

Ответ 1

Вот вам простые шаги

При создании 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

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

Ответ 2

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

[ 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).

Ответ 3

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

Возможно, вы не ставите

subjectAltName=email: копия

в разделе

[v3_req]

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

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

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

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

-extensions v3_req

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

Ответ 4

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

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

-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

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

# 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

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

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

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

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

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

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

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;
    }
}

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

Я ссылался на несколько страниц, и наиболее значимые справки: 1. https://geekflare.com/san-ssl-certificate/, 2. https://certificatetools.com/ (см. Ответ от пользователя 40662) и 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