Версия 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;
}
}
Ответ 5
Я только что разработал веб-инструмент, который будет генерировать эту команду автоматически на основе ввода формы и отображения вывода. http://kernelmanic.com/certificate-request-generator-with-multiple-common-names-and-subject-alternative-names/
Ответ 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