CAdES na Prática: Assinar Qualquer Arquivo com Certificado ICP-Brasil

Nem todo documento é PDF. Planilha de fechamento, arquivo XML de integração, imagem digitalizada, pacote de dados que alimenta outro sistema — tudo isso pode precisar de assinatura com certificado ICP-Brasil, e nada disso cabe no PAdES. O padrão para esses casos é o CAdES, e o arquivo que sai dele costuma ter a extensão .p7s.

CAdES é a sigla de CMS Advanced Electronic Signatures. É uma extensão do CMS — o padrão de contêiner criptográfico que descende do PKCS#7 — criada, nas palavras do DOC-ICP-15 do ITI, "com vistas a prover as assinaturas digitais de informações que permitam sua validação por longo prazo". Na prática, é o formato mais genérico e mais universal dos três padrões adotados pela ICP-Brasil.

Este guia percorre a estrutura do contêiner, a diferença entre assinatura anexada e destacada, os atributos que separam um CMS qualquer de um CAdES, o que só o CAdES consegue fazer e o PDF não, e como o SignDocs Brasil usa esse padrão em dois lugares distintos do produto. Para o panorama comparativo, veja PKCS#7, CMS, PAdES e CAdES; para o PDF, o guia de PAdES.

A base: o que o CMS carrega

Um contêiner CMS do tipo SignedData transporta, em uma estrutura ASN.1 codificada em DER, quatro coisas que interessam:

  • Os algoritmos de resumo usados, declarados no topo.
  • O conteúdo assinado — opcionalmente, e é aqui que nasce a escolha mais importante do formato.
  • Os certificados necessários para montar a cadeia até a raiz.
  • Um ou mais blocos de signatário, cada um com seus atributos, o algoritmo usado e a assinatura propriamente dita.

O ITI resume a característica que define o uso: o CMS "não permite assinar partes de um documento, somente o documento como um todo". É granularidade de arquivo inteiro — diferente do XML, que permite assinar apenas uma parte do documento.

Anexada ou destacada: a escolha que define a operação

A inclusão do conteúdo dentro da estrutura CMS é opcional, e o DOC-ICP-15 nomeia as duas representações:

Anexada (attached) Destacada (detached)
O que há no arquivo Conteúdo digital incluído na estrutura CMS Conteúdo digital fora da estrutura CMS
Quantos arquivos circulam Um só Dois: o original e a assinatura
Risco operacional Arquivo maior, e o original precisa ser extraído para uso Perder um dos dois torna o outro inútil
Quando faz sentido Arquivamento, envio a terceiros, prova de longo prazo O original precisa continuar utilizável no formato nativo, sem extração

A regra prática: se o arquivo vai circular como prova, use anexada — um arquivo só, impossível de desemparelhar. Se o arquivo original precisa continuar sendo consumido por um sistema que não entende CMS (um importador de XML, por exemplo), use destacada e trate os dois arquivos como um par indivisível, com o mesmo nome-base.

Sobre extensões, o ITI recomenda que os arquivos com assinaturas digitais ICP-Brasil sejam gerados com as extensões p7s, xml e pdf. Na prática do mercado, .p7s designa a assinatura e .p7m costuma designar a mensagem assinada com o conteúdo dentro — uma convenção herdada do S/MIME, não uma imposição do padrão.

O que transforma um CMS em CAdES: os atributos assinados

Atributos assinados entram no cálculo do resumo criptográfico — alterar qualquer um deles invalida a assinatura. Atributos não assinados ficam fora, o que é exatamente o que permite acrescentar informação depois sem quebrar nada. Os que aparecem no dia a dia:

Atributo OID Para que serve
contentType 1.2.840.113549.1.9.3 Declara o tipo do conteúdo assinado.
messageDigest 1.2.840.113549.1.9.4 O resumo criptográfico do conteúdo. É o elo com o documento.
signingTime 1.2.840.113549.1.9.5 O instante declarado pelo signatário. O ITI o classifica como referência declarada, sem confiabilidade própria na fonte.
signingCertificateV2 1.2.840.113549.1.9.16.2.47 Amarra a assinatura ao certificado exato que a produziu, por resumo do certificado e referência ao emissor e número de série.
CMSAlgorithmProtection 1.2.840.113549.1.9.52 Protege a declaração dos algoritmos contra substituição, conforme a RFC 6211.

O signingCertificateV2 merece destaque porque resolve um ataque real: sem ele, um contêiner pode ser manipulado para apontar para outro certificado com a mesma chave pública. Com ele, a assinatura declara, de dentro do próprio cálculo, qual certificado a produziu.

Coassinatura e contra-assinatura: o que o PDF não faz

Esta é a vantagem estrutural do CAdES, e o DOC-ICP-15 a descreve com precisão. Para CAdES e XAdES existem três arranjos; para PAdES, apenas dois.

  • Assinatura simples — uma assinatura sobre um conteúdo. Existe nos três padrões.
  • Coassinatura, também chamada de assinatura paralela — "duas ou mais assinaturas digitais são geradas de forma paralela e independente pelos signatários, utilizando conteúdos digitais idênticos", cada uma com seus próprios atributos. Só CAdES e XAdES.
  • Contra-assinatura — a assinatura é feita sobre a sequência de bytes que representa uma assinatura já existente. É o que expressa hierarquia: testemunha, endosso, aprovação de quem assinou. Só CAdES e XAdES.

Em PDF, como vimos no guia de PAdES, os arranjos são assinatura simples e assinatura serial: cada signatário assina o documento inteiro, com as assinaturas anteriores dentro. Não há como dizer, no formato, que a assinatura B é sobre a assinatura A, e não sobre o documento.

Quando o requisito de negócio é literalmente "o gerente referenda a assinatura do analista", a expressão nativa disso é contra-assinatura em CAdES. Em PDF, isso vira convenção de ordem e registro na trilha de auditoria — o que funciona, mas não é a mesma coisa no nível do formato.

CAdES-ICP-Brasil e as políticas de assinatura

O padrão internacional define o que é possível. A ICP-Brasil define o que é aceito. O DOC-ICP-15 é direto: é CAdES-ICP-Brasil toda assinatura no formato CAdES que, além de seguir os requisitos de assinatura digital ICP-Brasil, possui um identificador de política de assinatura pertencente ao conjunto de políticas divulgadas e aprovadas conforme o DOC-ICP-15.03. E a validação, diz o mesmo documento, deve exigir que a assinatura esteja de acordo com uma das políticas aprovadas.

As cinco políticas publicadas pelo ITI, aplicáveis ao CAdES:

  • AD-RB — Assinatura digital com Referência Básica.
  • AD-RT — Assinatura digital com Referência de Tempo.
  • AD-RV — Assinatura digital com Referências para Validação.
  • AD-RC — Assinatura digital com Referências Completas.
  • AD-RA — Assinatura digital com Referências para Arquivamento.

O ITI descreve ainda a lógica de evolução: uma assinatura pode receber atributos que a levem de um nível ao seguinte, porque a informação acrescentada entra como atributo não assinado e, por definição, não quebra a assinatura original.

Se um edital, contrato ou norma setorial cita uma dessas siglas nominalmente, trate como requisito técnico explícito, confirme o entendimento com o jurídico e leve ao time comercial antes de fechar o desenho da integração.

Onde o SignDocs Brasil usa CAdES

Em dois lugares distintos, com propósitos diferentes — e confundi-los é fonte garantida de mal-entendido.

1. Assinatura de documentos que não são PDF

A API aceita bem mais que PDF: .docx, .doc, .xlsx, .xls, .pptx, .ppt, .odt, .ods, .odp, .rtf, .txt, .csv, .jpg, .jpeg, .png, .tiff, .tif, .bmp, .svg, .xml, .json e .html, com limite de 10 MB. Quando o arquivo enviado não é PDF, o fluxo de assinatura com certificado é o genérico, e o resultado é um .p7s:

  1. O SHA-256 é calculado sobre o arquivo inteiro — sem manipulação do documento, sem ByteRange, sem inserir nada dentro dele.
  2. Os atributos autenticados são montados com o mesmo conjunto do fluxo PAdES, incluindo o signingCertificateV2.
  3. A chave privada do signatário assina o resumo desses atributos — no navegador, com A1, ou no token, com A3, pelo SignDocsBrasil Assinador via PKCS#11.
  4. O servidor monta o contêiner CMS com o conteúdo anexado: o arquivo original vai dentro do .p7s.

Em envelope com vários signatários, cada novo signatário tem seu bloco acrescentado ao mesmo contêiner, que ao final carrega todos os blocos sobre o mesmo conteúdo — a estrutura de coassinatura descrita pelo ITI. Concluído o último, uma cópia consolidada é promovida para o escopo do envelope, e é essa que a verificação expõe como download único. Vale registrar: sempre que algum signatário usa certificado digital, o envelope passa a ser sequencial, e os convites saem um a um.

O arquivo original não é convertido nem alterado. Uma planilha assinada continua sendo exatamente aquela planilha, byte a byte, dentro do contêiner. Essa é a diferença essencial em relação a qualquer fluxo que converta o documento para PDF antes de assinar: ali, o que foi assinado é a conversão, não o original.

2. O pacote de evidências .p7m

O segundo uso não tem relação com o certificado do signatário. Toda transação gera uma trilha de auditoria, e essa trilha é empacotada em um CMS assinado com o certificado ICP-Brasil A1 da própria SignDocs Brasil — um e-CNPJ. O que isso prova é diferente: não que fulano assinou, mas que o registro do que aconteceu não foi adulterado depois. As duas provas se somam e não se substituem. Detalhes em o pacote de evidências .p7m.

PAdES ou CAdES: como decidir

Situação Escolha
O documento é PDF e vai ser lido por pessoas PAdES — assinatura embutida, verificável no leitor
O arquivo não é PDF e converter descaracterizaria o original CAdES
É preciso expressar endosso sobre a assinatura de outro CAdES, com contra-assinatura
A contraparte só sabe abrir PDF PAdES, sem hesitar
O conteúdo é XML consumido por outro sistema Avalie o padrão XAdES antes de decidir

Validar um .p7s, e o que costuma falhar

Para uma inspeção rápida de estrutura, o OpenSSL resolve:

openssl pkcs7 -inform DER -in assinatura.p7s -print_certs -text openssl smime -verify -inform DER -in assinatura.p7s \ -CAfile cadeia-icp-brasil.pem -out conteudo-extraido.bin

Para conformidade com o perfil brasileiro, o caminho é o Validador do ITI, que confere a aderência à política e não apenas a matemática. O verificador público abre a trilha de auditoria pelo identificador da evidência, e a verificação programática cobre o caso de PDF.

As falhas mais comuns:

  1. Assinatura destacada sem o original. Um .p7s destacado sozinho não verifica nada. Quem gerou precisa entregar o par.
  2. O original foi tocado. Reabrir e salvar uma planilha muda bytes. O resumo deixa de bater, mesmo que o conteúdo visível pareça idêntico.
  3. Cadeia incompleta. Faltando os certificados intermediários, o validador não chega à raiz. Um contêiner bem montado leva a cadeia dentro.
  4. Reserialização do DER. Decodificar, modificar e recodificar os atributos autenticados pode produzir bytes diferentes dos que foram assinados. O sintoma clássico no Validador do ITI é a reprovação da cifra assimétrica em uma assinatura que, do ponto de vista da chave, está correta. É por isso que, no SignDocs Brasil, esses atributos são construídos em DER byte a byte, sem rodada de reserialização.
  5. Algoritmo legado. Contêineres antigos com SHA-1 devem ser tratados como obsoletos.

A visão de conjunto dos formatos, dos certificados e dos níveis de assinatura está na Central de Assinatura Digital.

Perguntas Frequentes

Qual a diferença entre assinatura anexada e destacada?

O DOC-ICP-15 nomeia as duas representações do CMS. Na anexada, o conteúdo digital está incluído na estrutura CMS, e circula um arquivo só. Na destacada, o conteúdo fica fora, e circulam dois arquivos que só têm valor juntos. A regra prática é simples: se o arquivo vai circular como prova, use anexada, porque é impossível desemparelhar. Se o original precisa continuar sendo consumido por um sistema que não entende CMS, use destacada e trate os dois arquivos como um par indivisível.

Qual a diferença entre .p7s e .p7m?

O ITI recomenda que arquivos com assinaturas digitais ICP-Brasil sejam gerados com as extensões p7s, xml e pdf. Na prática do mercado, .p7s designa o arquivo de assinatura e .p7m designa a mensagem assinada com o conteúdo dentro, uma convenção herdada do S/MIME e não uma imposição do padrão. Vale olhar a estrutura, não a extensão: o que define é haver ou não conteúdo dentro do contêiner. No SignDocs Brasil, o .p7s de documentos não-PDF leva o conteúdo anexado.

O que é coassinatura e por que ela não existe em PDF?

Coassinatura, ou assinatura paralela, ocorre quando duas ou mais assinaturas são geradas de forma paralela e independente pelos signatários sobre conteúdos digitais idênticos, cada uma com seus próprios atributos. O DOC-ICP-15 registra que essa propriedade ocorre somente nos padrões CAdES e XAdES. Em PDF os arranjos possíveis são assinatura simples e assinatura serial, em que cada signatário assina o documento inteiro com as assinaturas anteriores dentro dele.

O SignDocs Brasil converte meu arquivo para PDF antes de assinar?

No fluxo genérico com certificado, não. O SHA-256 é calculado sobre o arquivo inteiro, sem manipulação do documento e sem inserir nada dentro dele, e o contêiner CMS é montado com o conteúdo anexado. Uma planilha assinada continua sendo exatamente aquela planilha, byte a byte, dentro do .p7s. Essa é a diferença essencial em relação a converter antes de assinar: nesse caso o que fica assinado é a conversão, não o original.

Como ficam vários signatários em um arquivo não-PDF?

Cada novo signatário tem seu bloco de assinatura acrescentado ao mesmo contêiner, que ao final carrega todos os blocos sobre o mesmo conteúdo, na estrutura de coassinatura descrita pelo ITI. Concluído o último signatário, uma cópia consolidada é promovida para o escopo do envelope e é essa que a verificação expõe como download único. Importante: sempre que algum signatário usa certificado digital, o envelope passa a ser sequencial e os convites saem um a um.

O que torna uma assinatura CAdES uma assinatura CAdES-ICP-Brasil?

Pelo DOC-ICP-15, é CAdES-ICP-Brasil toda assinatura no formato CAdES que, além de seguir os requisitos de assinatura digital ICP-Brasil, possui um identificador de política de assinatura pertencente ao conjunto de políticas divulgadas e aprovadas conforme o DOC-ICP-15.03. A validação deve exigir aderência a uma dessas políticas. As cinco publicadas pelo ITI são AD-RB, AD-RT, AD-RV, AD-RC e AD-RA. Se um edital cita uma sigla nominalmente, trate como requisito técnico e confirme com o jurídico.

Assine planilhas, XML e imagens com certificado ICP-Brasil pela API

Sandbox de homologação gratuito, sem cartão, para testar o fluxo genérico com A1 e A3 antes de levar para produção.

Criar credenciais de homologação Fale com o time comercial