Skip to content

Установка сертификатов FreeIPA

Для интеграции с внешними сервисами и обеспечения безопасности соединений, необходимо установить и настроить SSL/TLS сертификаты для FreeIPA. Постарался описать процесс установки сертификатов Let’s Encrypt, включая автоматизацию обновлений с помощью скриптов и cron.

  1. Сделаем бэкап сертификатов:

    cp -r /var/lib/ipa/certs{,.bak}
    cp -r /var/lib/ipa/private{,.bak}
    

  2. Исполняем на сервер скрипт установки корневых сертификатов letsencrypt внутрь freeipa: https://gist.github.com/4volodin/b6761a71de7b0db951dfe85ccf2f24bb

  3. Установим certbot и остановим службу httpd которая была установлена вместе с freeipa:

    dnf install certbot -y
    systemctl stop httpd
    

  4. Получаем сертификат через certbot letsencrypt:

    certbot certonly --standalone --preferred-challenges http --agree-tos -n -d freeipa.truedev.ru -m truedev@inbox.ru
    

  5. Стартуем сервер httpd: systemctl restart httpd

  6. Установим сертификат внутрь freeipa и каждый раз как certbot обновит сертификат нужно сделать:

    ipa-server-certinstall -w -d /etc/letsencrypt/live/freeipa.truedev.ru/privkey.pem /etc/letsencrypt/live/freeipa.truedev.ru/cert.pem --pin='' --dirman-password='...'
    

  7. После установки сертификата перезапустим службы freeipa: ipactl restart

  8. Нужно проверить сертификаты для http и ldap:

    openssl s_client -showcerts -verify 5 -connect $(hostname -f):443
    openssl s_client -showcerts -verify 5 -connect freeipa.truedev.ru:636
    
    openssl s_client -connect freeipa.truedev.ru:636
    sslscan freeipa.truedev.ru:636
    echo | openssl s_client -connect freeipa.truedev.ru:636 | openssl x509 -text -noout
    

  9. Обновление Kerberos билетов

    kinit admin
    klist
    

  10. Автоматизация обновления сертификатов с помощью скрипта и cron:

/etc/letsencrypt/renewal/freeipa.truedev.ru.conf

pref_challs = http-01,
authenticator = standalone
server = https://acme-v02.api.letsencrypt.org/directory
key_type = ecdsa

pre_hook = systemctl stop httpd
deploy_hook = bash -c 'export DIRMAN_PASSWORD="..."; ipa-server-certinstall -w -d /etc/letsencrypt/live/freeipa.truedev.ru/privkey.pem /etc/letsencrypt/live/freeipa.truedev.ru/cert.pem --pin=""; unset DIRMAN_PASSWORD'
post_hook = systemctl start httpd && ipactl restart && ipa-certupdate

sudo crontab -e

0 */12 * * * test -x /usr/bin/certbot && /usr/bin/certbot renew --quiet

--keep-until-expiring - чтобы обновлять сертификат только тогда, когда он истекает или истекает в течение 30 дней. Это позволяет избежать частых запросов новых сертификатов, если текущий сертификат все еще действителен.

При использовании скрипта renew-le.sh из репы - была ошибка на ldaps сертификат - якобы самоподписанный сертификат в цепочке, хотя сертификат на https был без ошибок. Could not authenticate you from Ldapmain because "Ssl connect returned=1 errno=0 peeraddr=IP_ADDRESS:636 state=error: certificate verify failed (self signed certificate in certificate chain)". Поэтому было решено использовать встроенный механизм установки сертификатов через ipa-server-certinstall

Если сертификат истек во freeipa, но certbot получил сертификат

предыдущий
openssl x509 -noout -text in /etc/letsencrypt/live/ipa.truedev.ru/cert2.pem
Validity
            Not Before: Apr  8 16:14:48 2024 GMT
            Not After : Jul  7 16:14:47 2024 GMT
который не смог применится через ipa-server-certinstall
openssl x509 -noout -text in /etc/letsencrypt/live/ipa.truedev.ru/cert3.pem
Validity
            Not Before: Jun  7 17:35:31 2024 GMT
            Not After : Sep  5 17:35:30 2024 GMT


значит дату нужно установить на 8 июня

systemctl stop chronyd
timedatectl set-time "2024-06-08"
ipa-server-certinstall -w -d /etc/letsencrypt/live/freeipa.truedev.ru/privkey.pem /etc/letsencrypt/live/freeipa.truedev.ru/cert.pem --pin='' --dirman-password=''
ipactl restart

systemctl start chronyd
ipa-certupdate -v
reboot now