Содержание статьи:
Разберем как поднять двухуровневую PKI (Root и Intermediate CA) инфраструктуру на базе OpenSSL в Debian 11 Bullseye.
Схема PKI (Root и Intermediate CA) инфраструктуры:
Используемые сервера и их обозначения в инструкции ниже:
- Корневой ЦС — rootCA
- Промедуточный ЦС — intermidiateCA
- OCSP Responder — intermidiateCA
- Веб-сервер — webCA
Устанавливаем OpenSSL на оба сервера (rootCA, intermidiateCA):
apt-get install openssl -y
Корневой центр сертификации (Offline Root CA)
Структура каталогов и файлов
Создадим структуру каталогов для хранения файлов ЦС, сертификатов и закрытых ключей:
mkdir -p /opt/CA/rootCA/{certs,crl,newcerts,private,csr} cd /opt/CA/rootCA
где:
certs | Этот каталог содержит сертификаты, сгенерированные и подписанные ЦС. |
crl | Каталог списка отзыва сертификатов (CRL) содержит списки отзыва сертификатов, сгенерированные ЦС. |
newcerts | В этом каталоге хранится копия каждого сертификата, подписанного ЦС, с серийным номером сертификата в качестве имени файла. |
private | Этот каталог содержит закрытые ключи для ЦС, включая закрытые ключи корневого ЦС и промежуточного ЦС. Эти ключи используются для подписи сертификатов и CRL. |
csr | В этом каталоге хранится копия каждого запроса сертификата. |
Создадим структуру файлов и зададим начальные значения, для некоторых их них:
touch index touch serial touch crlnumber openssl rand -hex 20 > serial echo 00 > crlnumber
где:
index | Выступает в качестве плоской базы для отслеживания выписанных сертификатов. |
serial | Используется для отслеживания последнего серийного номера, который был использован для выдачи сертификата. Важно, чтобы никогда не было выдано двух сертификатов с одинаковым серийным номером от одного и того же ЦС. |
crlnumber | Содержит текущий номер CRL. Номер CRL — это уникальное целое число, которое увеличивается каждый раз при создании нового списка отзыва сертификатов (CRL). Это помогает отслеживать последние CRL, выданные ЦС, и гарантировать, что CRL выдаются в надлежащей последовательности. |
Конфигурация Openssl
Создадим конфигурационный файл (/opt/CA/rootCA/openssl-rca.cnf) для корневого ЦС, со следующим содержанием (некоторые моменты я в конфигурации подсветил):
# # OpenSSL configuration for the Root Certification Authority. # [ ca ] default_ca = CA_default [ CA_default ] # Directory and file locations. dir = /opt/CA/rootCA certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index serial = $dir/serial RANDFILE = $dir/private/.rand # The root key and root certificate. private_key = $dir/private/rca.key certificate = $dir/certs/rca.crt # For certificate revocation lists. crlnumber = $dir/crlnumber crl = $dir/crl/rca.crl crl_extensions = crl_ext default_crl_days = 182 default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 3650 default_md = sha256 preserve = no unique_subject = no policy = policy_strict # For the CA policy [ policy_strict ] countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 default_keyfile = private/rca.key x509_extensions = v3_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, your name or your server hostname) emailAddress = Email Address [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer # As pathlen restricts creating any further intermidiate CA in the chain. basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign crlDistributionPoints = crldp1_section [ crl_ext ] # CRL extensions. authorityKeyIdentifier = keyid:always,issuer [ crldp1_section ] fullname = URI:http://ca.example.com/rca.crl
Поясления по отмеченным пунктам:
[ CA_default ] dir |
Путь к структуре каталогов CA. В случае если вы создавали структуру в отличном от статьи месте, то необходимо это отразить в конфигурации в этой директиве. |
[ CA_default ] default_days | Задается по-умолчанию срок действия выпускаемых сертификатов, для меня приемлемо 10 лет для издающих CA. |
[ v3_intermediate_ca ] basicConstraints | Обращаю внимание на параметр pathlen в директиве. Параметр pathlen ограничивает создание любого дополнительного промежуточного CA в цепочке. Если планируется или предпологается еще один несколько последущих промежуточных сертификатов CA, я бы рекомендовал либо присвоить более высокое значение для pathlen , либо просто удалить в следующем разделе. |
[ crldp1_section ] fullname | Указывется URL путь к списку отзыва сертификатов (CRL). Корректируем значение согласно своим данным веб-серера где будет размещатся CRL файл. |
Остальное все в целом стандартные параметры, можно оставлять без изменения.
Создание закрытого ключа Root CA
Создаем закрытый ключ RSA для корневого ЦС с использованием алгоритма шифрования AES-256 и надежным паролем:
openssl genrsa -aes256 -out private/rca.key 4096 Generating RSA private key, 4096 bit long modulus (2 primes) .................................................................................................................++++ ....................................................................++++ e is 65537 (0x010001) Enter pass phrase for private/rca.key: Verifying - Enter pass phrase for private/rca.key:
Можно сгенерировать закрытый ключ RSA без пароля:
openssl genrsa -out private/rca.key 4096
Если необходимо удалить пароль из закрытого ключа RSA, то сделать это можно так:
cp private/rca.key private/rca.key.orig openssl rsa -in private/rca.key.orig -passin pass:12345 -out private/rca.key rm private/rca.key.orig
где, в параметре — pass:12345
, указываем вместо 12345
ваш пароль.
Для безопасности органичим доступ к закрытому ключу корневого ЦС:
chmod 400 private/rca.key
Создание сертификата Root CA
Создаем сертификат для корневого ЦС (при создании потребуется ввести пароль от закрытого ключа):
openssl req -config openssl-rca.cnf -key private/rca.key -new -x509 -days 7300 -rand_serial -sha256 -extensions v3_ca -out certs/rca.crt Enter pass phrase for private/rca.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []:RU State or Province Name (full name) []: Locality Name (eg, city) []: Organization Name (eg, company) []:ABC LLC Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:ABC LLC Root Certification Authority Email Address []:
В случае если при создании корневого сертификата используя команду указанную мной выше, вы получаете ошибку:
req: Unrecognized flag rand_serial openssl
То используйте следующую команды:
openssl req -config openssl-rca.cnf -key private/rca.key -new -x509 -days 7300 -set_serial "0x`openssl rand -hex 20`" -sha256 -extensions v3_ca -out certs/rca.crt
Проверим корневой сертификат, выведем информацию о нем:
openssl x509 -noout -text -in certs/rca.crt -certopt no_version,no_pubkey,no_sigdump Certificate: Data: Serial Number: 39:35:fc:15:0a:29:e5:bb:a9:6f:0a:7d:7c:20:6d:a0:4b:a4:f7:60 Signature Algorithm: sha256WithRSAEncryption Issuer: C = RU, O = ABC LLC, CN = ABC LLC Root Certification Authority Validity Not Before: Oct 5 11:41:34 2023 GMT Not After : Sep 30 11:41:34 2043 GMT Subject: C = RU, O = ABC LLC, CN = ABC LLC Root Certification Authority X509v3 extensions: X509v3 Subject Key Identifier: EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 Authority Key Identifier: keyid:EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign
Список отзывов (CRL)
Корневой ЦС должен публиковать списки отзыва сертификатов через регулярные промежутки времени или после отзыва сертификата. Хоть пока не было никаких отзывов, но клиенты и серверы, проверяющие любой из выписанных сертификатов, будут запрашивать обновленный CRL с веб-адреса, опубликованного в сертификатах. Поэтому нам необходимо создать начальный, хоть и пустой CRL корневого ЦС:
openssl ca -config openssl-rca.cnf -gencrl -out crl/rca.crl
Выведем информацию о списке отзыва:
openssl crl -in crl/rca.crl -text -noout Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = RU, O = ABC LLC, CN = ABC LLC Root Certification Authority Last Update: Oct 5 12:09:25 2023 GMT Next Update: Nov 4 12:09:25 2023 GMT CRL extensions: X509v3 Authority Key Identifier: keyid:EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 CRL Number: 0 No Revoked Certificates.
Промежуточный центр сертификации (Issuing Sub CA)
Структура каталогов и файлов
Создадим структуру каталогов для хранения файлов ЦС, сертификатов и закрытых ключей:
mkdir -p /opt/CA/intermediateCA/{certs,crl,newcerts,private,csr} cd /opt/CA/intermediateCA
Создадим структуру файлов и зададим начальные значения, для некоторых их них:
touch index touch serial touch crlnumber openssl rand -hex 20 > serial echo 00 > crlnumber
Конфигурация OpenSSL
Создадим конфигурационный файл (/opt/CA/intermediateCA/openssl-ica.cnf) для промежуточного ЦС, со следующим содержанием (некоторые моменты я в конфигурации подсветил):
# # OpenSSL configuration for the Intermediate Certification Authority. # [ ca ] default_ca = CA_default [ CA_default ] # Directory and file locations. dir = /opt/CA/intermediateCA certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index serial = $dir/serial RANDFILE = $dir/private/.rand # The root key and root certificate. private_key = $dir/private/ica.key certificate = $dir/certs/ica.crt # For certificate revocation lists. crlnumber = $dir/crlnumber crl = $dir/crl/ica.crl crl_extensions = crl_ext default_crl_days = 30 default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 3650 default_md = sha256 preserve = no unique_subject = no policy = policy_strict # For the CA policy [ policy_strict ] countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional givenName = optional commonName = supplied emailAddress = optional title = optional [ req ] default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 default_keyfile = private/ica.key req_extensions = req_ext x509_extensions = v3_intermediate_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, your name or your server hostname) emailAddress = Email Address [ req_ext ] basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer # As pathlen restricts creating any further intermidiate CA in the chain. basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign crlDistributionPoints = crldp1_section [ crl_ext ] # CRL extensions. authorityKeyIdentifier = keyid:always [ crldp1_section ] fullname = URI:http://ca.example.com/ica.crl [ ocsp ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning
Поясления по отмеченным пунктам:
[ CA_default ] dir |
Путь к структуре каталогов CA. В случае если вы создавали структуру в отличном от статьи месте, то необходимо это отразить в конфигурации в этой директиве. |
[ req ] req_extensions |
Данная секция не обязательна в рамках рассматриваемой конфигурации ЦС, но она нужна, если у вас коневой ЦС на Windows CA (AD CA) и выпуск сертификата для промежуточного ЦС. |
[ v3_intermediate_ca ] basicConstraints | Обращаю внимание на параметр pathlen в директиве. Параметр pathlen ограничивает создание любого дополнительного промежуточного CA в цепочке. Если планируется или предпологается еще один несколько последущих промежуточных сертификатов CA, я бы рекомендовал либо присвоить более высокое значение для pathlen , либо просто удалить в следующем разделе. |
[ crldp1_section ] fullname |
Указывется URL путь к списку отзыва сертификатов (CRL). Корректируем значение согласно своим данным веб-серера где будет размещатся CRL файл. |
Остальное можно оставлять без изменения.
Создание закрытого ключа Intermediate CA
Создаем закрытый ключ RSA для промежуточного ЦС с использованием алгоритма шифрования AES-256 и надежным паролем:
openssl genrsa -aes256 -out private/ica.key 4096 Generating RSA private key, 4096 bit long modulus (2 primes) ........................++++ .............................++++ e is 65537 (0x010001) Enter pass phrase for private/ica.key: Verifying - Enter pass phrase for private/ica.key:
Создание запроса сертификата Intermediate CA
Создаем запрос на создание сертификата (CSR — certificate signing request) для промежуточного ЦС (при создании потребуется ввести пароль от закрытого ключа):
openssl req -config openssl-ica.cnf -new -sha256 -key private/ica.key -out csr/ica.csr Enter pass phrase for private/ica.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []: State or Province Name (full name) []: Locality Name (eg, city) []: Organization Name (eg, company) []:ABC LLC Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:ABC LLC Issuing SubCA Email Address []:
Посмотрим запрос на сертификат, выведем информацию о нем:
openssl req -in csr/ica.csr -noout -text -reqopt no_version,no_pubkey,no_sigdump Certificate Request: Data: Subject: O = ABC LLC, CN = ABC LLC Issuing SubCA Attributes: Requested Extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign
Создание сертификата Intermediate CA
Для создания промежуточного сертификата используем корневой ЦС с расширением v3_intermediate_ca
. Промежуточный сертификат должен быть действителен на меньший период, чем корневой.
Перенесем на сервер rootCA созданный файл запроса (csr) в каталог /opt/CA/rootCA/csr/
и создадим сертификат сроком на 10 лет (при создании потребуется ввести пароль от закрытого ключа):
openssl ca -config openssl-rca.cnf -extensions v3_intermediate_ca -days 3650 -rand_serial -notext -in csr/ica.csr -out certs/ica.crt Using configuration from openssl-rca.cnf Enter pass phrase for /opt/CA/rootCA/private/rca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 85:27:a1:dc:37:3c:46:21:be:4f:87:3e:ae:d7:55:23:0f:50:7d:de Validity Not Before: Oct 5 14:48:19 2023 GMT Not After : Oct 2 14:48:19 2033 GMT Subject: organizationName = ABC LLC commonName = ABC LLC Issuing SubCA X509v3 extensions: X509v3 Subject Key Identifier: D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 Authority Key Identifier: keyid:EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 Basic Constraints: critical CA:TRUE, pathlen:0 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign X509v3 CRL Distribution Points: Full Name: URI:http://ca.example.com/rca.crl Certificate is to be certified until Oct 2 14:48:19 2033 GMT (3650 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
Проверим выписанный сертификат для промежуточного ЦС, выведем информацию о нем:
openssl x509 -noout -text -in certs/ica.crt -certopt no_version,no_pubkey,no_sigdump Certificate: Data: Serial Number: 85:27:a1:dc:37:3c:46:21:be:4f:87:3e:ae:d7:55:23:0f:50:7d:de Signature Algorithm: sha256WithRSAEncryption Issuer: C = RU, O = ABC LLC, CN = ABC LLC Root Certification Authority Validity Not Before: Oct 5 14:48:19 2023 GMT Not After : Oct 2 14:48:19 2033 GMT Subject: O = ABC LLC, CN = ABC LLC Issuing SubCA X509v3 extensions: X509v3 Subject Key Identifier: D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 Authority Key Identifier: keyid:EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 Basic Constraints: critical CA:TRUE, pathlen:0 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign X509v3 CRL Distribution Points: Full Name: URI:http://ca.example.com/rca.crl
Проверим подлинность выписанного сертификата, корневым сертификатом:
openssl verify -CAfile certs/rca.crt certs/ica.crt certs/ica.crt: OK
Вывод — ОК, означает что цепочка доверия не повреждена.
Создание файла цепочки сертификатов
Файл цепочки сертификатов необходим для проверки подлинности приложениями сертификатов, подписанными промежуточным ЦС. Приложениям необходимо проверить действительность промежуточного ЦС.
Создадим цепочку сертификатов, содержащую промежуточный ЦС и корневой ЦС, для проверки цепочки доверия.
cat certs/ica.crt certs/rca.crt > certs/ca-chain.crt
Проверим подлинность цепочку сертификатов, корневым сертификатом:
openssl verify -CAfile certs/rca.crt certs/ca-chain.crt certs/ca-chain.crt: OK
Теперь созданный сертификат промежуточного ЦС и цепочки сертификатов необходимо скопировать на сервер промежуточного ЦС (intermidiateCA) в каталог /opt/CA/intermediateCA/certs
Список отзывов (CRL)
Так же как и в случае с корневым ЦС, промежуточный должен публиковать списки отзыва сертификатов через регулярные промежутки времени или после отзыва сертификата. Создадим начальный пустой CRL промежуточного ЦС:
openssl ca -config openssl-ica.cnf -gencrl -out crl/ica.crl
Выведем информацию о списке отзыва:
openssl crl -in crl/ica.crl -text -noout Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = RU, O = ABC LLC, CN = ABC LLC Issuing SubCA Last Update: Oct 5 12:09:25 2023 GMT Next Update: Nov 4 12:09:25 2023 GMT CRL extensions: X509v3 Authority Key Identifier: keyid:EA:7B:AA:00:BA:EB:5C:10:05:F3:C1:16:94:8E:1F:45:5D:0B:20:16 X509v3 CRL Number: 0 No Revoked Certificates.
OCSP Responder
Online Certificate Status Protocol (OCSP) — позволяет запрашивающей стороне определять статус отзыва сертификата напрямую из файла index и выдавать результат.
Создаем закрытый ключ RSA без пароля для OCSP:
openssl genrsa -out private/ocsp.example.com.key 4096
Создаем запрос на создание сертификата (CSR) для OCSP:
openssl req -config openssl-ica.cnf -new -sha256 -key private/ocsp.example.com.key -out csr/ocsp.example.com.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []: State or Province Name (full name) []: Locality Name (eg, city) []: Organization Name (eg, company) []:ABC LLC Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:ocsp.example.com Email Address []:
Важный момент — Common Name
должен быть полным доменным именем, пример ocsp.example.com
. Доменное имя должно ссылаться на сервер с OCSP ответчиком. В нашем случае OCSP ответчик располагается на сервере промежуточного ЦС (intermidiateCA).
Подписываем CSR промежуточным ЦС:
openssl ca -config openssl-ica.cnf -extensions ocsp -days 375 -rand_serial -notext -in csr/ocsp.example.com.csr -out certs/ocsp.example.com.crt Using configuration from openssl-ica.cnf Enter pass phrase for /opt/CA/intermediateCA/private/ica.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 31:c8:85:67:3c:af:57:bb:cb:a2:6b:3f:b3:64:95:36:e4:90:93:6b Validity Not Before: Oct 5 20:03:01 2023 GMT Not After : Oct 14 20:03:01 2024 GMT Subject: organizationName = ABC LLC commonName = ocsp.example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: 11:B8:B5:F3:80:50:7C:5A:7A:5E:7F:61:52:9E:BA:42:DA:14:23:69 X509v3 Authority Key Identifier: keyid:D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: critical OCSP Signing Certificate is to be certified until Oct 14 20:03:01 2024 GMT (375 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
В качестве OCSP ответчика будем использовать openssl ocsp
, он будет выступать в роли мини-сервера OCSP. Запускать openssl ocsp ответчик будем как сервис, создаем сервис:
cat << EOF > /etc/systemd/system/openssl-ocsp.service [Unit] Description=OpenSSL OCSP Responder Server After=syslog.target network.target [Service] Type=idle ExecStart=/usr/bin/openssl ocsp -index /opt/CA/intermediateCA/index -port 80 -rsigner /opt/CA/intermediateCA/certs/ocsp.example.com.crt -rkey /opt/CA/intermediateCA/private/ocsp.example.com.key -CA /opt/CA/intermediateCA/certs/ca-chain.crt -ignore_err -text -timeout 5 KillMode=process Restart=on-failure [Install] WantedBy=multiuser.target EOF
Поясления по ключам запуска openssl ocsp
:
-ignore_err | Игнорировать неправильно сформированные запросы или ответы. Действуя в качестве ответчика OCSP, продолжается выполнение вместо завершения при получении неправильно сформированного запроса. |
-timeout | Время ожидания подключения к ответчику OCSP в секундах. В системах POSIX при запуске в качестве ответчика OCSP этот параметр также ограничивает время, в течение которого ответчик готов ожидать запроса клиента. Это время измеряется с момента, когда ответчик принимает соединение, до получения полного запроса. |
Перезагружаем демон systemd
и запускаем службу openssl-ocsp
:
systemctl daemon-reload service openssl-ocsp start service openssl-ocsp status ● openssl-ocsp.service - OpenSSL OCSP Responder Server Loaded: loaded (/etc/systemd/system/openssl-ocsp.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2023-10-03 13:45:14 MSK; 4s ago Main PID: 14103 (openssl) Tasks: 1 (limit: 1115) Memory: 692.0K CPU: 4ms CGroup: /system.slice/openssl-ocsp.service └─14103 /usr/bin/openssl ocsp -index /opt/CA/intermediateCA/index -port 80 -rsigner /opt/CA/intermediateCA/certs/ocsp.example.com.crt -rkey /opt/CA/intermediateCA/private/ocsp.example.com.key -CA /opt/CA/intermediateCA/certs/ca-chain.crt -ignore_err -text -nmin 300 -timeout 5 Oct 03 13:45:14 intermediateCA systemd[1]: Started OpenSSL OCSP Responder Server. Oct 03 13:45:14 intermediateCA openssl[14103]: ocsp: waiting for OCSP client connections...
Если пути к сертификатам были указаны верно, то служба успешно будет запущена и готова для приема ocsp запросов.
Для проверки выполним запрос к OCSP ответчику на проверку сертификата ocsp.example.com.crt
:
openssl ocsp -CAfile /opt/CA/intermediateCA/certs/ca-chain.crt -url http://127.0.0.1:80 -resp_text -issuer /opt/CA/intermediateCA/certs/ica.crt -cert /opt/CA/intermediateCA/certs/ocsp.example.com.crt
Вывод:
OCSP Response Data: OCSP Response Status: successful (0x0) Response Type: Basic OCSP Response Version: 1 (0x0) Responder Id: O = ABC LLC, CN = ocsp.example.com Produced At: Oct 6 06:05:56 2023 GMT Responses: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: 3097E0D914833E4857E835DE2484D0CE537AEC3D Issuer Key Hash: D06BA1970CE3706EA1DA92DB435544B44B62D6E1 Serial Number: 31C885673CAF57BBCBA26B3FB3649536E490936B Cert Status: good This Update: Oct 6 06:05:56 2023 GMT Response Extensions: OCSP Nonce: 0410400A29F95B7D81EFF289AAAF7F22315E Signature Algorithm: sha256WithRSAEncryption Certificate: Data: Version: 3 (0x2) Serial Number: 31:c8:85:67:3c:af:57:bb:cb:a2:6b:3f:b3:64:95:36:e4:90:93:6b Signature Algorithm: sha256WithRSAEncryption Issuer: O=ABC LLC, CN=ABC LLC Issuing SubCA Validity Not Before: Oct 5 20:03:01 2023 GMT Not After : Oct 14 20:03:01 2024 GMT Subject: O=ABC LLC, CN=ocsp.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit) Modulus: Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: 11:B8:B5:F3:80:50:7C:5A:7A:5E:7F:61:52:9E:BA:42:DA:14:23:69 X509v3 Authority Key Identifier: keyid:D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: critical OCSP Signing Signature Algorithm: sha256WithRSAEncryption Response verify OK /opt/CA/intermediateCA/certs/ocsp.example.com.crt: good This Update: Oct 6 06:05:56 2023 GMT
Для того чтобы закодировать расположение сервера OCSP в сертификат, который подписывает промежуточный ЦС. Необходимо использовать опцию authorityInfoAccess
в соответствующей секции (в описании расширения сертификата).
Пример:
[ req_ext ] authorityInfoAccess = OCSP;URI:http://ocsp.example.com
CA Website
Поскольку нам нужно место для распространения наших сертификатов и публикации информации об отзыве, создадим веб-сайт. Веб-сайт будем размещать на отдельном сервере (webCA).
Устанавливаем apache
:
apt-get install apache2 -y
Создадим виртуальный хост (/etc/apache2/sites-available/001-ca.conf
) для CA, со следующим содержанием:
<VirtualHost *:80> ServerName ca.example.com DocumentRoot /var/www/ca <Directory /var/www/ca> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost>
Создадим необходимый каталог для размещения сертификатов, списков отзывов на веб-сайте и применим к права доступа для веб-сервера:
mkdir -p /var/www/ca chown www-data:www-data /var/www/ca
Включаем веб-сайт и перечитать конфигурацию apache:
a2ensite 001-ca.conf systemctl reload apache2
Любым удобным способом копируем файлы сертификатов, списков отзывов на веб-сервер в каталог сайта (/var/www/ca), чтобы получилось так:
/var/www/ca/ ├── ca-chain.crt ├── ica.crl ├── ica.crt ├── rca.crl └── rca.crt
Теперь если перейти в браузере на опубликованный сайт — ca.example.com
, увидим доступные файлы сертификатов корневого, промежуточного ЦС, их списки отзыва и цепочка сертификатов.
Добавление сертификов в Active Directory
В случае если имеется доменная инфраструктура Windows, то имеет смысл публикации созданных выше ЦС в хранилище Enterprise NTAuth. Добавление сертификатов сторонних производителей в хранилище NTAuth подтверждает, что ЦС доверено выдавать сертификаты к примеру для входа в систему с помощью смарт-карт.
Для публикации сертификатов ЦС в хранилище Enterprise NTAuth, скопируем сертификаты корневого и промежуточного ЦС на домен контроллер и выполняем команды от имени администратора:
certutil -dspublish -f rca.cer NTAuthCA certutil -dspublish -f ica.cer NTAuthCA
Содержимое хранилища NTAuth кэшируется в следующем расположении реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EnterpriseCertificates\NTAuth\Certificates
Этот раздел реестра должен быть автоматически обновлен с учетом сертификатов, опубликованных в хранилище NTAuth в контейнере конфигурации Active Directory. В некоторых сценариях, таких как задержка репликации Active Directory или если автоматически включен параметр политики «Не регистрировать сертификаты», реестр не обновляется. В таких случаях необходиом выполнить добавление сертификатов вручную, чтобы вставить сертификат в расположение реестра, выполняем команды от имени администратора:
certutil -enterprise -addstore NTAuth rca.cer certutil -enterprise -addstore NTAuth ica.cer
Выпуск серверного сертификата
Для примера рассмотрим как выпустить серверный сертификат для выше описанного веб-сервера — ca.example.com
.
Я рекомендую использовать отдельные файлы конфигурации с описанием выпускаемого сертификата. Создадим файл конфигурации (/opt/CA/intermediateCA/server.cnf
) с содержимым:
[ req ] default_bits = 2048 default_md = sha256 string_mask = utf8only x509_extensions = req_ext distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] C = RU O = ABC LLC CN = ca.example.com # Common paramets # C = Country Name (2 letter code) - AE # ST = State or Province Name (full name) - Emirate of Dubai # L = Locality Name (eg, city) - Dubai # O = Organization Name - NORD RIM # OU = Organizational Unit Name (eg, section) - IT # CN = Common Name (eg, your name or your server\'s hostname) [ req_ext ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer authorityInfoAccess = caIssuers;URI:http://ca.example.com/ca_chain.crt,OCSP;URI:http://ocsp.example.com keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth subjectAltName = @alt_names crlDistributionPoints = crldp1_section [ crldp1_section ] fullname = URI:http://ca.example.com/ica.crl [alt_names] DNS.1 = ca.example.com IP.1 = 192.168.1.2
Поясления по отмеченным пунктам:
prompt | Данный параметр подавляет запросы при создании CSR сертификата и все параметры сертификата будут браться из указанного файла конфигурации. |
[ req_distinguished_name ] | Преопределяем distinguished name Сертификата |
[ req_ext ] subjectAltName = @alt_names |
Данный параметр указывает что в сертификате будут присутствовать SAN (Subject Alternative Names) означает «Альтернативные имена субъектов» и ссылается на секцию в которой будут описаны все SAN. |
[alt_names] | В этой секции описываем все необходимые SAN. Пример:
|
Создаем закрытый ключ RSA без пароля для будущего сертификата:
openssl genrsa -out private/ca.example.com.key 4096
Создаем запрос на создание сертификата (CSR):
openssl req -new -key private/ca.example.com.key -out csr/ca.example.com.csr -sha256 -config server.cnf -extensions req_ext
Подписываем CSR промежуточным ЦС:
openssl ca -batch -config openssl-ica.cnf -extfile server.cnf -extensions req_ext -days 3650 -rand_serial -notext -in csr/ca.example.com.csr -out certs/ca.example.com.crt
Проверим сертификат, выведем информацию о нем:
openssl x509 -noout -text -in certs/ca.example.com.crt -certopt no_version,no_pubkey,no_sigdump Certificate: Data: Serial Number: 34:f0:89:8a:d7:9a:46:de:f9:5e:ea:10:fe:65:1f:fc:6c:8b:20:40 Signature Algorithm: sha256WithRSAEncryption Issuer: O = ABC LLC, CN = ABC LLC Issuing SubCA Validity Not Before: Oct 6 08:55:36 2023 GMT Not After : Oct 3 08:55:36 2033 GMT Subject: C = RU, O = ABC LLC, CN = ca.example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: 20:C9:AD:A2:1F:DE:3E:4F:A1:43:60:92:8D:AA:55:42:CB:63:89:E7 X509v3 Authority Key Identifier: keyid:D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 Authority Information Access: CA Issuers - URI:http://ca.example.com/ca_chain.crt OCSP - URI:http://ocsp.example.com X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication X509v3 Subject Alternative Name: DNS:ca.example.com, IP Address:192.168.1.2 X509v3 CRL Distribution Points: Full Name: URI:http://ca.example.com/ica.crl
Отзыв сертификата
Для примера рассмотрим как отзывать сертификат.
Причины отзыва\аннулирования сертификата
unspecified | Причина неизвестна. |
keyCompromise | Компрометация ключей. |
CACompromise | Компрометация ЦС. |
affiliationChanged | Имя пользователя или другая информация в сертификате изменена, но нет причины полагать, что секретный ключ скомпрометирован. |
superseded | Сертификат заменен другим, но нет причины полагать, что секретный ключ скомпрометирован. |
cessationOfOperation | Сертификат более не нужен для целей, которых он выдавался, но нет причины полагать, что секретный ключ скомпрометирован. |
certificateHold | Действие сертификата приостановлено. |
removeFromCRL | Служебный код для возобновления действия сертификата,действие которого ранее было приостановлено. (CryptoProCA20 Version) |
Отзовем ранее выписанный сертификат веб-сервера — ca.example.com
с причиной cessationOfOperation:
openssl ca -config openssl-ica.cnf -revoke certs/ca.example.com.crt -crl_reason cessationOfOperation Using configuration from openssl-ica.cnf Enter pass phrase for /opt/CA/intermediateCA/private/ica.key: Revoking Certificate 34F0898AD79A46DEF95EEA10FE651FFC6C8B2040. Data Base Updated
После отзыва сертификата, необходимо пересоздать CRL.
openssl ca -config openssl-ica.cnf -gencrl -out crl/ica.crl
Выведем информацию о списке отзыва:
openssl crl -in crl/ica.crl -text -noout Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: O = ABC LLC, CN = ABC LLC Issuing SubCA Last Update: Oct 6 09:03:51 2023 GMT Next Update: Nov 5 09:03:51 2023 GMT CRL extensions: X509v3 Authority Key Identifier: keyid:D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 CRL Number: 1 Revoked Certificates: Serial Number: 34F0898AD79A46DEF95EEA10FE651FFC6C8B2040 Revocation Date: Oct 6 09:03:03 2023 GMT CRL entry extensions: X509v3 CRL Reason Code: Cessation Of Operation
Видим что отозванный сертификат отображается в сформированном списке отзыва (CRL). Не забываем каждый раз при формировании нового списка отзыва (CRL) размещать его на веб-сервере.
Так же можно проверить статус отозванного сертификата по OCSP ответчику, выполним команду:
openssl ocsp -CAfile /opt/CA/intermediateCA/certs/ca-chain.crt -url http://127.0.0.1:80 -resp_text -issuer /opt/CA/intermediateCA/certs/ica.crt -cert /opt/CA/intermediateCA/certs/ca.example.com.crt OCSP Response Data: OCSP Response Status: successful (0x0) Response Type: Basic OCSP Response Version: 1 (0x0) Responder Id: O = ABC LLC, CN = ocsp.example.com Produced At: Oct 6 09:05:49 2023 GMT Responses: Certificate ID: Hash Algorithm: sha1 Issuer Name Hash: 3097E0D914833E4857E835DE2484D0CE537AEC3D Issuer Key Hash: D06BA1970CE3706EA1DA92DB435544B44B62D6E1 Serial Number: 34F0898AD79A46DEF95EEA10FE651FFC6C8B2040 Cert Status: revoked Revocation Time: Oct 6 09:03:03 2023 GMT Revocation Reason: cessationOfOperation (0x5) This Update: Oct 6 09:05:49 2023 GMT Response Extensions: OCSP Nonce: 04101D9B7FEEB2E70F39AFED6489B1F1A579 Signature Algorithm: sha256WithRSAEncryption Certificate: Data: Version: 3 (0x2) Serial Number: 31:c8:85:67:3c:af:57:bb:cb:a2:6b:3f:b3:64:95:36:e4:90:93:6b Signature Algorithm: sha256WithRSAEncryption Issuer: O=ABC LLC, CN=ABC LLC Issuing SubCA Validity Not Before: Oct 5 20:03:01 2023 GMT Not After : Oct 14 20:03:01 2024 GMT Subject: O=ABC LLC, CN=ocsp.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: 11:B8:B5:F3:80:50:7C:5A:7A:5E:7F:61:52:9E:BA:42:DA:14:23:69 X509v3 Authority Key Identifier: keyid:D0:6B:A1:97:0C:E3:70:6E:A1:DA:92:DB:43:55:44:B4:4B:62:D6:E1 X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: critical OCSP Signing Signature Algorithm: sha256WithRSAEncryption Response verify OK /opt/CA/intermediateCA/certs/ca.example.com.crt: revoked This Update: Oct 6 09:05:49 2023 GMT Reason: cessationOfOperation Revocation Time: Oct 6 09:03:03 2023 GMT
В ответе на запрос видим что статус сертификата отозван, так же видна причина и дата когда был осуществлен отзыв сертификата.
В рамках данной статьи мы рассмотрели как развернуть двух уровневый ЦС с OCSP responder. Если кто хочет дополнить или поправить в неточности меня добро пожаловать в комментарии.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА ДОНАТОМ