Как подписать запрос на подписание сертификата с вашим центром сертификации?
во время моего поиска я нашел несколько способов подписания запроса на подписание сертификата SSL:
-
С помощью
x509
модуль:openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
-
С помощью
ca
модуль:openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
примечание:Я не уверен в использовании правильных параметров для этого. Пожалуйста, посоветуйте правильное использование, если я должен использовать его.
какой способ следует использовать для подписания запросов сертификатов с вашим центром сертификации? Есть один метод лучше, чем другой (например, один из них устарел)?
2 ответа:
1. Using the x509 module openssl x509 ... ... 2 Using the ca module openssl ca ... ...
то, что вам не хватает, - это прелюдия к этой команде.
это двухэтапный процесс. Сначала вы настраиваете свой ЦС, а затем подписываете сертификат конечного объекта (например, сервер или пользователь). Обе эти команды объединяют два шага в один. И оба предполагают, что у вас уже есть файл конфигурации OpenSSL для сертификатов CAs и сервера (end entity).
во-первых, создать базовый настройки файл:
$ touch openssl-ca.cnf
затем добавьте к нему следующий код:
HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ ca ] default_ca = CA_default # The default ca section [ CA_default ] default_days = 1000 # how long to certify for default_crl_days = 30 # how long before next CRL default_md = sha256 # use public key default MD preserve = no # keep passed DN ordering x509_extensions = ca_extensions # The extensions to add to the cert email_in_dn = no # Don't concat the email in the DN copy_extensions = copy # Required to copy SANs from CSR to cert #################################################################### [ req ] default_bits = 4096 default_keyfile = cakey.pem distinguished_name = ca_distinguished_name x509_extensions = ca_extensions string_mask = utf8only #################################################################### [ ca_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = US stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Maryland localityName = Locality Name (eg, city) localityName_default = Baltimore organizationName = Organization Name (eg, company) organizationName_default = Test CA, Limited organizationalUnitName = Organizational Unit (eg, division) organizationalUnitName_default = Server Research Department commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = Test CA emailAddress = Email Address emailAddress_default = test@example.com #################################################################### [ ca_extensions ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always, issuer basicConstraints = critical, CA:true keyUsage = keyCertSign, cRLSign
поля над a взяты из более сложного
openssl.cnf
(вы можете найти его в/usr/lib/openssl.cnf
), но я думаю, что они необходимы для создания сертификата CA и закрытого ключа.настроить поля выше, чтобы удовлетворить ваш вкус. Значения по умолчанию позволяют сэкономить время от ввода одной и той же информации при экспериментировании с конфигурационным файлом и параметрами команды.
я опустил список отзыва сертификатов соответствующих материалов, но и операций по Центр сертификации должен иметь их. Смотрите
openssl.cnf
и связанные с .затем выполните следующие действия. Элемент
-nodes
опускает пароль или парольную фразу, чтобы вы могли проверить сертификат. Это а действительноплохо идея опустить пароль или парольную фразу.$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
после выполнения команды
cacert.pem
будет ваш сертификат для операций CA, иcakey.pem
будет закрытый ключ. Отзыв закрытый ключ не есть пароль или парольная фраза.вы можете сбросить сертификат со следующим.
$ openssl x509 -in cacert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Validity Not Before: Jan 24 14:24:11 2014 GMT Not After : Feb 23 14:24:11 2014 GMT Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d: ... 39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b: 59:05:9f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A X509v3 Authority Key Identifier: keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption 4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7: ... cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5: 38:ff:fd:55:68:2c:3e:37
и проверить его цель со следующим (Не беспокойтесь о
Any Purpose: Yes
; см. "критический, CA: FALSE" но "любая цель CA: да").$ openssl x509 -purpose -in cacert.pem -inform PEM Certificate purposes: SSL client : No SSL client CA : Yes SSL server : No SSL server CA : Yes Netscape SSL server : No Netscape SSL server CA : Yes S/MIME signing : No S/MIME signing CA : Yes S/MIME encryption : No S/MIME encryption CA : Yes CRL signing : Yes CRL signing CA : Yes Any Purpose : Yes Any Purpose CA : Yes OCSP helper : Yes OCSP helper CA : Yes Time Stamp signing : No Time Stamp signing CA : Yes -----BEGIN CERTIFICATE----- MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV ... aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP tTj//VVoLD43 -----END CERTIFICATE-----
для второй части я собираюсь создать еще один файл conf, который легко усваивается. Во-первых,
touch
theopenssl-server.cnf
(вы можете сделать одну из них сертификаты пользователей также).$ touch openssl-server.cnf
затем откройте его и добавьте следующее.
HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ req ] default_bits = 2048 default_keyfile = serverkey.pem distinguished_name = server_distinguished_name req_extensions = server_req_extensions string_mask = utf8only #################################################################### [ server_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = US stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = MD localityName = Locality Name (eg, city) localityName_default = Baltimore organizationName = Organization Name (eg, company) organizationName_default = Test Server, Limited commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = Test Server emailAddress = Email Address emailAddress_default = test@example.com #################################################################### [ server_req_extensions ] subjectKeyIdentifier = hash basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" #################################################################### [ alternate_names ] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = mail.example.com DNS.4 = ftp.example.com
если вы разрабатываете и вам нужно использовать свою рабочую станцию в качестве сервера, вам может потребоваться сделать следующее для Chrome. В противном случае Chrome может жаловаться a Общее Название является недействительным (
ERR_CERT_COMMON_NAME_INVALID
). Я не уверен, что связь между IP-адресом в SAN и CN в этом случае.# IPv4 localhost IP.1 = 127.0.0.1 # IPv6 localhost IP.2 = ::1
затем создайте сервер запрос сертификата. Будьте уверены, чтобы пропустить
-x509
*. Добавление-x509
создаст сертификат, а не запрос.$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM
после выполнения этой команды, вы будете иметь запрос в
servercert.csr
и закрытый ключ вserverkey.pem
.и вы можете проверить его снова.
$ openssl req -text -noout -verify -in servercert.csr Certificate: verify OK Certificate Request: Version: 0 (0x0) Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d: ... f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51: 86:e1 Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Subject Key Identifier: 1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61 X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com Netscape Comment: OpenSSL Generated Certificate Signature Algorithm: sha256WithRSAEncryption 6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81: ... 76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88: a9:63:d0:a7
Далее, вы должны подписать его с вашим CA.
вы почти готовы подписать сертификат сервера сертификации. ЦС
openssl-ca.cnf
нужны две дополнительные разделы перед выполнением команды.во-первых, открыть
openssl-ca.cnf
и добавить следующие два раздела.#################################################################### [ signing_policy ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ signing_req ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment
во-вторых, добавьте следующий к на
openssl-ca.cnf
. Я оставил их раньше, потому что они могут усложнить вещи (они не использовались в то время). Сейчас вы увидите, как они используются, так что надеюсь, они будут иметь смысл.base_dir = . certificate = $base_dir/cacert.pem # The CA certifcate private_key = $base_dir/cakey.pem # The CA private key new_certs_dir = $base_dir # Location for new certs after signing database = $base_dir/index.txt # Database index file serial = $base_dir/serial.txt # The current serial number unique_subject = no # Set to 'no' to allow creation of # several certificates with same subject.
в-третьих, сенсорный
index.txt
иserial.txt
:$ touch index.txt $ echo '01' > serial.txt
затем выполните следующее:
$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr
вы должны увидеть примерно следующий:
Using configuration from openssl-ca.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :ASN.1 12:'MD' localityName :ASN.1 12:'Baltimore' commonName :ASN.1 12:'Test CA' emailAddress :IA5STRING:'test@example.com' Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days) Sign the certificate? [y/n]:Y 1 out of 1 certificate requests certified, commit? [y/n]Y Write out database with 1 new entries Data Base Updated
после выполнения команды, вы будете иметь свежеиспеченный сертификат сервера в
servercert.pem
. Закрытый ключ был создан ранее и доступен вserverkey.pem
.наконец, вы можете проверить свой свежеотчеканенный сертификат следующим образом.
$ openssl x509 -in servercert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 9 (0x9) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Validity Not Before: Jan 24 19:07:36 2014 GMT Not After : Oct 20 19:07:36 2016 GMT Subject: C=US, ST=MD, L=Baltimore, CN=Test Server Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d: ... f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51: 86:e1 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61 X509v3 Authority Key Identifier: keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com Netscape Comment: OpenSSL Generated Certificate Signature Algorithm: sha256WithRSAEncryption b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a: ... 45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c: 56:a5:eb:c8:7e:9f:6b:7a
ранее вы добавили следующее в
CA_default
:copy_extensions = copy
. Это расширение копий, предоставленное человек, делающий запрос.если вы опустите
copy_extensions = copy
, тогда ваш сертификат сервера не будет содержать альтернативных имен субъектов (SANs), таких какwww.example.com
иmail.example.com
.если вы используете
copy_extensions = copy
но не просматривайте запрос, тогда запросчик может обмануть вас, подписав что-то вроде подчиненного корня (а не сервер или сертификат пользователя). Это означает, что он сможет чеканить сертификаты, которые цепляются обратно к вашему доверенному корню. Будьте уверены, чтобы проверить запрос сopenssl req -verify
перед подписанием.
если вы пропустить
unique_subject
, либоyes
, тогда вам будет разрешено создавать один сертификат под отличительным именем субъекта.unique_subject = yes # Set to 'no' to allow creation of # several ctificates with same subject.
попытка создать второй сертификат во время экспериментов приведет к следующему при подписании сертификата Вашего сервера с закрытым ключом CA:
Sign the certificate? [y/n]:Y failed to update database TXT_DB error number 2
так
unique_subject = no
идеально подходит для тестирование.
если требуется обеспечить согласованность имени организации между самозаверяющими сертификатами ЦС, подчиненного ЦС и конечного объекта, добавьте в файлы конфигурации ЦС следующее:
[ policy_match ] organizationName = match
если вы хотите изменить название организации, то используйте:
[ policy_match ] organizationName = supplied
существуют и другие правила, касающиеся обработки DNS-имен в сертификатах X. 509/PKIX. Обратитесь к этим документам для правила:
- RFC 5280,Internet X. 509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
- RFC 6125,представление и проверка удостоверения службы приложений на основе домена в инфраструктуре открытых ключей Интернета с использованием сертификатов X. 509 (PKIX) в контексте безопасности транспортного уровня (TLS)
- RFC 6797, приложение A, HTTP строгий транспорт Безопасность (HSTS)
- RFC 7469,расширение закрепления открытого ключа для HTTP
- CA / Browser Forum Базовые Требования
- CA / Browser Forum Расширенные Рекомендации По Проверке
RFC 6797 и RFC 7469 перечислены, потому что они являются более ограничительными, чем другие документы RFC и CA/B. RFC 6797 и 7469 не разрешить IP-адрес, либо.
в дополнение к ответу @jww , я хотел бы сказать, что конфигурация в openssl-ca.cnf
default_days = 1000 # how long to certify for
определяет по умолчанию нет дней сертификат, подписанный этим root-ca будет действителен, чтобы установить действительность самого root-ca, вы должны использовать опцию '-days n ' в
openssl req -x509 -days 3000 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
в противном случае ваш root-ca будет действителен только по умолчанию 1 месяц, и любой сертификат, подписанный этим rot-ca, также будет иметь срок действия 1 месяц.