Перейти к содержанию

Корневой удостоверяющий центр

Корневой удостоверяющий центр (УЦ) используется для выпуска сертификатов только подчиненных УЦ. Подчиненные (выпускающие) УЦ должны выпускать сертификаты для клиентов соответствующих сервисов (VPN, SSH, IMAP и т.п.). Рекомендуется создавать отдельные УЦ для отдельных сервисов. Не рекомендуется без необходимости создавать несколько УЦ на одном персональном компьютере (ПК) или виртуальной машине (ВМ) с полномочиями одного пользователя.

В данном примере, для корневого УЦ устанавливается операционная система (ОС) FreeBSD актуальной версии. Выбор ОС обоснован ее компактностью в ряду полноценных (не lite) unix-дистрибутивов, а также личным интересом автора к данной системе.

Во время установки ОС рекомендуется создать учетную запись пользователя, от имени которого будут выполняться все работы по настройке и эксплуатации УЦ.

После установки необходимо отключить возможность загрузки в режиме Single Mode:

sed -i '' 's/off secure/off insecure/g' /etc/ttys

Настройка УЦ

Систему директорий УЦ имеет смысл создавать таким образом, чтобы в случае необходимости описываемые действия могли быть выполнены на единственном ПК при объединении нескольких УЦ.

Примечание

Дальнейшие шаги выполняются от имени пользователя, созданного на этапе установки ОС для исполнения функций оператора УЦ.

Подготовка структуры файлов УЦ

Создадим директории для размещения файлов данных:

cd ~
mkdir -p pki/root-ca/conf pki/root-ca/private pki/root-ca/certs pki/root-ca/db pki/root-ca/crl pki/root-ca/csr
  • conf - файлы конфигурации УЦ;
  • private - файлы ключей;
  • certs - файлы сертификатов;
  • db - файлы списка сертификатов, серийных номеров и их резервные копии;
  • crl - файлы списков отозванных сертификатов;
  • csr - файлы запросов на выпуск сертификатов.

Создадим файлы базы данных:

cp /dev/null ~/pki/root-ca/db/root-ca.db
cp /dev/null ~/pki/root-ca/db/root-ca.db.attr

Создадим файлы серийных номеров выпускаемых и отзываемых сертификатов и запишем в них начальные значения:

echo 01 > ~/pki/root-ca/db/root-ca.crt.srl
echo 01 > ~/pki/root-ca/db/root-ca.crl.srl

Установим права доступа на структуру директорий только для ответственного пользователя:

chmod -R 700 ~/pki/root-ca

Конфигурация корневого УЦ

Создадим файл конфигурации ~/pki/root-ca/conf/root-ca.conf со следующим содержимым:

root-ca.conf
[ default ]
ca                      = root-ca
dir                     = .
[ req ]
default_bits            = 2048
encrypt_key             = yes
default_md              = sha512
utf8                    = yes
string_mask             = utf8only
prompt                  = no
distinguished_name      = ca_dn
req_extensions          = ca_reqext
[ ca_dn ]
countryName             = "RU"
stateOrProvinceName     = "__________" # регион
localityName            = "__________" # город
organizationName        = "__________" # организация
organizationalUnitName  = "__________" # подразделение
commonName              = "__________" # название корневого сертификата
0.domainComponent       = "__________" # имя домена первого уровня
1.domainComponent       = "__________" # имя домена второго уровня
[ ca_reqext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true
subjectKeyIdentifier    = hash
[ ca ]
default_ca              = root_ca
[ root_ca ]
certificate             = $dir/certs/$ca.crt
private_key             = $dir/private/$ca.key
new_certs_dir           = $dir/certs
serial                  = $dir/db/$ca.crt.srl
crlnumber               = $dir/db/$ca.crl.srl
database                = $dir/db/$ca.db
unique_subject          = no
default_days            = 3650
default_md              = sha512
policy                  = match_pol
email_in_dn             = no
preserve                = no
name_opt                = ca_default
cert_opt                = ca_default
copy_extensions         = none
x509_extensions         = signing_ca_ext
default_crl_days        = 3650
crl_extensions          = crl_ext
[ match_pol ]
domainComponent         = match
organizationName        = match
organizationalUnitName  = match
commonName              = supplied
countryName             = match
stateOrProvinceName     = match
localityName            = match
emailAddress            = optional
[ root_ca_ext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always
[ signing_ca_ext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true,pathlen:0
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always
[ crl_ext ]
authorityKeyIdentifier  = keyid:always

Выпуск сертификата корневого УЦ

Важно!

Необходимо помнить о том, что данный сертификат (а также его ключ) являются основой доверия ко всем будущим сертификатам.

Создадим ключ и запрос на выпуск сертификата:

cd ~/pki/root-ca
openssl req -new -config conf/root-ca.conf -out csr/root-ca.csr -keyout private/root-ca.key

Если все выполнено корректно, будут созданы файлы:

  • файл ключа ~/pki/root-ca/private/root-ca.key;
  • файл запроса на выпуск сертификата ~/pki/root-ca/root-ca.csr.

Выпустим самоподписанный сертификат:

cd ~/pki/root-ca
openssl ca -selfsign -config conf/root-ca.conf -in csr/root-ca.csr -out certs/root-ca.crt -extensions root_ca_ext

Если все выполнено корректно, будут созданы или обновлены следующие файлы:

  • файл сертификата ~/pki/root-ca/root-ca.crt;
  • файл сертификата в формате x509 ~/pki/root-ca/certs/01.pem;
  • файл ~/pki/root-ca/db/root-ca.crt.srl будет содержать серийный номер следующего сертификата (02);
  • файл резервной копии серийного номера сертификата ~/pki/root-ca/db/root-ca.crt.srl.old;
  • файл атрибутов ~/pki/root-ca/db/root-ca.db.attr будер содержать параметр unique_subject = no позволяющий создаваемым сертификатам иметь одинаковые имена;
  • в файл базы данных ~/pki/root-ca/db/root-ca.db будет добавлена строка с описанием выпущенного сертификата;
  • файлы резервных копий базы данных и атрибутов ~/pki/root-ca/db/root-ca.db.old и ~/pki/root-ca/db/root-ca.db.attr.old.

Выпуск сертификата выпускающего УЦ

Для выполнения данной операции необходим файл запроса на выпуск сертификата, сгенерированный выпускающим УЦ. Этот файл должен быть размещен в директории ~/pki/root-ca/csr.

Выпустим сертификат:

cd ~/pki/root-ca
openssl ca -config conf/root-ca.conf -in csr/caX.csr -out certs/caX.crt -extensions signing_ca_ext

,где caX - имя файлов для УЦ, для которого выпускаем сертификат.

Выпуск списка отозванных сертификатов

Операция выпуска списка отозванных сертификатов должна выполняться регулярно (например, срок действия такого списка для данной конфигурации корневого УЦ установлен 3650 дней), даже если ни один сертификат не был отозван.

cd ~/pki/root-ca
openssl ca -gencrl -config conf/root-ca.conf -out crl/root-ca.crl

Завершение цикла работы корневого УЦ

После того, как сертификат(ы) выпускающего УЦ выпущены и создан файл списка отозванных сертификатов, полученные файлы:

  • ~/pki/c0/certs/ca1.crt
  • ~/pki/c0/certs/root-ca.crt
  • ~/pki/c0/crl/root-ca.crl

необходимо скопировать в файловую систему выпускающего УЦ.

Warning

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