В этой статье мы настроим проводную сетевую аутентификацию 802.1x в РЕД ОС 8 с использованием certmonger, cepces, nmcli и инфраструктурой Microsoft PKI и NPS. Инструкция применима и к другим RHEL-based дистрибутивам.
Предполагается, что инфраструктура PKI и 802.1x уже развернута для рабочих станций Windows, и наша цель добиться такого же результата для рабочих станций Linux.
Реализация состоит из двух частей:
автоматизация запроса сертификата рабочей станции Linux из Active Directory Certification Authority (CA)
настройка Network Policy Server (NPS) и Network Manager для аутентификации Linux-клиентов
Автоматизация запроса сертификата из Active Directory Certification Authority
Как правило, доменные рабочие станции Windows получают сертификаты через групповую политику (Auto Enrollment). Для чтения Certificate Enrollment Policy используется LDAP-каталог (Active Directory), а для запроса сертификата - обращение по DCOM/RPC к CA.
Эта схема не будет работать с недоменными машинами и клиентами Linux. Для них Microsoft разработала две веб-службы, обслуживающих процесс выпуска сертификатов:
Certificate Enrollment Policy Web Service (CEP) - реализует протокол MS-XCEP
Certificate Enrollment Web Service (CES) - реализует протокол MS-WSTEP
Службы работают по http (TLS) и обмениваются с клиентом информацией через SOAP. Для получения сертификата необходимы обе службы.
Certificate Enrollment Policy Web Service (CEP) возвращает по запросу клиента политику выдачи сертификатов - какие этому клиенту доступны шаблоны, какие параметры обязательны в запросе, а главное - URL серверов CEP, у которых можно запросить сертификат.
Эта информация строится на основе раздела Active Directory
CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=TEST,DC=LOCAL
Certificate Enrollment Web Service (CES) привязывается к одному экземпляру Enterprise CA, при этом FQDN сервера CES записывается в атрибут msPKI-Enrollment-Servers соответствующего CA (в разделе каталога Enrollment Services).
CEP и CES могут работать в одном из трех режимов:
Kerberos - клиент аутентифицируется TGS Kerberos, мы будем использовать этот вариант
Certificate - в этом режиме доступно только продление сертификатов. Запрос на продление должен быть подписан предыдущим действующим сертификатом.
Имя/пароль - не актуально для учетных записей компьютера.
Установка и настройка CEP и CES
Обе службы являются веб-приложениями IIS и устанавливаются в Default Web Site

Их можно совместить с сервером CA, но я рекомендовал бы развернуть их на отдельном сервере, чтобы установка, переустановка, настройка не влияли на работу CA.
Если при выборе учетной записи для запуска службы CEP вы решили использовать учетную запись пользователя, а не Application Pool Identity, и при этом оба сервиса находятся на одной машине, необходимо будет вручную задать ту же учетную запись и для CES, так как к этой учетной записи вы привяжете SPN http.
При первоначальном развертывании настройка служб производится wizard'ом. Дальше службы конфигурируются в IIS. Можно установить дополнительные экземпляры CEP и CES с другими типами аутентификации на тот же сервер командлетами Install-AdcsEnrollmentPolicyWebService и Install-AdcsEnrollmentWebService
Оба приложения настраиваются через апплет Application Settings в IIS.

Для CEP желательно задать Friendly Name

Для CES все настройки будут заданы в wizard'е, здесь же их можно изменить

Для используемой учетной записи Application Pool (пользователя или компьютера) необходимо включить Kerberos Constrained Delegation (KCD) для служб HOST и RPCSS центра сертификации. Забегая вперед, если вы используете Application Pool Identity, а в конфигурации cepces зададите параметр Delegate=True, выдача сертификатов будет работать и без KCD.

После установки и настройки CEP, вы можете проверить его работоспособность из Windows
certutil -ping -kerberos -config "https://your-cep-server.test.local/ADPolicyProvider_CEP_Kerberos/service.svc/CEP" CEPКорректный ответ:
https://your-cep-server.test.local/ADPolicyProvider_CEP_Kerberos/service.svc/CEP
Name: CEP
Id: {DED5480-2D07-47D7-9BBE-587B6AC4AE}
Url: https://your-cep-server.test.local/ADPolicyProvider_CEP_Kerberos/service.svc/CEP
CertUtil: -ping command completed successfully.Для CES вернется сертификат:
certutil -ping -kerberos https://your-cep-server.test.local/YOUR-CA_CES_Kerberos/service.svc/CES CESНа этом мы завершаем настройку служб CEP и CES.
Подробнее о настройке служб можно почитать в документации:
Certificate Enrollment Web Services in Active Directory Certificate Services | Microsoft Learn
Configure the Certificate Enrollment Web Service role service | Microsoft Learn
Configure the Certificate Enrollment Policy Web Service in Windows Server | Microsoft Learn
Настройка certmonger и cepces
У проекта cepces отличная документация, которая покрывает всю первую часть этой статьи.
Документация CertMonger не настолько хороша Tree - certmonger - Pagure.io, но man страницы подробны и понятны Package certmonger - man pages | ManKier
Установите следующие пакеты:
sudo dnf install certmonger
sudo dnf install cepces
sudo dnf install cepces-certmongercertmonger
Cервис systemd для работы с сертификатами. Создает запросы на сертификат, сохраняет их на диск и продлевает истекающие сертификаты.
Предоставляет утилиты
getcert
ipa-getcert
local-getcert
selfsign-getcertМы будем работать с утилитой getcert.
cepces
Пакет установит конфигурационные файлы /etc/cepces и зависимый пакет python3-cepces с библиотеками на python в /usr/lib
cepces-certmonger
Предоставляет утилиту /usr/libexec/certmonger/cepces-submit, основанную на библиотеках cepces. Эту утилиту использует certmonger для обработки запросов.
Прежде чем продолжить настройку, убедитесь, что ва��а рабочая станция введена в домен. В РЕД ОС для этого используется утилита join-to-domain.sh.
Проверьте ваш файл keytab:
sudo klist -k -e -t /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
2 01/20/2026 15:33:40 MY-LINUX-PC$@TEST.LOCAL (DEPRECATED:arcfour-hmac)
2 01/20/2026 15:33:40 MY-LINUX-PC$@TEST.LOCAL (aes128-cts-hmac-sha1-96)
2 01/20/2026 15:33:40 MY-LINUX-PC$@TEST.LOCAL (aes256-cts-hmac-sha1-96)
2 01/20/2026 15:33:40 host/MY-LINUX-PC@TEST.LOCAL (DEPRECATED:arcfour-hmac)
2 01/20/2026 15:33:40 host/MY-LINUX-PC@TEST.LOCAL (aes128-cts-hmac-sha1-96)
2 01/20/2026 15:33:40 host/MY-LINUX-PC@TEST.LOCAL (aes256-cts-hmac-sha1-96)Убедитесь, что вы можете получить tgt для SPN MY-LINUX-PC$@TEST.LOCAL
kinit -k MY-LINUX-PC$@TEST.LOCAL
Архитектура взаимодействия certmonger, cepces, CEP, CES
Архитектура взаимодействия хорошо изложена на странице документации.

Certmonger устанавливает переменные окружения и вызывает cepces-submit.cepces-submit связывается с серверами CEP и CES и возвращает сертификат (или ошибку).
Настройка cepces
В файле /etc/cepces/cepces.conf
server=FQDN вашего сервера CEP
auth=Kerberos
keytab=/etc/krb5.keytab
realm=TEST.LOCAL
principals=${SHORTNAME}$$
enctypes=aes128-cts-hmac-sha1-96
delegate=Trueprincipal
Принципал, для которого вы убедились в успешном получении TGT с использованием keytab. Для Active Directory TGT запрашивается для SPN в формате MY-LINUX-PC$@TEST.LOCAL. Два знака в конфигурации $$ - экранирование.
enctypes
Укажите поддерживаемый enctype из соответствующей колонки вывода klist.
delegate
Если delegate=True, вы можете не настраивать Kerberos Constrained Delegation на CES. В этом случае для передачи запроса будет использоваться s4u2proxy.
Настройка certmonger
Настройки certmonger хранятся в /etc/certmonger/certmonger.conf
В файле можно задать настройки уведомлений об истечении сертификата, время автоматического продления (по-умолчанию - 28 дней), об этом можно почитать в man certmonger.conf
Единственная настройка, которую мы выполним - добавим в список CA утилиту cepces-submit . Это настраивается не через конфигурационный файл, а утилитой getcert.
sudo getcert add-ca -c cepces -e '/usr/libexec/certmonger/cepces-submit'Настройка сохраняется в каталоге /var/lib/certmonger/cas
Проверим настроенные CA
sudo getcert list-casУтилита cepces-submit поддерживает несколько параметров командной строки, позволяющих переопределить значения конфигурационного файла getcert --help, необходимости в их настройке, если вы не экспериментируете - нет.
Прежде чем получить первый сертификат, проверим корректность настроек. Напомню, что архитектурно certmonger взаимодействует с cepces через переменные окружения.
sudo KRB5_TRACE=/dev/stderr CERTMONGER_OPERATION=IDENTIFY /usr/libexec/certmonger/cepces-submitВ результате мы получим подробный вывод с ходом аутентификации Kerberos, SOAP ответами от CEP - политикой enrollment и шаблонами. Ответы можно сохранить и проанализировать.
Наконец, запросим сертификат для нашей рабочей станции. В примере используется стандартный шаблон "Computer". Он не требует передачи каких-либо параметров в запросе, кроме имени шаблона.
sudo getcert request -c cepces -T Machine \
-k /etc/pki/tls/private/machine.key \
-f /etc/pki/tls/certs/machine.crtСозданный запрос сохранится в каталоге /var/lib/certmonger/requests и после выпуска сертификатов будет помечен как "MONITORING".
Проверим статус запроса
sudo getcert list
Number of certificates and requests being tracked: 1.
Request ID '20260122085045':
status: MONITORING
stuck: no
key pair storage: type=FILE,location='/etc/pki/tls/private/machine.key'
certificate: type=FILE,location='/etc/pki/tls/certs/machine.crt'
CA: cepces
issuer: CN=SUB-CA,C=RU
subject: CN=my-linux-pc.test.local
issued: 2026-01-22 11:58:42 EAT
expires: 2027-01-22 11:58:42 EAT
dns: my-linux-pc.test.local
key usage: digitalSignature,keyEncipherment
eku: id-kp-clientAuth,id-kp-serverAuth
certificate template/profile: Machine
profile: Machine
pre-save command:
post-save command:
track: yes
auto-renew: yes
Такое состояние запроса говорит об успешном выпуске сертификата и переходе запроса в состояние "наблюдения". За 28 дней до истечения срока действия certmonger продлит сертификат.
Если в статусе вернулась ошибка, то стоит изучить журналы
journalctl -xeu certmonger
sudo tail -n 1000 /var/log/cepces/cepces.logЕсли информации недостаточно, включите DEBUG во всех секциях /etc/cepces/logging.conf
level=DEBUGНастройка NPS
Для рабочих станций Windows стандартной настройкой типа EAP является "Microsoft: Protected EAP (PEAP)"

К сожалению, все мои попытки настроить этот метод не увенчались успехом, поэтому предположу что его реализация отсутствует в Linux.
Зато другой метод - "Microsoft: Smart Card or other certificate" реализован в Linux как EAP-TLS

Для аутентификации 802.1x с EAP-TLS сетевой адаптер Linux настраивается следующим образом:
sudo nmcli connection modify "LAN" 802-1x.eap tls \
802-1x.client-cert /etc/pki/tls/certs/machine.crt \
802-1x.private-key /etc/pki/tls/private/machine.key \
802-1x.ca-cert /etc/pki/ca-trust/source/anchors/YOUR-CORPORATE-ROOT-CA.crt \
802-1x.identity host/my-linux-pc.test.local \
802-1x.private-key-password-flags 0x4 \
802-1x.client-cert-password-flags 0x4802-1x.eap tls - используемый тип EAP802-1x.identity host/my-linux-pc.test.local - именно в таком формате отправляют имя рабочей станции Windows-клиенты, используем тот же принцип для совместимости с политиками NPS
802-1x.private-key-password-flags 0x4 - для закрытого ключа не требуется пароль
802-1x.client-cert-password-flags 0x4 - для открытого ключа не требуется пароль
Все поддерживаемые nmcli настройки 802.1x вы можете найти в документации.
Перезапускаем сеть
sudo nmcli connection down "LAN"
sudo nmcli connection up "LAN"И смотрим, что напишет Network Manager
journalctl -xeu NetworkManagerНадеюсь на успешную аутентификацию.
На этом настройка завершается. Буду благодарен за уточнения, исправления и рекомендации по улучшению полученной конструкции.
