Continuando a conversa sobre o tema das assinaturas eletrônicas (doravante denominada assinatura eletrônica), deve-se dizer sobre a verificação. No artigo anterior, analisei a parte mais difícil da tarefa - criar uma assinatura. Este artigo é um pouco mais simples. A maior parte do código é uma adaptação de exemplos do SDK do Crypto PRO .NET. Antes de tudo, verificaremos as assinaturas de acordo com o GOST R 34.10-2001 e GOST R 34.10-2012, para isso precisamos do CRYPTO PRO.
A tarefa para nós é dividida em 3 partes: uma assinatura separada, uma assinatura em PDF e uma assinatura no MS Word.
Verificação da assinatura separada:
Os comentários estão todos no código, chamarei sua atenção apenas para obter um certificado, precisaremos mais tarde, porque vamos verificar o certificado separadamente.
Bem, não se esqueça de envolver tudo no try-catch e outros usando. No exemplo, eu intencionalmente não faço isso para reduzir o volume
Validação de assinatura em PDF. Aqui precisamos do iTextSharp (a versão atual no momento da redação do 5.5.13):
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (PdfReader pdfReader = new PdfReader(fileStream)) { AcroFields acroFields = pdfReader.AcroFields;
Novamente, não há nada especialmente a comentar. A menos que eu tenha que dizer sobre o Oid, "1.2.840.113549.1.9.5" é o Oid da data de assinatura.
E o último da nossa lista é docx, talvez a opção mais fácil:
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (Package filePackage = Package.Open(fileStream)) { PackageDigitalSignatureManager digitalSignatureManager = new PackageDigitalSignatureManager(filePackage); if (!digitalSignatureManager.IsSigned) {
Agora vamos analisar o certificado e validar toda a cadeia de certificados. Portanto, o assembly deve funcionar com um usuário que tenha acesso à rede.
E então o inferno começa, porque Não sei como obter informações sobre o proprietário do certificado através do Oid, portanto, analisarei a sequência. Rir mais alto: o circo começa.
Mas, falando sério, você pode comentar sobre aqueles que sabem como fazer isso através do Oid:
private static void FillElectronicSignature(X509Certificate2 certificate) { foreach (KeyValuePair<string, string> item in ParseCertificatesSubject(certificate.Subject)) { switch (item.Key) { case "C": string certificatesCountryName = item.Value; break; case "S": string certificatesState = item.Value; break; case "L": string certificatesLocality = item.Value; break; case "O": string certificatesOrganizationName = item.Value; break; case "OU": string certificatesOrganizationalUnitName = item.Value; break; case "CN": string certificatesCommonName = item.Value; break; case "E": string certificatesEmail = item.Value; break; case "STREET": string certificatesStreet = item.Value; break;
O código é o mais curto possível, para uma melhor compreensão da essência.
Em geral, isso é tudo, estou aguardando comentários sobre a obtenção do Oid do certificado e qualquer crítica fundamentada.