В моей организации есть внутренний центр сертификации (CA)который мы уже сгенерировали и установили на машины.
Я настраиваю сервер FreeIPA LDAP / Kerberos , и после начальной установки он сгенерировал собственный внутренний ЦС, который я можно увидеть в веб-интерфейсе.
Я хотел бы подписать ЦС FreeIPA с ЦС существующей организации, чтобы установить цепочку доверия сертификатов. Я следую инструкциям FreeIPA по продлению сертификата CA IdM с внешней подписью вручную , которые, как мне кажется, охватывают подписание CA FreeIPA с внешним CA. Это привело к созданию CSR, который я подписал с использованием существующего CA для создания нового подписанного CA FreeIPA.
Однако я застрял, пытаясь повторно импортировать недавно подписанный CA + цепочку сертификатов с помощью ipa-cacert-manage Renew --external-cert-file
команда. Когда я запускаю это в соответствии с инструкциями, я получаю сообщение об ошибке, что цепочка сертификатов CA неполная, потому что отсутствует один из сертификатов в цепочке:
[root@lockandkey ~]# ipa-cacert-manage renew --external-cert-file=/tmp/LockAndKey_FreeIPA_CA.crt --external-cert-file=/tmp/dfca.crt --external-cert-file=/tmp/jgca.crt
Importing the renewed CA certificate, please wait
CA certificate chain in /tmp/LockAndKey_FreeIPA_CA.crt,
/tmp/dfca.crt, /tmp/jgca.crt is incomplete: missing certificate with subject
'E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US'
The ipa-cacert-manage command failed.
Однако этот сертификат был предоставлен в одном из аргументы - external-cert-file
. Я также попытался использовать файл «CA Bundle» (несколько сертификатов в одном файле), и результат был таким же.
Если копать дальше, проблема, похоже, связана с load_external_cert
в installutils.py
trust_chain = list(reversed(nssdb.get_trust_chain(ca_nickname)))
ca_cert_chain = []
for nickname in trust_chain:
cert, subject, issuer = cache[nickname]
ca_cert_chain.append(cert)
if subject == issuer:
break
else:
raise ScriptError(
"CA certificate chain in %s is incomplete: "
"missing certificate with subject '%s'" %
(", ".join(files), issuer))
Выполнение ipa-cacert-manage refresh
в подробном режиме показывает, что действительно находит все сертификаты в цепочке , но когда попадает в [art where trust_chain
trust_chain
содержит только сертификат FreeIPA, а не остальную часть цепочки . Мне удалось воспроизвести сценарий, развернув команды и воспроизведя их в своем терминале. Вот где он ломается:
FreeIPA ipa-cacert-manage refresh
вызывает certutil
, чтобы «распечатать цепочку сертификатов» с помощью параметра -O
, а именно:
[root@lockandkey ~]# /usr/bin/certutil -d dbm:/tmp/tmppTphXX -O -n 'CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM' -f /tmp/tmppTphXX/pwdfile.txt
"CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM" [CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM]
Однако certutil
не печатает всю цепочку, даже если сертификат подписан другим CA, который находится в хранилище доверенных сертификатов. Вы можете видеть, что certutil
действительно показывает правильную цепочку , когда я вызываю ее на промежуточном CA:
[root@lockandkey ~]# /usr/bin/certutil -d dbm:/tmp/tmppTphXX -O -n 'E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US' -f /tmp/tmppTphXX/pwdfile.txt
"E=CA@josh.gitlin.name,CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US" [E=CA@josh.gitlin.name,CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US]
"E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US" [E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O="Digital Fruition, LLC",L=Newland,ST=North Carolina,C=US]
Итак, я считаю, что это проблема с certutil
, но это все, что я получил.
Продолжая отладку, я решил, что по какой-то причине certutil
не нравится созданный мной сертификат, поэтому это может быть проблема с чем-то по этой CSR. Другие сертификаты подтверждают штраф ...
Я что-то не так делаю? Как правильно подписать центр сертификации FreeIPA с другим внутренним ЦС?
Я обнаружил проблему. CSR, сгенерированный FreeIPA, включает расширение «X509v3 Authority Key Identifier», установленное на идентификатор ключа закрытого ключа FreeIPA. Это заставляет certutil
полагать, что CA является самоподписанным и не следует цепочке сертификатов.
При подписании CSR от FreeIPA, не копирует расширение идентификатора ключа центра сертификации X509v3 . Тогда проверка будет успешной.
(Также: убедитесь, что подписанный сертификат CA использовал UTF8 для кодирования имени субъекта; см. Несоответствие кодировки имени субъекта в документации)