Minha organização tem uma Autoridade de Certificação (CA) interna que já geramos muitos certificados internos e instalamos em máquinas.
Estou configurando um servidor LDAP/Kerberos FreeIPA e após a instalação inicial, ele gerou uma CA interna própria que posso ver na interface da web.
Gostaria de assinar a CA FreeIPA com a CA da organização existente para estabelecer uma cadeia de certificados confiáveis. Estou seguindo as instruções do FreeIPA para renovar manualmente um certificado de CA IdM assinado externamente, que acredito cobrir a assinatura da CA do FreeIPA com uma CA externa. Isso produziu um CSR que eu assinei usando a CA existente para produzir uma nova CA FreeIPA assinada.
No entanto, fiquei preso tentando reimportar a CA + Certificate Chain recém-assinada usando o ipa-cacert-manage renew --external-cert-file
comando. Quando executo isso como as instruções dizem, recebo um erro de que a cadeia de certificados da CA está incompleta porque está faltando um dos certificados na cadeia:
[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
'[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US'
The ipa-cacert-manage command failed.
No entanto, esse certificado foi fornecido em um dos --external-cert-file
argumentos. Eu também tentei com um arquivo "CA Bundle" (vários certificados em um arquivo) e o resultado foi o mesmo.
Aprofundando mais, o problema parece estar load_external_cert
em 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))
A execução ipa-cacert-manage renew
no modo detalhado mostra que ele encontra todos os certificados na cadeia, mas quando chega à [arte onde trust_chain
é formado, o trust_chain
único contém o certificado FreeIPA e não o restante da cadeia . Consegui reproduzir o cenário desenrolando os comandos e reproduzindo-os no meu terminal. Aqui é onde ele se decompõe:
A FreeIPA ipa-cacert-manage renew
está chamando certutil
para "Imprimir a cadeia de certificados" usando a -O
opção, da seguinte forma:
[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]
Porém certutil
não está imprimindo toda a cadeia, mesmo que o certificado seja assinado por outra CA que esteja no truststore. Você pode ver que certutil
mostra a cadeia apropriada quando eu a chamo na CA intermediária:
[root@lockandkey ~]# /usr/bin/certutil -d dbm:/tmp/tmppTphXX -O -n '[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US' -f /tmp/tmppTphXX/pwdfile.txt
"[email protected],CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US" [[email protected],CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US]
"[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US" [[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O="Digital Fruition, LLC",L=Newland,ST=North Carolina,C=US]
Então, eu acredito que este é um problema com certutil
, mas isso é até onde eu cheguei até agora.
Depurando isso ainda mais, decidi que, por algum motivo certutil
, não gosta do certificado que gerei, portanto, pode ser um problema com algo nesse CSR. Outros certificados validam bem...
Estou fazendo algo errado? Qual é a maneira correta de assinar uma Autoridade de Certificação FreeIPA com outra CA interna?
Eu encontrei o problema. O CSR gerado pelo FreeIPA inclui a extensão "X509v3 Authority Key Identifier" definida para o ID da chave privada do FreeIPA. Isso faz
certutil
com que acredite que a CA é autoassinada e não segue a cadeia de certificados.Ao assinar um CSR do FreeIPA, não copie a extensão X509v3 Authority Key Identifier. Então a validação será bem sucedida.
(Também: certifique-se de que o certificado de CA assinado usou UTF8 para codificar o nome do assunto; consulte incompatibilidade de codificação do nome do assunto na documentação)