OpenSSL версии V3 с альтернативным именем субъекта - PullRequest
19 голосов
/ 01 июня 2011

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

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

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

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

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

[ req ]
default_bits        = 2048 
default_keyfile     = privkey.pem 
distinguished_name  = req_distinguished_name
emailAddress        = myEmail@email.com
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:myEmail@email.com
issuerAltName          = issuer:copy

Ответы [ 8 ]

16 голосов
/ 22 июля 2014

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

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

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

8 голосов
/ 14 июня 2011

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

[ 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 = myEmail@email.com

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

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName         = email:myEmail@email.com
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.
4 голосов
/ 18 декабря 2018

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

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

-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;
    }
}
3 голосов
/ 14 февраля 2014

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

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

SubjectAltName = электронная почта: копия

в разделе

[v3_req]

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

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

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

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

-extensions v3_req

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

0 голосов
/ 17 апреля 2019

Я ссылался на несколько страниц, и наиболее значимые подсказки: 1. https://geekflare.com/san-ssl-certificate/, 2. https://certificatetools.com/ (см. Ответ от пользователя 40662) и 3. ответ от Рагху К Наира о командеИспользование.

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

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           = myname@example.com     # 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/emailAddress=myname@example.com" -keyout privateKey.pem -out certificate.crt -config san.cnf -extensions v3_req
0 голосов
/ 29 июля 2017

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

0 голосов
/ 10 марта 2016

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

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

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

0 голосов
/ 27 октября 2015

Я только что разработал веб-инструмент, который будет автоматически генерировать эту команду на основе ввода формы и отображать вывод.http://kernelmanic.com/certificate-request-generator-with-multiple-common-names-and-subject-alternative-names/

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