В статье рассказывается о том, как развернуть инфраструктуру открытого ключа на базе 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

Добавить комментарий