В статье рассказывается о том, как развернуть инфраструктуру открытого ключа на базе OpenSSL с одним центром сертификации, и приводятся алгоритмы выдачи и отзыва сертификатов, а также создания списков отзыва сертификатов
Настройка центра сертификации
- создаем папки /var/pki и /var/pki/certs
-
mkdir /var/pki
mkdir /var/pki/certs - создаем пустой файл для базы данных
- touch /var/pki/database
- генерируем случай номер следующего сертификата
- openssl rand -hex 16 > /var/pki/next_serial
- задаем номер следующего списка отзыва сертификатов
- echo 1001 > /var/pki/next_crl
- создаем файл /var/pki/main.conf с основными настройками OpenSSL следующего содержания
-
[default] default_ca = ca_section [ca_section] database = /var/pki/database serial = /var/pki/next_serial crlnumber = /var/pki/next_crl certificate = /var/pki/root.crt private_key = /var/pki/root.key RANDFILE = /var/pki/rand new_certs_dir = /var/pki/certs unique_subject = no copy_extensions = copy default_days = 365 default_crl_days = 7 default_md = sha512 name_opt = RFC2253 policy = policy_section crl_extensions = crl_ext_section [policy_section] commonName = supplied [req] default_bits = 8192 encrypt_key = yes utf8 = yes string_mask = utf8only distinguished_name = dn_section prompt = no [crl_ext_section] authorityKeyIdentifier = keyid:always [dn_section] commonName = ${ENV::SRV_DNS_NAME} [ca_ext_section] subjectKeyIdentifier = hash basicConstraints = critical,CA:true,pathlen:0 keyUsage = critical,digitalSignature,keyCertSign,cRLSign [server_ext_section] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:false keyUsage = critical,digitalSignature,keyEncipherment extendedKeyUsage = clientAuth,serverAuth authorityInfoAccess = caIssuers;URI:http://pki.domain.com/root-ca.crt crlDistributionPoints = URI:http://pki.domain.com/root-ca.crl subjectAltName = DNS:${ENV::SRV_DNS_NAME}
- создаем запрос сертификата центра сертификации
- openssl req -new -config /var/pki/main.conf -out /var/pki/root.csr -keyout /var/pki/root.key -extensions ca_ext_section
- создаем самоподписанный сертификат центра сертификации
- openssl ca -selfsign -config /var/pki/main.conf -in /var/pki/root.csr -out /var/pki/root.crt -extensions ca_ext_section -days 1825
- просматриваем его параметры
- openssl x509 -in /var/pki/root.crt -text -nameopt RFC2253
Выпуск сертификата
- присваиваем переменной среды SRV_DNS_NAME в качестве значения DNS-имя сервера
- export SRV_DNS_NAME=srv.domain.com
- создаем запрос сертификата
- openssl req -new -config /var/pki/main.conf -out /root/pki/server.csr -keyout /root/pki/server.key -extensions server_ext_section
- выдаем сертификат
- openssl ca -config /var/pki/main.conf -in /root/pki/server.csr -out /root/pki/server.crt -extensions server_ext_section
- удаляем переменную среды SRV_DNS_NAME
- unset SRV_DNS_NAME
Замечание: в случае необходимости импорта сертификата и закрытого ключа в хранилище Windows необходимо сохранить их в формате PKCS#12 командой openssl pkcs12 -export -in server.cer -inkey server.key -name "server.domain.com" -out server.p12
Отзыв сертификата
- для отзыва сертификата выполняем команду
- openssl ca -config /var/pki/main.conf -revoke /var/pki/certs/2E79DB95C7E6CFE22AF308A34923F617.pem -crl_reason superseded
Создание списка отзыва сертификатов
- для создания списка отзыва сертификатов используем следующую команду
- openssl ca -gencrl -config /var/pki/main.conf -out /root/pki/root.crl
- чтобы просмотреть параметры списка отзыва сертификатов выполняем
- openssl crl -in /root/pki/root.crl -text -nameopt RFC2253
Оповещения об истечении срока действия сертификатов
- устанавливаем репозиторий EPEL
- yum install epel-release
- устанавливаем пакет perl-mime-construct
- yum install perl-mime-construct
- в папке /etc/cron.daily создаем файл check_certificates_validity.sh следующего содержания:
-
#!/bin/bash certs_dir=/var/pki/certs periods_days=(1 7 14) msg_recipient="[email protected]" msg_subject="Истечение срока действия сертификата" msg_body="Срок действия сертификата %s заканчивается %s" for cert_path in $certs_dir/*.pem; do serial=$(openssl x509 -in $cert_path -serial -noout | sed -rn \ 's/serial=(.*)/\1/p') end_date_secs=$(date --date="$(openssl x509 -in $cert_path -enddate \ -noout | sed -rn 's/notAfter=(.*)/\1/p')" +%s) cur_date_secs=$(date +%s) dif_days=$((($end_date_secs-$cur_date_secs)/60/60/24)) for period_days in ${periods_days[*]}; do if (($dif_days==$period_days)); then msg_body_edited=$(printf "$msg_body" "$serial" "$(date --date=\ @$end_date_secs -u +'%d %b %Y %X %Z')") mime-construct --to "$msg_recipient" --subject "$msg_subject" \ --string "$msg_body_edited" fi done done
- Замечание: данный скрипт также можно скачать отсюда
Замечание: ознакомиться с параметрами утилит и конфигурационных файлов OpenSSL можно, используя следующие команды: man ca, man req, man x509, man x509v3_config, man config