Центр сертификации OpenSSL (Root и Intermediate CA certificates) на Debian 11 Bullseye

Разберем как поднять двухуровневую 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
ИНФОРМАЦИЯ. Если необходима поддерка шифрования по ГОСТ Р 34.10-2012 в OpenSSL, то установку OpenSSL следует выполнять по этой статье — Шифрование по ГОСТ Р 34.10-2012 в OpenSSL 1.1.1 на Debian 10 Buster 

 

Корневой центр сертификации (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

где, в параметре — 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

 

Проверим корневой сертификат, выведем информацию о нем:

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
ВАЖНО! Прошу обратить внимание на отмеченную строку, в ней необходимо убедится что пути к сертификату, закрытому ключу OCSP и цепочки сертификатов указана верно.

 

Поясления по ключам запуска 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 без пароля для OCSP:

openssl genrsa -out private/ca.example.com.key 4096

 

Создаем запрос на создание сертификата (CSR) для OCSP:

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. Если кто хочет дополнить или поправить в неточности меня добро пожаловать в комментарии.

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА

Оставьте комментарий

9 + двенадцать =