Ciclo de vida da assinatura AD-RT
Uma assinatura AD-RT da ICP-Brasil (Referência de Tempo) é uma assinatura básica (AD-RB) com um carimbo de tempo da assinatura, emitido por uma autoridade de carimbo de tempo (ACT) ICP-Brasil. O carimbo prova quando a assinatura foi feita, por isso a assinatura sobrevive ao certificado do signatário. Mas ela não sobrevive ao certificado da ACT. Este artigo mostra por quanto tempo uma assinatura AD-RT continua verificável e como o PKI SDK a mantém verificável por mais tempo, com as políticas AD-RC e AD-RA.
Para um caso real, com assinaturas que precisam durar décadas, veja Revalidação de diplomas, que mostra como o Digiploma mantém os diplomas digitais verificáveis.
Criar uma assinatura AD-RT
A política AD-RT exige um carimbo de tempo da assinatura, por isso o assinador precisa de um requisitante de carimbo de tempo. O exemplo abaixo assina um elemento de um documento XML (XAdES):
var signer = new XmlElementSigner();
signer.SetSigningCertificate(cert); // certificado do signatário, com a chave privada
signer.SetXml(xmlDocument);
signer.SetToSignElementId(id);
signer.SetPolicy(XmlPoliciesForGeneration.GetPkiBrazilAdrTempo());
// autoridade de carimbo de tempo (ACT) ICP-Brasil
var tsaUri = new Uri("https://act.exemplo.com.br/");
signer.SetTimestampRequester(new TimestampRequester(tsaUri, accessToken));
signer.ComputeSignature(); // lança TimestampException se não conseguir o carimbo
var signedXml = signer.GetSignedXml();
A mesma política existe para os outros formatos: CadesPoliciesForGeneration.GetPkiBrazilAdrTempo() (CAdES) e
PadesPoliciesForGeneration.GetPkiBrazilAdrTempo() (PAdES).
Por quanto tempo ela continua verificável
| Período | Verificável? | Por quê |
|---|---|---|
| Enquanto o certificado do signatário for válido | Sim | Como qualquer assinatura. |
| Depois que o certificado do signatário expira | Sim | O carimbo de tempo da assinatura prova que ela foi feita enquanto o certificado era válido. |
| Depois que o certificado da ACT expira | Não | O próprio carimbo de tempo da assinatura não pode mais ser verificado. |
Uma assinatura AD-RT também não guarda os certificados e as LCRs usados na validação: validá-la mais tarde depende de obtê-los nos repositórios das autoridades certificadoras.
Para saber até quando uma assinatura AD-RT pode ser verificada, leia o certificado do carimbo de tempo da assinatura:
var signature = XmlSignatureEditor.Open(signedXml).Signatures.First();
var timestamp = signature.SignatureTimestamps.Last().EncapsulatedTimestamp;
var verifiableUntil = timestamp.Signers.First().SigningCertificate.ValidityEnd;
Manter a assinatura verificável
Cada política ICP-Brasil acrescenta evidências à anterior:
- AD-RC (Referências Completas,
XmlPoliciesForGeneration.GetPkiBrazilAdrCompleta()) acrescenta as referências e os valores dos certificados e das LCRs usados na validação, e um carimbo de tempo sobre a assinatura e essas referências. Ela não depende mais dos repositórios das autoridades certificadoras, mas os carimbos dela também expiram. - AD-RA (Referências para Arquivamento,
XmlPoliciesForGeneration.GetPkiBrazilAdrArquivamento()) acrescenta um carimbo de tempo de arquivamento. Antes que ele expire, um novo carimbo de arquivamento, emitido com um certificado mais recente da ACT, é acrescentado sobre tudo. Renovada a tempo, a assinatura continua verificável indefinidamente.
O XmlSignatureEditor.ExtendArchiving acrescenta esse novo carimbo de arquivamento. Ele primeiro registra os dados de validação do carimbo
de arquivamento anterior e depois carimba a assinatura de novo:
var editor = XmlSignatureEditor.Open(signedXml);
var signature = editor.Signatures.First(s => s.ArchiveTimestamps.Any());
var expiresOn = signature.ArchiveTimestamps.Last().EncapsulatedTimestamp.Signers.First().SigningCertificate.ValidityEnd;
if (expiresOn < DateTimeOffset.Now.AddDays(180)) {
var renewedXml = editor.ExtendArchiving(signature, timestampRequester, XmlPoliciesForValidation.GetPkiBrazil());
// Guarde renewedXml no lugar do arquivo anterior
}
O ExtendArchiving lança InvalidArchiveOperationException quando:
- a assinatura não é válida;
- nenhum dos carimbos de arquivamento dela pode ser validado;
- o novo carimbo é assinado pelo mesmo certificado de um carimbo de arquivamento anterior, o que não estenderia o vencimento. Passe
ignoreSameTsSigner: truepara aceitá-lo mesmo assim.
O ExtendArchiving exige uma política com carimbo de arquivamento: numa assinatura AD-RT ou AD-RC, ele falha. Para preservar essas
assinaturas, proteja-as com uma assinatura AD-RA sobre o documento inteiro, que as cobre, e renove o carimbo de arquivamento dela. É assim
que funciona um diploma digital: as assinaturas dos elementos DadosDiploma e DadosRegistro são cobertas pela assinatura de
arquivamento do XML inteiro.