private static void _gerarPdfAssinado(AssinarDTO dadosAssinatura, string SRC, string DEST, ICipherParameters pk, X509Certificate[] chain) { using (FileStream fileStramDestino = new FileStream(DEST, FileMode.Create)) using (PdfReader reader = new PdfReader(SRC)) { PdfSigner signer = new PdfSigner(reader, fileStramDestino, new StampingProperties()); _addCarimbo(dadosAssinatura, chain, signer); //finalizando IExternalSignature pks = new PrivateKeySignature(pk, DigestAlgorithms.SHA256); signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS); } }
private static void _addCarimbo(AssinarDTO dadosAssinatura, X509Certificate[] chain, PdfSigner signer) { PdfSignatureAppearance appearance = signer.GetSignatureAppearance(); var informacoesCertificado = chain.First().SubjectDN.GetValueList(); var assinante = informacoesCertificado[informacoesCertificado.Count - 1]; var textoCarimbo = $"Assinado digitalmente por: {assinante}. \n" + $"Em: {dadosAssinatura.Local}. \n" + $"Na data de: {DateTime.Now:dd/MM/yyyy} as {DateTime.Now:HH:mm}. \n" + $"Razão: {dadosAssinatura.Razao}."; appearance.SetLayer2Text(textoCarimbo) .SetPageRect(new Rectangle(dadosAssinatura.GetPosicao().X, dadosAssinatura.GetPosicao().Y, dadosAssinatura.GetTamanho().X, dadosAssinatura.GetTamanho().Y)) .SetLocation(dadosAssinatura.Local) .SetReason(dadosAssinatura.Razao) .SetSignatureCreator("SGI Digital Signature") .SetPageNumber(1) ; signer.SetFieldName("Campo de assinatura"); }
private string _assinar(FileInfo certificadoFileInfo, AssinarDTO dadosAssinatura, FileInfo pdfFileInfo) { // codigo externo retirado do link: https://viewbag.wordpress.com/2019/12/24/pdf-digital-signatures-itext7-bouncy-castle-net-core/ var diretorioCertificado = certificadoFileInfo.FullName; var senhaCertificado = dadosAssinatura.Senha.ToCharArray(); var SRC = pdfFileInfo.FullName; var DEST = _diretorioArquivoAssinado.FullName + pdfFileInfo.Name; var urlArquivoAssinado = AssinarHelper.BASE_URL(Request, _hostingEnvironment.IsProduction()) + PASTA_ARQUIVO_ASSINADO + pdfFileInfo.Name; try { using (var chaveStram = new FileStream(diretorioCertificado, FileMode.Open, FileAccess.Read)) { Pkcs12Store pk12; try { pk12 = new Pkcs12Store(chaveStram, senhaCertificado); } catch { _erros.Add("Não foi possivel abrir o certificado PFX, possiveis motivos: senha inválida para acessar o certificado, ou certificado corrompido."); return(""); } var alias = _obterAlias(pk12); var pk = pk12.GetKey(alias).Key; var chain = _gerarCertificadoChain(pk12, alias); _gerarPdfAssinado(dadosAssinatura, SRC, DEST, pk, chain); } } catch (Exception erro) { _erros.Add("Não foi possivel assinar o arquivo. Ocorreram erros ao gerar o arquivo assiando. erro: " + erro.Message); return(""); } return(urlArquivoAssinado); }
private void _validarDadosAssinatura(AssinarDTO dadosAssinatura) { _validarCampo(dadosAssinatura.Senha, "json.senha"); _validarCampo(dadosAssinatura.Local, "json.local"); _validarCampo(dadosAssinatura.Razao, "json.razao"); }