Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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();
                }
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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();
                }
            }
        }