Finalização assíncrona de assinaturas
A finalização assíncrona de assinaturas é uma abordagem oferecida pelo PKI SDK para um processo de assinatura mais confiável e otimizado. O uso da finalização assíncrona visa as seguintes vantagens:
- Resistência a falhas na distribuição de CRLs/OCSPs e carimbos de tempo.
- Ganho de desempenho na parte síncrona do processo, pois não é mais necessário aguardar resposta de requisições de CRL, OCSP ou carimbo de tempo.
- Uso de políticas de assinatura com grace period.
Deste modo, a assinatura do cliente é solicitada apenas uma vez e é salva, encerrando-se o processo com o usuário. Em um outro momento, através de um background worker por exemplo, as requisições e verificações online ou em cache são realizadas e a assinatura é finalizada. Caso haja problemas neste segundo passo, não é necessário solicitar novamente a assinatura do cliente.
Finalizador de assinaturas
A finalização de assinatura é gerenciada pela classe CadesSignatureFinisher. Abaixo temos um exemplo de uso do finalizador e em seguida um detalhamento dos métodos utilizados.
Em um primeiro momento, criamos uma assinatura não finalizada:
// Assinatura CAdES básica
var signer = new CadesSigner();
signer.SetSigningCertificate(signingCert);
signer.SetDataToSign(toSign);
signer.SetPolicy(policy);
// Antes de executar o ComputeSignature(),
// defina que a assinatura não será finalizada
signer.SetFinishSignature(false);
signer.ComputeSignature();
var cadesSig = signer.GetSignature(); // retorna pacote de assinatura não finalizado
// Salvar a assinatura não finalizada e encerrar o processo
Em um segundo momento, através de um background worker (serviço do Windows ou task agendada), finalizamos a assinatura:
// Carregando assinatura não finalizada
byte[] cadesSig = ...
// Instanciando o finilizador com a assinatura não finalizada
var finisher = new CadesSignatureFinisher(CadesSignature.Open(cadesSig)));
finisher.SetPolicy(policy);
finisher.SetTimestampRequester(tsRequester); // requester do carimbo de tempo (se a política exigir carimbo)
finisher.UseOnlyCRLsIssuedAfterGracePeriod = true; // usar apenas valores de revogação emitidos após o fim do grace period
finisher.PerformStep();
if (finisher.IsSignatureFinished) {
// Assinatura finalizada
// Retorna os bytes da assinatura finalizada com encoding BER
var finishedCadesSig = finisher.GetSignatureEncoded();
} else {
// Retorna o delay sugerido até a chamda novamente do serviço de finalização com PerformStep()
var delay = finisher.NextStepDelay.Value;
// ou
// Retorna a hora sugerida para a próxima chamada ao serviço de finalização com PeformStep()
var time = finisher.NextStepTime.Value;
}
SetPolicy(CadesPolicySpec) / SetPolicyMapper(ICadesPolicyMapper) / SetPolicyMapper(ICadesPolicyMapperBySignerInfo) - Usados para definir a política de assinatura para finalização. Ideal que seja a mesma política utilizada no assinador, mas neste segundo momento apenas as propriedades de carimbos de tempo, valores e referências de revogação e certificados serão utilizadas.
SetTimestampRequester(ITimestampRequester) - Usado se a política de assinatura exigir carimbo de tempo.
UseOnlyCrlsIssuedAfterGracePeriod - Exige que os valores de revogação a serem verificados tenham sido emitidos após o grace period. Para mais informações sobre grace period veja o artigo Políticas com grace period.
PerformStep() - Este método é o motor do finalizador de assinatura, é responsável por buscar os elementos necessários para finalizar a assinatura e, se houver política de grace period, informa novo momento para sua execução caso o grace period não tenha encerrado.