Assinatura com Certificado ICP-Brasil via API: A1 na Sessão Direta, A3 pela Expressa e pelo App
Quando o documento precisa de assinatura qualificada, a pergunta que chega ao time de integração é sempre a mesma: "dá para assinar com certificado ICP-Brasil pela API?". A resposta curta é sim, mas o caminho muda conforme o tipo de certificado do signatário. O A1 (arquivo instalado no computador ou no celular) é assinado diretamente na sessão criada pela API, na própria página hospedada, sem que a chave privada saia do dispositivo do titular. O A3 (token USB ou cartão inteligente) é assinado pela Assinatura Expressa ou pelo app da SignDocs, por meio do SignDocsBrasil Assinador, o aplicativo gratuito de desktop que faz a ponte entre o token e a página de assinatura.
Este guia mostra os dois caminhos de ponta a ponta: o perfil DIGITAL_CERTIFICATE e suas etapas, o que acontece no navegador do signatário quando ele usa um A1, como o Assinador entra em cena para o A3, os erros de certificado que você vai encontrar e o que fica registrado como evidência. No fim há uma regra prática para decidir, caso a caso, entre a sessão direta e a Expressa.
Se você ainda está avaliando se o documento precisa mesmo de certificado, o guia de autenticação multimétodo compara todos os perfis; o de API brasileira com ICP-Brasil explica o contexto legal. Aqui o foco é a mecânica.
Quando exigir certificado ICP-Brasil
A assinatura com certificado ICP-Brasil é a assinatura qualificada da Lei 14.063/2020: a que carrega a presunção de veracidade do art. 10, §1º, da MP 2.200-2/2001 em relação ao signatário. Na prática, o integrador exige certificado em três situações:
- Quando a norma ou o edital pede assinatura qualificada. Alguns atos perante órgãos públicos e alguns contratos regulados exigem ICP-Brasil expressamente. Nesses casos não há escolha: o perfil é
DIGITAL_CERTIFICATE. - Quando a contraparte já opera com certificado. Escritórios de contabilidade, advocacia, empresas que assinam notas fiscais e procurações eletrônicas costumam ter e-CNPJ ou e-CPF à mão; para elas, o certificado é o caminho de menor atrito.
- Quando o valor em jogo justifica a presunção máxima. Para a maioria dos contratos, a assinatura avançada com OTP ou biometria é suficiente e converte melhor. O certificado entra onde a disputa sobre autoria seria cara.
Regra de bolso: certificado para quem já tem certificado ou para quem a lei obriga. Para o público geral, o perfil qualificado derruba a conversão, porque a maioria dos brasileiros não possui certificado digital. Combine perfis por signatário: o representante da empresa assina com e-CNPJ, o cliente pessoa física assina com biometria ou OTP, tudo no mesmo envelope.
O perfil DIGITAL_CERTIFICATE: criação e etapas
A sessão é criada como qualquer outra, trocando apenas o perfil de política. Não há campo para enviar o certificado do signatário, e isso é proposital: o integrador nunca manuseia chave nem arquivo do titular.
Internamente, o perfil vira uma sequência fixa de duas etapas, executadas nessa ordem na página hospedada:
| Etapa | O que o signatário faz | O que fica registrado |
|---|---|---|
CLICK_ACCEPT |
Confirma a identidade declarada, lê o documento e aceita os termos de uso e a política de privacidade. | Data e hora (UTC), IP, geolocalização, user-agent, aceite dos termos. |
DIGITAL_SIGN_A1 |
Seleciona o certificado A1, informa a senha do arquivo e assina. | Cadeia de certificados apresentada, resultado da assinatura, algoritmo, hash do documento, geolocalização e dispositivo. |
Dois detalhes que evitam chamados de suporte: DIGITAL_SIGN_A1 é o nome da etapa, não do perfil. Enviar "profile": "DIGITAL_SIGN_A1" devolve 400. E o nome da etapa não limita o tipo de certificado que a plataforma como um todo aceita: ele descreve o que a sessão direta da API executa, que é o A1. O A3 tem outro caminho, descrito adiante.
O que acontece na página hospedada com um A1
O ponto central do desenho é que a chave privada nunca sai do dispositivo do signatário. O servidor da SignDocs prepara o que precisa ser assinado, o navegador assina, o servidor monta a assinatura final. Passo a passo:
- Seleção do certificado. O signatário escolhe o arquivo A1 (
.pfx/.p12) e informa a senha. O arquivo é aberto localmente, no navegador. - Preparação. A página envia ao servidor apenas a cadeia de certificados (a parte pública, em PEM). O servidor valida a cadeia, calcula o resumo criptográfico do documento com SHA-256 e devolve o material a assinar (
hashToSign/dataToSign) junto de um identificador da requisição de assinatura (signatureRequestId) e dos algoritmos usados. - Assinatura local. A chave privada, ainda no navegador, assina esse resumo. O que volta para o servidor é a assinatura bruta em base64 (
rawSignatureBase64), nunca a chave, nunca a senha. - Montagem. O servidor combina a assinatura bruta com a cadeia e o documento, monta a estrutura CMS/PAdES e grava o resultado da etapa com geolocalização e informações do dispositivo. A sessão conclui, o webhook
SIGNING_SESSION.COMPLETEDdispara e o documento assinado fica disponível para download.
Para o integrador, isso significa: você não precisa de nenhum SDK criptográfico, não armazena certificado de ninguém e não tem chave privada de terceiro no seu perímetro. Sua parte termina em criar a sessão e tratar o webhook. Os formatos de assinatura produzidos estão descritos em PKCS#7, CMS, PAdES e CAdES.
Quer ver o formato do arquivo final antes de integrar? A página de assinar PDF com e-CPF ou e-CNPJ mostra o resultado do ponto de vista de quem assina.
Erros de certificado: o que a página recusa
A validação acontece na etapa de preparação, antes de qualquer assinatura. A página recusa cadeia inválida ou vencida e explica ao signatário o que fazer. Os casos mais comuns:
| Situação | O que acontece | O que orientar |
|---|---|---|
| Certificado vencido | A validação da cadeia recusa; a etapa não avança. | Renovar o certificado na Autoridade Certificadora. A sessão continua ACTIVE até expirar, então o mesmo link serve depois da renovação. |
| Senha do arquivo incorreta | O arquivo não abre no navegador; nada é enviado ao servidor. | Conferir a senha definida na emissão. A SignDocs não tem como recuperá-la. |
| Cadeia incompleta ou não ICP-Brasil | A validação recusa a cadeia. | Usar certificado emitido por AC credenciada na ICP-Brasil; certificados autoassinados ou de outras hierarquias não servem. |
| Titular do certificado diferente do signatário | O certificado carrega CPF ou CNPJ do titular; em produção, esse CPF/CNPJ é cruzado com o do signatário declarado na sessão e a divergência é recusada (422); em homologação a divergência gera apenas aviso. | Criar a sessão com o CPF (ou CNPJ) de quem realmente vai assinar. |
| Token A3 conectado, mas sessão direta da API | A sessão direta executa a etapa A1; o token não é lido nesse fluxo. | Encaminhar o signatário pela Assinatura Expressa ou pelo app, com o Assinador instalado (próxima seção). |
Do lado da API, esses casos não geram erro na criação da sessão: a sessão nasce ACTIVE e a recusa acontece na interação do signatário. Monitore pelos eventos STEP.FAILED e pelo status da transação, como descrito em webhooks e eventos.
A3: token e cartão pelo SignDocsBrasil Assinador
O certificado A3 vive dentro de um dispositivo criptográfico (token USB ou cartão inteligente) e, por definição, a chave privada não pode ser exportada. Um navegador não conversa com esse dispositivo sozinho. Por isso a SignDocs mantém o SignDocsBrasil Assinador: um aplicativo gratuito para Windows, macOS e Linux que fala PKCS#11 com o token e faz a ponte, localmente, com a página de assinatura.
Como a ponte funciona:
- O signatário instala o Assinador e o driver (middleware) do fabricante do token, como SafeSign, SafeNet ou OpenSC. A tabela de compatibilidade lista os modelos testados.
- Ao abrir a página de assinatura da Assinatura Expressa em um navegador baseado em Chromium (Chrome, Edge, Brave), a página se comunica com o Assinador que está rodando no próprio computador, por HTTPS na porta 8757 (ou HTTP na porta 8756).
- O Assinador lê os certificados disponíveis no token, o signatário escolhe o dele e digita o PIN. A assinatura é calculada dentro do dispositivo; o Assinador devolve apenas a assinatura à página.
- A plataforma monta o CMS/PAdES, registra as mesmas evidências (data e hora, IP, geolocalização, dispositivo, cadeia) e conclui a assinatura.
O app da SignDocs (Android e iOS) usa a mesma conexão com o Assinador para assinar com A3: o documento é aberto no app, e a assinatura acontece no computador onde o token está conectado. O que não existe é leitura de token diretamente pelo celular.
Onde o A3 entra e onde não entra: A1 é assinado diretamente na sessão criada pela API. A3 é assinado pela Assinatura Expressa ou pelo app, por meio do SignDocsBrasil Assinador. A sessão direta da API (DIGITAL_CERTIFICATE em /v1/signing-sessions) executa apenas a etapa A1. Detalhes de instalação e requisitos estão em assinatura com token A3 e na Central A3.
A1, A3 e certificado em nuvem: comparação para o integrador
| Critério | A1 (arquivo) | A3 (token/cartão) | Certificado em nuvem |
|---|---|---|---|
| Onde está a chave | No computador ou celular do titular | Dentro do dispositivo criptográfico | Em HSM do provedor do certificado |
| Validade típica | 1 ano | Até 3 anos, conforme a AC | Conforme o provedor |
| Valor jurídico | Qualificada (ICP-Brasil) | Qualificada (ICP-Brasil) | Qualificada quando emitido por AC ICP-Brasil |
| Na sessão direta da API | Sim: etapa DIGITAL_SIGN_A1 na página hospedada |
Não; usar Expressa ou app com o Assinador | Depende da interface PKCS#11 do provedor; valide com o suporte antes de prometer ao cliente |
| Na Assinatura Expressa e no app | Sim | Sim, via SignDocsBrasil Assinador | Valide com o suporte |
| O que o integrador precisa fazer | Nada além de criar a sessão | Orientar a instalação do Assinador e do driver do token | Confirmar o provedor com o suporte |
| Sistemas | Qualquer navegador moderno | Windows, macOS, Linux com navegador Chromium | Conforme o provedor |
Sobre o certificado em nuvem (BirdID, VIDaaS, SafeID, NeoID e similares): o suporte depende de o provedor expor uma interface compatível com o Assinador. Não trate como garantido; peça a confirmação ao suporte da SignDocs para o provedor específico do seu cliente antes de desenhar o fluxo.
Sessão direta ou Assinatura Expressa: como decidir
A decisão é por signatário, não por projeto. Um mesmo contrato pode ter o representante da empresa assinando com e-CNPJ A3 pela Expressa e o cliente assinando com biometria pela sessão direta.
| Se o signatário... | Use | Por quê |
|---|---|---|
| Tem A1 (e-CPF ou e-CNPJ em arquivo) | Sessão direta com DIGITAL_CERTIFICATE |
Integração completa por API: criação, link, webhook, download. Nenhum software adicional. |
| Tem A3 (token ou cartão) | Assinatura Expressa (ou app) com o Assinador | É o único caminho que lê o dispositivo. Você acompanha pela plataforma e recebe o documento assinado com as mesmas evidências. |
| Não sabe se tem certificado | Perfil avançado (OTP ou biometria) | Exigir certificado de quem não tem é a forma mais rápida de perder a assinatura. Reserve o qualificado para quem precisa. |
| É obrigado por norma a assinar com ICP-Brasil e só tem A3 | Expressa com o Assinador, com orientação de instalação enviada junto do convite | Reduz o abandono: a maior causa de falha no A3 é o driver do token ausente, não a plataforma. |
Para testar o fluxo A1 sem custo, use o ambiente de homologação: crie a sessão com DIGITAL_CERTIFICATE, abra o link e assine com um certificado A1 de teste ou com o seu próprio. O documento e as evidências ficam disponíveis por sete dias. O fluxo A3 é testado na Assinatura Expressa com o Assinador instalado.
O que fica registrado como evidência
Assinatura qualificada não dispensa a trilha de auditoria; ela a complementa. Para cada assinatura com certificado, a transação registra:
- A cadeia de certificados apresentada pelo signatário, com titular, AC emissora e validade, junto do resultado da validação.
- O hash SHA-256 do documento no momento da assinatura e a assinatura criptográfica montada em CMS/PAdES, verificável em qualquer leitor compatível e no verificador público.
- As evidências de contexto: data e hora em UTC, IP, geolocalização, user-agent e informações do dispositivo, tanto no aceite quanto na assinatura.
- O aceite dos termos feito na etapa
CLICK_ACCEPT.
Tudo isso compõe o pacote de evidências (.p7m) da transação, baixável pela API depois da conclusão. Em caso de contestação, você apresenta o documento assinado com o certificado e, além dele, a prova de como e quando a assinatura aconteceu.
Limite honesto: a plataforma não aplica carimbo do tempo de Autoridade de Carimbo do Tempo. A referência temporal é a data e hora registradas na trilha de auditoria, não um carimbo qualificado ICP-Brasil. Se a sua área jurídica exigir carimbo do tempo, trate isso como requisito à parte.
Perguntas Frequentes
Dá para assinar com certificado ICP-Brasil pela API SignDocs?
Sim. Crie a sessão com policy.profile DIGITAL_CERTIFICATE. O signatário abre o link, aceita os termos e assina com o certificado A1 dele na própria página hospedada; a chave privada nunca sai do dispositivo e o integrador não manuseia certificado algum. Para A3 (token USB ou cartão), a assinatura é feita pela Assinatura Expressa ou pelo app da SignDocs, por meio do SignDocsBrasil Assinador, o aplicativo gratuito de desktop que faz a ponte entre o token e a página de assinatura.
A sessão criada pela API aceita token A3?
A sessão direta da API executa a etapa DIGITAL_SIGN_A1, que assina com certificado A1 no navegador. Um token A3 não é lido nesse fluxo. Para signatários com A3, use a Assinatura Expressa ou o app, com o SignDocsBrasil Assinador instalado no computador onde o token está conectado. O resultado é o mesmo documento assinado em CMS/PAdES, com as mesmas evidências de data e hora, IP, geolocalização e dispositivo.
O que a SignDocs recebe do certificado do signatário?
Apenas a parte pública: a cadeia de certificados em PEM, usada para validar a emissão ICP-Brasil, a validade e o titular. O servidor devolve o resumo criptográfico a assinar, o navegador do signatário assina esse resumo com a chave privada e devolve só a assinatura bruta em base64. Nem a chave nem a senha do arquivo trafegam. Esse desenho vale para o A1 na página hospedada; no A3, a assinatura é calculada dentro do token e o Assinador devolve só a assinatura.
Por que DIGITAL_SIGN_A1 não é aceito como perfil?
Porque DIGITAL_SIGN_A1 é o nome de uma etapa, não de um perfil de política. O perfil é DIGITAL_CERTIFICATE, que a plataforma converte na sequência CLICK_ACCEPT seguida de DIGITAL_SIGN_A1. Enviar DIGITAL_SIGN_A1 em policy.profile devolve 400. O nome da etapa descreve o que a sessão direta executa, o A1; não significa que a plataforma não suporte A3, que tem seu próprio caminho pela Assinatura Expressa e pelo app.
O que acontece se o certificado estiver vencido ou fora da cadeia ICP-Brasil?
A validação da cadeia recusa o certificado na etapa de preparação, antes de qualquer assinatura, e a página orienta o signatário. A criação da sessão pela API não falha por isso: a sessão nasce ACTIVE e a recusa aparece na interação do signatário. Depois de renovar o certificado, o mesmo link continua válido até o prazo da sessão. Acompanhe pelos eventos STEP.FAILED e pelo status da transação.
Posso misturar certificado e biometria no mesmo envelope?
Sim. O perfil é definido por signatário ao criar cada sessão do envelope. É comum o representante da empresa assinar com e-CNPJ (A1 pela sessão direta ou A3 pela Expressa) enquanto o cliente pessoa física assina com biometria ou OTP. Todos os signatários assinam o mesmo documento e a trilha de auditoria registra o método de cada um, o que evita exigir certificado de quem não tem e derrubar a conversão.
Teste o perfil DIGITAL_CERTIFICATE no sandbox
Crie credenciais de homologação, envie uma sessão com certificado e assine com o seu A1 hoje. Para volumes de produção e signatários com A3, o time comercial dimensiona um plano sob medida.
Criar credenciais de homologação Fale com o time comercial