Содержание

FreeIPA: центр сертификации

При развертывании FreeIPA в Astra Linux может возникнуть проблема с Центром Сертификации(Certificate Authority/CA), заключающаяся в том, что dogtag-pki - стандартный CA для FreeIPA - не входит в основной (main) репозиторий системы. Поэтому, установки с его использованием могут быть не аттестованы.

Одним из решений, в таком случае, может стать установка FreeIPA в CA-less режиме: когда выпуск сертификатов возлагается, в том числе, на ручные операции с использованием аттестованных инструментов (openssl)

Локальный Центр Сертификации

Состоит из трех файлов, содержащих:

  1. ca.key - приватный ключ (конфиденциальная информация)
  2. ca.crt - корневой сертификат инфраструктуры
  3. ca.srl - серийный номер последнего выданного сертификата

ca.key

Создается командой:

openssl genrsa -out ca.key # 4096

Можно указать длину ключа, по умолчанию используется минимально допустимая на текущий момент (2048)

ca.crt

В простейшем случае создается командой:

openssl req -x509 -sha256 -new -key ca.key -out ca.crt

Будут запрошены сведения о субъекте-владельце сертификата (subject), обязательным из которых является только Common Name.
Для автоматизации ответов на такие запросы используется ключ:

-subj "/C=RU/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"

При создании корневого сертификата скорее всего потребуется указать срок его действия, так как значение по умолчанию (1 год) может быть слишком коротким.
Для этого используется ключ:

-days "N"

Наконец, трюк: выпуск сертификата с настраиваемым сроком использования (потребуются права суперпользователя и изменение локального времени на системе):

systemctl stop systemd-timesyncd.service
date -u 010100002025.00
openssl req -x509 -sha256 -new -key ca.key -out ca.crt -subj "/CN=Certificate Authority ALIENNET.RU" -days 27393
openssl x509 -in ca.crt -text -noout | egrep "CN|Not"
systemctl start systemd-timesyncd.service

Будет выпущен сертификат:

Issuer: CN=Certificate Authority ALIENNET.RU
    Not Before: Jan  1 00:00:00 2025 GMT
    Not After : Jan  1 00:00:00 2100 GMT
Subject: CN=Certificate Authority ALIENNET.RU

ca.srl

У всех сертификатов должен быть уникальный серийный номер.
В качестве начального значения можно использовать серийный номер корневого сертификата:

eval $(openssl x509 -in ca.crt -noout -serial); echo $serial > ca.srl

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

-CAcreateserial

Все следующие сертификаты создавать с использованием этого файла:

-CAserial ca.srl

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

https://k5wiki.kerberos.org/wiki/Pkinit_configuration
https://web.mit.edu/kerberos/krb5-1.17/doc/admin/pkinit.html

Для полнофункциональной работы контроллера домена потребуются 3 (три) сертификата:

SSL certificate options:
 --dirsrv-cert-file = File containing the Directory Server SSL certificate and private key
 --http-cert-file   = File containing the Apache    Server SSL certificate and private key
 --pkinit-cert-file = File containing the Kerberos  KDC    SSL certificate and private key

Но можно вместо трех разных использовать один - специальным образом созданный сертификат со всеми необходимыми атрибутами.
Пример конфигурационного файла атрибутов для контроллера dc1 домена ipa.aliennet.ru (dc1.ipa.aliennet.ru):

SERVER=dc1.ipa.aliennet.ru
DOMAIN=${SERVER#*.}
 
cat > dc.ini << EOF
[kdc_cert]
basicConstraints       = CA:FALSE
keyUsage               = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage       = 1.3.6.1.5.5.7.3.1, 1.3.6.1.5.2.3.5
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid, issuer
issuerAltName          = issuer:copy
subjectAltName         = otherName:1.3.6.1.5.2.2;SEQUENCE:kdc_princ_name,DNS:${SERVER,,},DNS:${DOMAIN,,}
 
[kdc_princ_name]
realm                  = EXP:0, GeneralString:${DOMAIN^^}
principal_name         = EXP:1, SEQUENCE:kdc_principal_seq
 
[kdc_principal_seq]
name_type              = EXP:0, INTEGER:1
name_string            = EXP:1, SEQUENCE:kdc_principals
 
[kdc_principals]
princ1                 = GeneralString:krbtgt
princ2                 = GeneralString:${DOMAIN^^}
EOF

Создать ключ и запрос на сертификат:

openssl genrsa -out server.key # 4096
openssl req -new -key server.key -out server.csr -subj "/CN=$SERVER"
openssl req -in server.csr -text -noout -verify

Выпустить сертификат (на 10 лет, с учетом серийного номера):

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -out server.crt -CAserial ca.srl \
  -days 3650 -extfile dc.ini -extensions kdc_cert
openssl x509 -in server.crt -text -noout

Подготовить PKCS#12 контейнер с цепочкой сертификатов и приватным ключом (потребуется придумать пароль):

cat ca.crt >> server.crt
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt
openssl pkcs12 -in server.p12 -nodes

Итоговый файл-контейнер server.p12 будет необходим для продвижения сервера dc1.ipa.aliennet.ru до роли первого контроллера в домене или до реплики, если домен уже создан и контроллер(ы) существуют.

Выпуск сертификата web-сервера

FIXME

В качестве примера, выпуск сертификата для web-сервера www.aliennet.ru:

openssl genrsa -out server.key # 4096
openssl req -new -key server.key -out server.csr \
  -subj "/CN=www.aliennet.ru" \
  -addext "subjectAltName=DNS:www.aliennet.ru,DNS:aliennet.ru,IP:127.0.0.1"
openssl req -in server.csr -text -noout -verify
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -out server.crt \
  -CAserial ca.srl \
  -sha256 \
  -days 3650 \
  -extfile <(echo "subjectAltName=DNS:www.aliennet.ru,DNS:aliennet.ru,IP:127.0.0.1")
openssl x509 -in server.crt -text -noout 

Результат: server.key и server.crt (включающий Subject Alternative Name/SAN)

Замена сертификатов в домене

FIXME