# Private CA registra cada emissão: guia de campo do IssueCertificateDetails

Desde 5 de outubro de 2026 o AWS Private CA emite um evento IssueCertificateDetails no CloudTrail para toda tentativa de emissão, com o certificado TBS completo, a CA emissora, o solicitante e o motivo da falha. Isso fecha um buraco de auditoria que eu contornava com relatório de auditoria mais GetCertificate. Estas notas de campo dizem o que ligar amanhã, o que o evento não resolve e onde o custo e a LGPD entram.

- URL: https://fernando.moretes.com/blog/private-ca-registra-cada-emissao-guia-de-campo-do

- Markdown: https://fernando.moretes.com/blog/private-ca-registra-cada-emissao-guia-de-campo-do/article.md?lang=pt

- Published: 2026-10-06T10:14:49.443Z

- Category: AWS & Cloud

- Tags: aws-private-ca, cloudtrail, pki, compliance, security, eventbridge, athena, finops

- Reading time: 9 min

- Source: [AWS Private CA now provides detailed certificate issuance logs](https://aws.amazon.com/about-aws/whats-new/2026/10/aws-private-ca-certificate-issuance-logs/)

---

Depois de anos operando PKI interna para sistemas financeiros, a pergunta que mais me custou nunca foi "o certificado foi emitido?", foi "o que exatamente a minha CA assinou, para quem, e o que ela recusou?". Até a semana passada o CloudTrail respondia só a primeira: o evento de gerenciamento do `IssueCertificate` devolvia um ARN e nada mais. Uma emissão barrada por name constraints não deixava registro nenhum. O evento `IssueCertificateDetails`, anunciado em 5 de outubro de 2026, responde as outras duas. Estas são as notas do que eu faria com ele a partir de amanhã.

## A situação: o buraco que a gente tapava na mão

**O que existia antes:** três fontes parciais. O evento de gerenciamento `IssueCertificate` provava que a chamada à API passou e entregava o ARN do certificado. O evento `SignCertificate` registrava a operação de assinatura. E o relatório de auditoria, gerado no máximo a cada 30 minutos para um bucket S3, listava serial, subject, validade e revogação. Nenhum dos três trazia SAN, extensões X.509 ou o algoritmo de assinatura. Para saber que nomes DNS saíram de fato num certificado, o caminho era `GetCertificate` por ARN e `openssl x509 -text`, com um teto padrão de 75 chamadas por segundo e uma condição dura: a CA precisa ainda existir. CA apagada, certificado irrecuperável.

**Onde isso quebra:** no modo de certificado de curta duração. Uma CA nesse modo custa US$ 50 por mês e emite certificados de até 7 dias a US$ 0,058 cada; é o modo certo para mTLS entre workloads. Com 20 mil workloads renovando a cada 3 ou 4 dias, são 5 a 6 mil emissões por dia. Reconstruir o inventário retroativamente por `GetCertificate` vira um job de horas que corre contra a própria validade dos certificados. A própria documentação do relatório de auditoria hoje diz, com todas as letras, para capturar o detalhe no momento da emissão em CAs de alto volume.

**O que ninguém via:** falha antes da assinatura. Template errado, violação de name constraints, CSR fora do padrão: a chamada falhava, o cliente recebia uma exceção e o auditor não tinha linha nenhuma para olhar. Em ambiente com BACEN ou PCI-DSS, ausência de registro de tentativa negada é achado de auditoria, não detalhe.

## Anatomia do evento: o que ler e o que não presumir

O `IssueCertificateDetails` é um evento de serviço (`eventType: AwsServiceEvent`, `managementEvent: true`) com `eventSource: acm-pca.amazonaws.com`. Chega sozinho, sem opt-in, em toda região onde o Private CA existe, e só paga o preço padrão do CloudTrail. O conteúdo útil mora em `serviceEventDetails`:

- `tbsCertificate`: o DER do certificado to-be-signed em base64, com todos os campos e extensões, sem a assinatura.
- `issuerName`, `issuerSerialNumber`, `issuerAuthorityKeyIdentifier`: qual CA assinou, útil quando você roda hierarquia com várias intermediárias.
- `subject`, `serialNumber`, `notBefore`, `notAfter`, `issuedAt`, `templateArn`, `signingAlgorithm`: os campos de conveniência que vão virar colunas.
- `status` (`ISSUED` ou `FAILED`) e `statusReason`, por exemplo `Name Constraints violation: DNS name not found in a permitted subtree.`
- `requesterAccountId` e `requesterArn` para chamadas diretas, ou `requesterServicePrincipal` (como `acm.amazonaws.com`) quando um serviço ou conector pediu em seu nome.

**Três armadilhas que o guia documenta e eu confirmei:** primeiro, o `userIdentity` do envelope é `invokedBy: acm-pca.amazonaws.com`, não o chamador; filtrar por principal no CloudTrail não acha nada, o solicitante está dentro de `serviceEventDetails`. Segundo, nenhum dos três campos de solicitante é garantido: emissões atribuídas a processo interno da AWS vêm sem os três. Terceiro, `status` nunca é `PENDING`: o evento só sai quando a emissão chega a estado terminal, e numa falha anterior à geração do TBS os campos derivados dele (`tbsCertificate`, `subject`, `serialNumber`) simplesmente não existem. Em CA compartilhada, o anúncio diz que o evento vai para a conta dona da CA; o guia do usuário diz que vai para a dona e para a solicitante. Quando a conta dona é a de segurança, o auditor olha num lugar só.

## Da tentativa de emissão ao auditor: por onde o evento passa

Toda tentativa, aceita ou recusada, vira um evento que o CloudTrail entrega em dois caminhos: tempo real via EventBridge e lote via S3/Athena ou CloudTrail Lake.

### 👤 Solicitantes: quem pede o certificado

- Workload com IAM role sourceIdentity + session tags (user)
- ACM / conectores AD, SCEP, Kubernetes (external)

### 🟧 AWS: Private CA (conta dona da CA)

- Validação template + name constraints (security)
- Geração do TBS e assinatura (security)
- IssueCertificateDetails status ISSUED | FAILED (messaging)

### 🟧 AWS: Trilha de auditoria

- CloudTrail (trilha da org) management event, 1ª cópia grátis (data)
- S3 da trilha SSE-KMS + lifecycle (storage)
- CloudTrail Lake US$ 0,75/GB ingerido (storage)

### 🔐 Consumo: segurança e compliance

- EventBridge regra status = FAILED (messaging)
- Security Hub / SNS alerta de recusa (security)
- Lambda decodificador TBS → SAN, key usage (compute)
- Athena inventário + migração de algoritmo (data)

### Fluxos

- workload -> validate: IssueCertificate
- acm -> validate: emissão em seu nome
- validate -> sign: aceito
- validate -> event: recusado: statusReason
- sign -> event: emitido: TBS + serial
- event -> trail: entrega automática
- trail -> s3: arquivos de log
- trail -> lake: ingestão opcional
- trail -> eb: AWS Service Event via CloudTrail
- eb -> alert: FAILED em minutos
- s3 -> decoder: novo objeto
- decoder -> athena: colunas SAN/algoritmo
- s3 -> athena: partition projection

## Playbook: o que ligar nos primeiros cinco dias

1. **Confirme que a trilha da organização cobre a conta e a região da CA**: O evento é de gerenciamento, então entra na primeira cópia gratuita de qualquer trilha que grave management events. Verifique que a trilha é multi-região e que a conta dona da CA (idealmente a conta de segurança) está no escopo. Sem trilha, o evento aparece só no histórico de 90 dias do console, que não serve a um auditor.

2. **Crie a regra de EventBridge para `status = FAILED`**: Padrão com `source: aws.acm-pca`, `detail-type: AWS Service Event via CloudTrail`, `detail.eventName: IssueCertificateDetails` e `detail.serviceEventDetails.status: FAILED`. Destino: tópico SNS do time de PKI e um finding no Security Hub. Uma recusa por name constraints é sinal de workload mal configurado ou de alguém testando os limites da CA; os dois merecem resposta em minutos, não no relatório do mês.

3. **Monte a tabela no Athena com partition projection**: Use o DDL padrão de CloudTrail do Athena com projeção de partições por conta, região e data, e filtre `eventname = 'IssueCertificateDetails'`. As colunas de conveniência (`subject`, `signingalgorithm`, `templatearn`, `notafter`, `requesterarn`) saem direto de `serviceeventdetails` como JSON string. Se a organização já usa CloudTrail Lake, a mesma consulta roda lá a US$ 0,005 por GB varrido.

4. **Escreva o decodificador de TBS para SAN e key usage**: Athena não parseia ASN.1. Um Lambda disparado pelos objetos novos do bucket da trilha decodifica o `tbsCertificate`, extrai `subjectAltName`, `keyUsage`, `extendedKeyUsage` e o tamanho da chave, e grava Parquet num prefixo de inventário. É isso que responde "quais certificados têm `*.pagamentos.interno` no SAN" sem tocar na API da CA.

5. **Propague a identidade original com `sourceIdentity` e session tags**: Quando um serviço intermediário chama `IssueCertificate` por um workload, o `requesterArn` é o do intermediário. Faça o intermediário assumir a role com `SetSourceIdentity` e session tags com o identificador do workload; o `sourceIdentity` é imutável ao longo da cadeia de roles e aparece no evento. Com IAM Roles Anywhere, o SAN do certificado do cliente já vira tag de principal, como `aws:PrincipalTag/x509SAN/URI`.

6. **Feche a retenção e a criptografia do bucket antes do primeiro auditor**: O bucket da trilha agora guarda DN e SAN de todo certificado, inclusive os de usuário emitidos pelo conector de Active Directory. SSE-KMS com chave do cliente, bucket policy negando leitura fora da conta de segurança, lifecycle alinhado ao prazo que a sua norma exige. Faça isso antes de o evento acumular meses de dado pessoal.

## Inventário vivo e migração de algoritmo sem tocar na CA

**O caso de uso que me interessa de verdade:** migração de algoritmo. Toda PKI financeira que eu toquei tinha uma mistura de `SHA256WITHRSA` em certificados antigos e `ECDSAWITHSHA256` nos novos, e a única forma de medir o progresso era amostrar. O campo `signingAlgorithm` em cada evento transforma isso numa consulta: percentual de emissões por algoritmo por semana, por template, por conta solicitante. Quando a hora da criptografia pós-quântica chegar, é a mesma consulta com outro valor. Alarme de CloudWatch sobre um metric filter contando emissões `SHA256WITHRSA` depois da data de corte é o controle mais barato que existe para "ninguém voltou a usar o template antigo".

**Inventário:** o relatório de auditoria continua sendo a fotografia oficial (serial, revogação, validade) e continua necessário, porque o novo evento não cobre revogação; `RevokeCertificate` é outro evento de gerenciamento. Mas o inventário operacional, o que responde "quantos certificados expiram nas próximas 72 horas e de quem são", passa a ser `notAfter` e `requesterArn` numa tabela, atualizada em minutos, sem `GetCertificate` e sem depender de a CA ainda existir. Desde 31 de março de 2026 o Private CA também publica no CloudWatch a contagem de certificados emitidos por CA e de CAs por região; use a métrica para vigiar a cota (100 milhões por CA, ou 1 milhão quando a CA usa CRL completa) e o evento para saber o que compõe esse número.

**O que o evento não resolve:** certificados emitidos antes de 5 de outubro de 2026 não ganham evento retroativo. O backfill desses continua pelo caminho antigo, relatório mais `GetCertificate`, e é a última vez que você precisa rodá-lo.

> **Teste a trilha com uma recusa de propósito:** Antes de declarar o controle pronto, peça um certificado com um DNS fora das name constraints da CA intermediária e confirme três coisas: o evento chegou com `status: FAILED` e `statusReason` legível, a regra do EventBridge disparou o alerta, e a linha apareceu na consulta do Athena na partição do dia. Controle de compliance que nunca viu uma falha de verdade é controle que vai falhar na primeira.

## Custo, volume e dado pessoal: a conta que o anúncio não faz

**Custo de trilha:** a primeira cópia de management events é gratuita; cópias adicionais custam US$ 2,00 por 100 mil eventos. A cota padrão de `IssueCertificate` é 25 por segundo por conta e região, ajustável, o que dá um teto de cerca de 2,16 milhões de emissões por dia. No pior caso teórico, uma segunda trilha dedicada custaria US$ 43 por dia; na prática, com 6 mil emissões diárias, são US$ 0,12. O que pesa é o que você empilha em cima: Insights a US$ 0,35 por 100 mil eventos analisados e Lake a US$ 0,75 por GB ingerido. Assumindo cerca de 3 KB por evento (o TBS em base64 é a maior parte), 6 mil eventos por dia são 18 MB por dia, meio GB por mês, centavos. É a consulta mal escrita, sem filtro de partição, que estoura o orçamento, não o evento.

**Custo de manutenção, que é o que importa:** o decodificador de TBS é código seu. Vai quebrar quando um template novo introduzir uma extensão que o parser não conhece, e vai quebrar em silêncio se você não contar eventos de entrada contra linhas de saída. Coloque esse diferencial num alarme desde o primeiro dia.

**LGPD e segregação:** certificados de usuário emitidos pelo conector de Active Directory carregam nome e e-mail no subject e no SAN. O bucket da trilha vira, sem ninguém decidir, um repositório de dado pessoal com retenção longa. Isso muda quem pode ler o bucket, exige chave KMS própria com política que negue `kms:Decrypt` fora da conta de segurança, e entra no registro de operações de tratamento. Não é problema do Private CA; é consequência de ter, finalmente, o conteúdo inteiro no log.

## Anti-padrões que eu já vi nascer em menos de uma semana

- **Filtrar o CloudTrail por `userIdentity.arn` para achar quem pediu**: o envelope diz `invokedBy: acm-pca.amazonaws.com` para todo evento; o solicitante está em `serviceEventDetails.requesterArn`, e nem sempre está.
- **Usar o evento como gatilho de revogação automática**: a entrega pelo CloudTrail e pelo EventBridge é best effort e leva minutos; um laço de controle que precisa de garantia de entrega não pode viver em cima dele.
- **Aposentar o relatório de auditoria**: o evento não cobre revogação nem o acervo anterior a 5 de outubro de 2026; o relatório continua sendo a fotografia oficial para o auditor.
- **Tratar o TBS como se fosse o certificado emitido**: ele não tem a assinatura; serve para inventário e auditoria de conteúdo, não para validar cadeia ou distribuir a clientes.
- **Deixar o bucket da trilha com a criptografia padrão depois disso**: DN e SAN de certificado de usuário é dado pessoal; chave KMS própria e política de leitura restrita deixam de ser opcionais.

## Perguntas que me fizeram esta semana

### Preciso ligar alguma coisa na CA?

Não. O evento é de gerenciamento e sai automaticamente em toda região com Private CA. O que você precisa é uma trilha que grave management events na conta dona da CA, e isso quase toda organização regulada já tem.

### O evento substitui o `SignCertificate`?

Complementa. O `SignCertificate` continua registrando a operação de assinatura; o `IssueCertificateDetails` adiciona o conteúdo do TBS, os metadados de conveniência e as falhas pré-assinatura, que o `SignCertificate` nunca viu.

### Em CA compartilhada via RAM, quem recebe o evento?

O anúncio diz a conta dona da CA; o guia do usuário diz dona e solicitante. Projete para a dona: coloque a CA na conta de segurança e a trilha da organização cobre o resto. Se a conta solicitante também receber, é cópia, não fonte.

### Como extraio o SAN se o Athena não lê ASN.1?

Decodifique o `tbsCertificate` fora do Athena: Lambda em Python com `cryptography` ou `openssl asn1parse` em lote, gravando SAN, key usage e tamanho de chave como colunas Parquet. Conte eventos de entrada contra linhas de saída; o parser vai quebrar um dia e você quer saber no mesmo dia.

> **Nota do curador:** Eu ligaria a regra de `FAILED` amanhã de manhã e deixaria o decodificador de TBS para a segunda semana: a recusa por name constraints é o sinal de segurança mais barato que o Private CA já ofereceu, e o inventário rico pode esperar o backfill do acervo antigo. A lição dura por trás disso: em PKI financeira o custo nunca foi emitir o certificado, foi provar seis meses depois o que foi emitido e o que foi negado, e até agora essa prova era um script meu rodando `GetCertificate` contra uma cota de 75 por segundo. Quem administra CA compartilhada deve escolher a conta de segurança como dona antes de escalar, porque é nela que o evento aterrissa. E trate o bucket da trilha como o que ele virou: um repositório de dado pessoal com retenção regulatória.

## Veredito

Adote sem hesitar se você opera Private CA em ambiente com BACEN, PCI-DSS ou LGPD, roda o modo de curta duração, ou tem mais de uma conta pedindo certificados da mesma CA: a regra de EventBridge para `FAILED`, a tabela no Athena e o decodificador de TBS custam centavos por mês e devolvem uma prova de auditoria que antes exigia script e paciência. Mantenha o relatório de auditoria para revogação e para o acervo anterior a 5 de outubro de 2026. Não use o evento como gatilho de ação crítica: a entrega é best effort e em minutos. E, antes de qualquer consulta, resolva chave KMS, política de leitura e retenção do bucket da trilha, porque a partir de agora ele guarda o conteúdo inteiro de cada certificado que a sua CA assinou.

**Rating:** Recomendado com condições

## Referências

- [AWS What's New: AWS Private CA now provides detailed certificate issuance logs (05/10/2026)](https://aws.amazon.com/about-aws/whats-new/2026/10/aws-private-ca-certificate-issuance-logs/)
- [AWS Private CA User Guide: Logging API calls using CloudTrail (IssueCertificateDetails event reference)](https://docs.aws.amazon.com/privateca/latest/userguide/logging-using-cloudtrail-pca.html)
- [AWS Private CA User Guide: Use audit reports with your private CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaAuditReport.html)
- [AWS General Reference: AWS Private CA endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/pca.html)
- [AWS Private CA pricing](https://aws.amazon.com/private-ca/pricing/)
- [AWS CloudTrail pricing](https://aws.amazon.com/cloudtrail/pricing/)
- [Amazon EventBridge: AWS Private Certificate Authority events](https://docs.aws.amazon.com/eventbridge/latest/ref/events-ref-acm-pca.html)
- [Amazon Athena: Query AWS CloudTrail logs](https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html)
