Центр сертификации OpenSSL (Root и Intermediate CA certificates) на Debian 11
PKI (Public Key Infrastructure) — это система, которая использует цифровые сертификаты для проверки подлинности и шифрования данных между устройствами и службами.
Разберем как поднять двухуровневую PKI (Root и Intermediate CA) инфраструктуру на базе OpenSSL в Debian 11 Bullseye. Схема двухуровневой PKI инфраструктуры.
Используемые сервера и их обозначения в инструкции ниже:
- Корневой ЦС — 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:
-passout pass:12345
для указания желаемого пароля при генерации закрытого ключа, где вместо 12345
указываем желаемый пароль.Можно сгенерировать закрытый ключ 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
-passin 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
следует указывать файл конфигурации для использования с опцией –config
, в противном случае OpenSSL будет использовать по умолчанию конфигурационный файл /etc/pki/tls/openssl.cnf
В случае если при создании корневого сертификата используя команду указанную мной выше, вы получаете ошибку.
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>
ServerName
указываем имя сервера которое задавали в конфигурационных файлах rootCA
и intermidiateCA
(openssl-rca.cnf
, openssl-ica.cnf
).Создадим необходимый каталог для размещения сертификатов, списков отзывов на веб-сайте и применим к права доступа для веб-сервера.
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. Пример. DNS.1 = ca.example.com DNS.2 = ca2.example.com IP.1 = 192.168.1.2 IP.2 = 192.168.1.3 и т.д. |
Создаем закрытый ключ 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. Если кто хочет дополнить или поправить в неточности меня добро пожаловать в комментарии.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Обсуждение
Нет комментариев.