Solução de problemas: falhas de assinatura e carimbo de tempo
Estas entradas cobrem falhas de assinatura geradas por NextPDF\Exception\SignatureException e NextPDF\Security\Signature\Exception\SignatureLevelUnreachableException. Cada entrada indica o método de fábrica ou a classe exata, para que você possa confirmar a causa pela mensagem e por getContext(), em vez de inferi-la.
Observação sobre a redação: o engine não certifica que uma assinatura seja válida nem que um documento esteja protegido. Ele relata a falha que detectou. Trate cada resolução como uma etapa para eliminar uma causa relatada.
Entrada: o nível PAdES “B-LT” ou “B-LTA” não pode ser produzido
Seção intitulada “Entrada: o nível PAdES “B-LT” ou “B-LTA” não pode ser produzido”- Sintoma.
SignatureExceptioncom o final de mensagemnextpdf/enterprise package is required for B-LT/B-LTA signatures. - Causa provável. O provedor de recursos para validação de longo prazo está ausente. B-LT e B-LTA incorporam material de revogação e um carimbo de tempo de arquivamento, e esse provedor é distribuído em
nextpdf/enterprise. - Evidência / diagnóstico. A fábrica
SignatureException::ltvCapabilityMissing()gera exatamente esta mensagem.getContext()retornasignature_leveldefinido como o nível que você tentou. - Resolução.
- Instale o provedor executando
composer require nextpdf/enterprise. - Execute a chamada de assinatura novamente.
- Se você não puder instalar o provedor, solicite
B-BouB-T, que o pacote core pode produzir.
- Instale o provedor executando
- Relacionado. Referência de exceções.
Entrada: o nível de assinatura é inalcançável e a chamada é rejeitada
Seção intitulada “Entrada: o nível de assinatura é inalcançável e a chamada é rejeitada”- Sintoma.
SignatureLevelUnreachableExceptioncom uma mensagem no formatoPAdES level "<x>" is unreachable (highest achievable: "<y>"). - Causa provável. O nível de conformidade solicitado depende de uma infraestrutura que não está disponível no momento da assinatura, normalmente uma autoridade de carimbo de tempo para B-T e superiores. O engine falha de forma fechada: ele não rebaixa silenciosamente para depois anunciar o nível superior.
- Evidência / diagnóstico.
getContext()retornarequestedLevel,highestAchievableLevelereason. O camporeasonidentifica a lacuna de infraestrutura. Esse é o padrão de falha fechada introduzido para evitar um documento que declare um nível que ele não atende. - Resolução.
- Consulte o campo
reasonpara identificar a infraestrutura ausente. - Forneça o componente ausente. Por exemplo, configure uma autoridade de carimbo de tempo e execute a chamada novamente.
- Para aceitar intencionalmente um nível inferior, passe
allowDegradation: trueparaPadesOrchestrator. Nesse caso, a chamada produzhighestAchievableLevele relata o nível que produziu.
- Consulte o campo
- Relacionado. Criptografia e permissões.
Entrada: o cliente da autoridade de carimbo de tempo é necessário, mas está ausente
Seção intitulada “Entrada: o cliente da autoridade de carimbo de tempo é necessário, mas está ausente”- Sintoma.
SignatureExceptioncom o finalTSA client is required for level <x> but none was provided. - Causa provável. Uma solicitação B-T, B-LT ou B-LTA precisa de um cliente de autoridade de carimbo de tempo, e o orquestrador não recebeu nenhum.
- Evidência / diagnóstico. A fábrica
SignatureException::tsaRequired()gera esta mensagem;getContext()traz osignature_leveltentado. - Resolução.
- Configure um cliente de autoridade de carimbo de tempo e passe-o para o orquestrador.
- Execute a chamada novamente.
- Para produzir um nível que não precisa de carimbo de tempo, solicite
B-B.
- Relacionado. Referência de exceções.
Entrada: a URL do endpoint da autoridade de carimbo de tempo está vazia
Seção intitulada “Entrada: a URL do endpoint da autoridade de carimbo de tempo está vazia”- Sintoma.
SignatureExceptioncom o finalTSA endpoint URL is empty. - Causa provável. Um cliente de autoridade de carimbo de tempo foi criado com uma URL de endpoint vazia.
- Evidência / diagnóstico. A fábrica
SignatureException::tsaUrlEmpty()gera esta mensagem. Este é um defeito de configuração, não uma falha de rede. - Resolução.
- Defina uma URL de endpoint não vazia no cliente da autoridade de carimbo de tempo, como
https://timestamp.example.com/tsa. - Se o nível solicitado não exigir carimbo de tempo, remova a configuração do cliente da autoridade de carimbo de tempo.
- Execute a chamada novamente.
- Defina uma URL de endpoint não vazia no cliente da autoridade de carimbo de tempo, como
- Relacionado. Referência de exceções.
Entrada: o espaço reservado da assinatura está ausente do buffer
Seção intitulada “Entrada: o espaço reservado da assinatura está ausente do buffer”- Sintoma.
SignatureExceptioncom o finalno /Contents <…> field found in PDF buffer (signature placeholder missing). - Causa provável. O estágio de assinatura recebeu um buffer sem contêiner de assinatura reservado; portanto, não há lugar para gravar a assinatura.
- Evidência / diagnóstico. A fábrica
SignatureException::signatureContentsNotFound()gera esta mensagem. - Resolução.
- Certifique-se de que o campo de assinatura e o respectivo espaço reservado sejam gravados antes da execução do estágio de assinatura.
- Execute o pipeline novamente para que o espaço reservado exista quando a assinatura começar.
- Relacionado. Referência de exceções.
Entrada: o status de revogação é desconhecido (o respondedor OCSP recusou)
Seção intitulada “Entrada: o status de revogação é desconhecido (o respondedor OCSP recusou)”- Sintoma.
SignatureExceptioncom o finalOCSP responder returned non-successful OCSPResponseStatus "<status>". - Causa provável. O respondedor do Online Certificate Status Protocol (OCSP) não retornou um status
successful, portanto não produziu nenhuma asserção de revogação. O engine segue o RFC 6960 §4.2.1, citado no código-fonte: um corpo de resposta preenchido é permitido apenas para o statussuccessful (0). O engine se recusa a tratar uma resposta recusada como um resultado de confiança positivo. - Evidência / diagnóstico. A fábrica
SignatureException::nonSuccessfulOcspResponseStatus()gera esta mensagem e informa o status relatado, comotryLaterouinternalError. Um byte de status reservado ou desconhecido gera, em vez disso,SignatureException::reservedOcspResponseStatus(). - Resolução.
- Identifique o status na mensagem. Para um status transitório, como
tryLater, tente buscar a revogação novamente mais tarde. - Para
unauthorizedoumalformedRequest, verifique a URL da solicitação OCSP e o certificado que o respondedor espera. - Não suprima a falha para obter um artefato B-LT ou B-LTA; a asserção de revogação faz parte desse nível.
- Identifique o status na mensagem. Para um status transitório, como
- Relacionado. Referência de exceções.
Entrada: uma entrada da cadeia de certificados falha ao decodificar
Seção intitulada “Entrada: uma entrada da cadeia de certificados falha ao decodificar”- Sintoma.
SignatureExceptioncom o finalfailed to base64-decode PEM body — input is not valid PEM. - Causa provável. Uma entrada da cadeia de certificados não está em um formato Privacy-Enhanced Mail (PEM) válido, normalmente por truncamento, um caractere fora do lugar ou um blob binário em Distinguished Encoding Rules (DER) fornecido onde se esperava PEM.
- Evidência / diagnóstico. A fábrica
SignatureException::pemDecodingFailed()gera esta mensagem durante a montagem da cadeia. - Resolução.
- Inspecione cada certificado da cadeia em busca de caracteres fora do lugar ou truncamento.
- Reexporte o certificado afetado no formato PEM.
- Execute a chamada de assinatura novamente.
- Relacionado. Criptografia e permissões.
Entrada: o tipo de chave privada não corresponde ao algoritmo
Seção intitulada “Entrada: o tipo de chave privada não corresponde ao algoritmo”- Sintoma.
SignatureExceptioncom o finalexpected private key of type "<x>" for the configured algorithm but got "<y>". - Causa provável. A chave privada carregada não corresponde ao algoritmo de assinatura configurado, como uma chave Rivest-Shamir-Adleman (RSA) combinada com uma seleção de Elliptic Curve Digital Signature Algorithm (ECDSA).
- Evidência / diagnóstico. A fábrica
SignatureException::unexpectedKeyType()gera esta mensagem e informa tanto a classe de chave esperada quanto a real. - Resolução.
- Verifique se o par de certificado e chave corresponde ao algoritmo que você selecionou.
- Altere a seleção do algoritmo para corresponder à chave ou carregue a chave que corresponde ao algoritmo.
- Execute a chamada de assinatura novamente.
- Relacionado. Referência de exceções.
Entrada: o material de chave ou de assinatura Ed25519 está malformado
Seção intitulada “Entrada: o material de chave ou de assinatura Ed25519 está malformado”- Sintoma.
SignatureExceptioncom um final que indica uma incompatibilidade de comprimento Ed25519 — por exemplo,Ed25519 signature length <n> ≠ expected 64 bytes, ouEd25519 round-trip self-verify failed. - Causa provável. A build criptográfica em tempo de execução retornou material de chave ou de assinatura com o comprimento errado, ou uma assinatura recém-produzida falhou na verificação contra sua própria chave pública. O engine cita o RFC 8032 §3.4 no código-fonte, que fixa uma assinatura Ed25519 destacada em 64 bytes. O engine aborta em vez de emitir material que não consegue verificar por conta própria.
- Evidência / diagnóstico. As fábricas relevantes são
SignatureException::ed25519SignatureMalformed(),::ed25519RoundTripVerifyFailed(),::ed25519KeyParseFailed(),::ed25519SeedInvalid(),::ed25519SecretKeyMalformed()e::ed25519PublicKeyInvalid(). Cada uma informa o comprimento observado. - Resolução.
- Reinstale a extensão libsodium do PHP; uma build sem componentes necessários ou corrompida é a causa documentada de material com comprimento errado.
- Confirme que a chave é uma chave Ed25519 e que o OpenSSL está na versão 1.1.1 ou mais recente.
- Execute a chamada de assinatura novamente.
- Relacionado. Referência de exceções.
Entrada: o dicionário de carimbo de tempo de arquivamento não foi emitido
Seção intitulada “Entrada: o dicionário de carimbo de tempo de arquivamento não foi emitido”- Sintoma.
SignatureExceptioncom o finalno /Type /DocTimeStamp dictionary was emitted into the PDF buffer. - Causa provável. O ciclo de arquivamento B-LTA foi executado, mas o dicionário de carimbo de tempo do documento nunca chegou ao buffer. O artefato seria um B-LTA gravado parcialmente, portanto o engine se recusa a retorná-lo.
- Evidência / diagnóstico. A fábrica
SignatureException::documentTimestampNotEmitted()gera esta mensagem. Esta falha de pós-condição é gerada no momento da finalização. - Resolução.
- Trate a saída como descartada; não distribua o artefato parcial.
- Execute o pipeline B-LTA novamente com uma autoridade de carimbo de tempo acessível.
- Se a falha se repetir, capture
getContext()e a exceção anterior encadeada para um relatório de defeito.
- Relacionado. Referência de exceções.
Casos extremos e armadilhas
Seção intitulada “Casos extremos e armadilhas”- Essas fábricas definem
cert_infocomo um subject ou thumbprint apenas quando algum deles está disponível; umcert_infovazio é esperado para falhas de recurso e de configuração. - Uma solicitação B-LT ou B-LTA sem um cliente Hypertext Transfer Protocol (HTTP) configurado gera
SignatureException::httpClientMissing(); a busca de revogação exige um cliente PHP Standards Recommendation (PSR)-18 passado para o orquestrador. - Um certificado baseado em um hardware security module (HSM) sem uma implementação de signatário gera
SignatureException::hsmSignerMissing(); conecte o signatário ao certificado antes de assinar.
Veja também
Seção intitulada “Veja também”Glossário: nível PAdES · asserção de revogação