/// <summary> /// Obtém a assinatura de um objeto serializável /// </summary> /// <typeparam name="T"></typeparam> /// <param name="objeto"></param> /// <param name="id"></param> /// <param name="certificadoDigital">Informe o certificado digital, se já possuir esse em cache, evitando novo acesso ao certificado</param> /// <returns>Retorna um objeto do tipo Classes.Assinatura.Signature, contendo a assinatura do objeto passado como parâmetro</returns> public static Signature ObterAssinatura <T>(T objeto, string id, ConfiguracaoServico cfgServico = null) where T : class { if (cfgServico == null) { cfgServico = ConfiguracaoServico.Instancia; } return(ObterAssinatura <T>(objeto, id, CertificadoDigital.ObterCertificado(cfgServico.Certificado), cfgServico.Certificado.ManterDadosEmCache)); }
/// <summary> /// Obtém a assinatura de um objeto serializável /// </summary> /// <typeparam name="T"></typeparam> /// <param name="objeto"></param> /// <param name="id"></param> /// <param name="certificadoDigital">Informe o certificado digital, se já possuir esse em cache, evitando novo acesso ao certificado</param> /// <returns>Retorna um objeto do tipo Classes.Assinatura.Signature, contendo a assinatura do objeto passado como parâmetro</returns> public static Signature ObterAssinatura <T>(T objeto, string id, X509Certificate2 certificadoDigital = null) where T : class { var objetoLocal = objeto; if (id == null) { throw new Exception("Não é possível assinar um objeto evento sem sua respectiva Id!"); } var certificado = certificadoDigital ?? CertificadoDigital.ObterCertificado(); try { var documento = new XmlDocument { PreserveWhitespace = true }; documento.LoadXml(FuncoesXml.ClasseParaXmlString(objetoLocal)); var docXml = new SignedXml(documento) { SigningKey = certificado.PrivateKey }; var reference = new Reference { Uri = "#" + id }; // adicionando EnvelopedSignatureTransform a referencia var envelopedSigntature = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(envelopedSigntature); var c14Transform = new XmlDsigC14NTransform(); reference.AddTransform(c14Transform); docXml.AddReference(reference); // carrega o certificado em KeyInfoX509Data para adicionar a KeyInfo var keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(certificado)); docXml.KeyInfo = keyInfo; docXml.ComputeSignature(); //// recuperando a representação do XML assinado var xmlDigitalSignature = docXml.GetXml(); var assinatura = FuncoesXml.XmlStringParaClasse <Signature>(xmlDigitalSignature.OuterXml); return(assinatura); } finally { //Se não mantém os dados do certificado em cache e o certificado não foi passado por parâmetro(isto é, ele foi criado dentro deste método), //então libera o certificado, chamando o método reset. if (!ConfiguracaoServico.Instancia.Certificado.ManterDadosEmCache & certificadoDigital == null) { certificado.Reset(); } } }
/// <summary> /// Obtém a asinatura de um objeto serializável /// </summary> /// <typeparam name="T"></typeparam> /// <param name="objeto"></param> /// <param name="id"></param> /// <returns>Retorna um objeto do tipo Classes.Assinatura.Signature, contendo a assinatura do objeto passado como parâmetro</returns> public static Signature ObterAssinatura <T>(T objeto, string id) where T : class { var objetoLocal = objeto; if (id == null) { throw new Exception("Não é possível assinar um objeto evento sem sua respectiva Id!"); } var serialCertificado = ConfiguracaoServico.Instancia.SerialCertificado; if (String.IsNullOrEmpty(serialCertificado)) { throw new Exception("O nº de série do certificado não foi informado para a função ObterAssinatura!"); } var certificado = CertificadoDigital.BuscaCertificado(serialCertificado); var documento = new XmlDocument { PreserveWhitespace = true }; documento.LoadXml(FuncoesXml.ClasseParaXmlString(objetoLocal)); var docXml = new SignedXml(documento) { SigningKey = certificado.PrivateKey }; var reference = new Reference { Uri = "#" + id }; // adicionando EnvelopedSignatureTransform a referencia var envelopedSigntature = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(envelopedSigntature); var c14Transform = new XmlDsigC14NTransform(); reference.AddTransform(c14Transform); docXml.AddReference(reference); // carrega o certificado em KeyInfoX509Data para adicionar a KeyInfo var keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(certificado)); docXml.KeyInfo = keyInfo; docXml.ComputeSignature(); //// recuperando a representacao do XML assinado var xmlDigitalSignature = docXml.GetXml(); var assinatura = FuncoesXml.XmlStringParaClasse <Signature>(xmlDigitalSignature.OuterXml); return(assinatura); }
/// <summary> /// Obtém a assinatura de um objeto serializável /// </summary> /// <typeparam name="T">Tipo do objeto a ser assinado</typeparam> /// <param name="objeto">Objeto a ser assinado</param> /// <param name="id">Id para URI do objeto <see cref="Signature"/></param> /// <param name="configuracaoServico">Configuração do serviço</param> /// <returns>Retorna um objeto do tipo Classes.Assinatura.Signature, contendo a assinatura do objeto passado como parâmetro</returns> public static Signature ObterAssinatura <T>(T objeto, string id, ConfiguracaoServico configuracaoServico = null) where T : class { var cfgServico = configuracaoServico ?? ConfiguracaoServico.Instancia; X509Certificate2 certificadoDigital = null; try { certificadoDigital = CertificadoDigital.ObterCertificado(cfgServico.Certificado); return(ObterAssinatura <T>(objeto, id, certificadoDigital, cfgServico.Certificado.ManterDadosEmCache, cfgServico.Certificado.SignatureMethodSignedXml, cfgServico.Certificado.DigestMethodReference, cfgServico.RemoverAcentos)); } finally { if (!cfgServico.Certificado.ManterDadosEmCache) { certificadoDigital?.Reset(); } } }