Как вы подписываете запрос на подпись сертификата в своем сертификационном центре?

Во время моего поиска я нашел несколько способов подписания запроса на сертификацию SSL-сертификата:

  1. Использование модуля x509 :

     openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt 
  2. Использование модуля ca :

     openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt 

Примечание. Я не уверен в использовании правильных параметров для этого. Пожалуйста, сообщите правильное использование, если я его использую.

Какой способ следует использовать для подписывания сертификационных запросов в вашем Центре сертификации? Является ли один метод лучше, чем другой (например, один из них устарел)?

 1. Using the x509 module openssl x509 ... ... 2 Using the ca module openssl ca ... ... 

То, что вам не хватает, – это прелюдия к этой команде.

Это двухэтапный процесс. Сначала вы настраиваете свой ЦС, а затем подписываете сертификат конечной сущности (например, сервер или пользователь). Обе эти команды переходят на два шага в один. И оба предполагают, что у вас уже установлен файл конфигурации OpenSSL для сертификатов CA и Server (конечная сущность).


Сначала создайте базовый файл конфигурации :

 $ 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 (eg server FQDN or YOUR name) commonName_default = Test CA emailAddress = Email Address emailAddress_default = [email protected] #################################################################### [ ca_extensions ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always, issuer basicConstraints = critical, CA:true keyUsage = keyCertSign, cRLSign 

Поля выше взятого из более сложного openssl.cnf (вы можете найти его в /usr/lib/openssl.cnf ), но я думаю, что они являются основными для создания сертификата CA и закрытого ключа.

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

Я опустил релевантный материал CRL, но ваши операции с CA должны иметь их. См. openssl.cnf и соответствующий раздел crl_ext .

Затем выполните следующее. Параметр -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/[email protected] 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/[email protected] 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 , $ 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/[email protected] 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/[email protected] 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 openssl-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 (eg server FQDN or YOUR name) commonName_default = Test Server emailAddress = Email Address emailAddress_default = [email protected] #################################################################### [ 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 может пожаловаться на то, что общее имя недействительно ( ERR_CERT_COMMON_NAME_INVALID ) . Я не уверен, что отношения между IP-адресом в SAN и CN в этом случае.

 # IPv4 localhost IP.1 = 127.0.0.1 # IPv6 localhost IP.2 = ::1 

Затем создайте запрос сертификата сервера. Обязательно опустите -x509 *. Добавление -x509 создаст certifcate, а не запрос.

 $ 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/[email protected] 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.


Вы почти готовы подписывать сертификаты сервера своим CA. Перед выдачей команды 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 

Во-вторых, добавьте следующее в раздел [ CA_default ] в 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:'[email protected]' 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 ключ был создан ранее и доступен в 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/[email protected] 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 , то ваш сертификат сервера не будет copy_extensions = copy альтернативные имена (SAN) темы, такие как www.example.com и mail.example.com .

Если вы используете copy_extensions = copy но не просматриваете запрос, тогда запросчик может обмануть вас в подписание чего-то вроде подчиненного корня (а не сертификата сервера или пользователя). Это означает, что он сможет копировать сертификаты, которые возвращаются к вашему доверенному корню. Перед openssl req -verify обязательно проверьте запрос с помощью 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 Сертификат инфраструктуры открытых ключей и список отзыва сертификатов (CRL)
  • 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. 6797 и 7469 RFC также не разрешают IP-адрес.

В дополнение к ответу @jww, я хотел бы сказать, что конфигурация в openssl-ca.cnf

 default_days = 1000 # how long to certify for 

определяет значение по умолчанию no дней, которое сертификат, подписанный этим корнем-ca, будет действителен, чтобы установить правильность самого корневого-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 месяц.

  • Использование JavaMail с TLS
  • Игнорирование сертификата SSL в Apache HttpClient 4.3
  • Можно ли заменить обычный разъем на SSLSocket?
  • Как создать самозаверяющий сертификат с openssl?
  • Что происходит на проводе при настройке соединения TLS / LDAP или TLS / HTTP?
  • HTTPS с NSURLConnection - NSURLErrorServerCertificateUntrusted
  • Как переопределить шифрованный список, отправленный на сервер Android при использовании HttpsURLConnection?
  • Dyld: библиотека не загружена: /usr/lib/libcurl.4.dylib curl Ошибка SSL
  • Java SSLHandshakeException «нет общих наборов шифров»
  • Как установить разрешение на чтение файла закрытого ключа сертификата X.509 из .NET.
  • Как заставить SSL / https в Express.js
  • Давайте будем гением компьютера.