DFeSigner.NET 1.0.4

dotnet add package DFeSigner.NET --version 1.0.4
                    
NuGet\Install-Package DFeSigner.NET -Version 1.0.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DFeSigner.NET" Version="1.0.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DFeSigner.NET" Version="1.0.4" />
                    
Directory.Packages.props
<PackageReference Include="DFeSigner.NET" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DFeSigner.NET --version 1.0.4
                    
#r "nuget: DFeSigner.NET, 1.0.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DFeSigner.NET@1.0.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DFeSigner.NET&version=1.0.4
                    
Install as a Cake Addin
#tool nuget:?package=DFeSigner.NET&version=1.0.4
                    
Install as a Cake Tool

DFeSigner.NET

.NET C# xUnit GitHub License


📖 Sobre o Projeto

DFeSigner.NET é uma biblioteca em C# (.NET) projetada para simplificar o processo de assinatura digital de Documentos Fiscais Eletrônicos (DF-e) no padrão brasileiro. Utilizando certificados digitais X.509 (A1 ou A3), a biblioteca oferece uma solução flexível e robusta para integrar a funcionalidade de assinatura em suas aplicações, com foco inicial em NF-e (Nota Fiscal Eletrônica), NFC-e (Nota Fiscal de Consumidor Eletrônica), CT-e (Conhecimento de Transporte Eletrônico) e MDF-e (Manifesto Eletrônico de Documentos Fiscais).

O projeto adota uma arquitetura modular permitindo a fácil extensão para outros tipos de DF-e no futuro. Acompanha um projeto de testes unitários abrangente para garantir a confiabilidade e a validação das funcionalidades de assinatura.


✨ Funcionalidades

  • Assinatura de NF-e: Assina digitalmente documentos XML de Nota Fiscal Eletrônica (modelo 55).

  • Assinatura de NFC-e: Assina digitalmente documentos XML de Nota Fiscal de Consumidor Eletrônica (modelo 65).

  • Assinatura de CT-e: Assina digitalmente documentos XML de Conhecimento de Transporte Eletrônico (modelo 57).

  • Assinatura de MDF-e: Assina digitalmente documentos XML de Manifesto Eletrônico de Documentos Fiscais (modelo 58).

  • Validação de Assinatura Digital: Verifica se um documento XML possui uma assinatura digital válida, garantindo a integridade e autenticidade do documento.

  • Validação de Tipo de Documento: As implementações concretas (NF-e, NFC-e, CT-e, MDF-e) validam o modelo do documento no XML para garantir que o tipo correto de assinador está sendo usado.

  • Tratamento de Erros Robusto: Lançamento de exceções personalizadas e claras para cenários como XML inválido, certificado nulo, certificado sem chave privada, XML sem a tag raiz esperada ou sem o referenceId.

  • Testes Unitários: Projeto de testes dedicado (xUnit) com exemplos de uso e cenários de sucesso e falha.

  • Suporte a Certificados X.509: Compatível com certificados PFX (A1) carregados de arquivo ou certificados instalados no repositório do Windows (A3).


🚀 Tecnologias Utilizadas

  • C# (.NET): Linguagem de programação e plataforma principal.

  • XML (System.Xml): Para manipulação e leitura de documentos XML.

  • Criptografia XML (System.Security.Cryptography.Xml): Componente do .NET para operações de assinatura XML digital.

  • Certificados X.509 (System.Security.Cryptography.X509Certificates): Para gerenciamento e uso de certificados digitais.

  • xUnit: Framework de testes unitários para .NET.


🛠️ Instalação e Configuração

Para configurar e executar o projeto, siga os passos abaixo:

  1. Clone o Repositório:

    git clone https://github.com/tiago-saldanha/DFeSigner.NET.git
    cd DFeSigner
    
  2. Abra no Visual Studio:

    • Abra o arquivo de solução DFeSigner.sln no Visual Studio (2019 ou superior).
  3. Restaure as Dependências:

    • O Visual Studio deve restaurar automaticamente os pacotes NuGet. Caso contrário, clique com o botão direito na solução e selecione Restore NuGet Packages.
  4. Construa a Solução:

    • Clique em Build > Build Solution (ou Ctrl+Shift+B) para compilar os projetos DFeSigner.Core e DFeSigner.Tests.

💡 Como Usar

A biblioteca é projetada para ser fácil de usar. Você precisa de um conteúdo XML (string) e um certificado digital X.509.

Exemplo de Uso (Assinando e Validando DF-e):

using DFeSigner.Core.Signers;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using System;
using DFeSigner.Core.Exceptions;

public class ExemploAssinatura
{
    public static void Main(string[] args)
    {
        try
        {
            // Caminhos de exemplo (ajuste para seus arquivos reais)
            string xmlNFePath = "caminho/para/sua/nfe.xml";
            string xmlNFCePath = "caminho/para/sua/nfce.xml";
            string xmlCTePath = "caminho/para/sua/cte.xml";
            string xmlMDFePath = "caminho/para/sua/mdfe.xml";
            string certificatePath = "caminho/para/seu/certificado.pfx";
            string certificatePassword = "sua_senha_do_certificado"; 
            
            // 1. Carregar o Certificado Digital (exemplo de certificado PFX com senha)
            // Para certificados A3 (instalados no Windows), você pode usar o GetCertificateBySubjectName().
            X509Certificate2 certificate = new X509Certificate2(
                certificatePath, 
                certificatePassword, 
                X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet
            );
            Console.WriteLine("Certificado carregado com sucesso.");

            // --- Exemplo com NF-e ---
            Console.WriteLine("Assinando NF-e...");
            string xmlNFeContent = File.ReadAllText(xmlNFePath);
            NFeXmlSigner nfeSigner = new NFeXmlSigner();
            string signedNFeXml = nfeSigner.Sign(xmlNFeContent, certificate);
            Console.WriteLine("NF-e assinada com sucesso!");
            File.WriteAllText("nfe_assinada.xml", signedNFeXml);

            // --- Validação da NF-e assinada ---
            Console.WriteLine("Validando assinatura da NF-e...");
            bool isNFeSignatureValid = nfeSigner.IsSignatureValid(signedNFeXml);
            Console.WriteLine($"Assinatura da NF-e é válida: {isNFeSignatureValid}");


            // --- Exemplo com NFC-e ---
            Console.WriteLine("Assinando NFC-e...");
            string xmlNFCeContent = File.ReadAllText(xmlNFCePath);
            NFCeXmlSigner nfceSigner = new NFCeXmlSigner();
            string signedNFCeXml = nfceSigner.Sign(xmlNFCeContent, certificate);
            Console.WriteLine("NFC-e assinada com sucesso!");
            File.WriteAllText("nfce_assinada.xml", signedNFCeXml);

            // --- Validação da NFC-e assinada ---
            Console.WriteLine("Validando assinatura da NFC-e...");
            bool isNFCeSignatureValid = nfceSigner.IsSignatureValid(signedNFCeXml);
            Console.WriteLine($"Assinatura da NFC-e é válida: {isNFCeSignatureValid}");


            // --- Exemplo com CT-e ---
            Console.WriteLine("Assinando CT-e...");
            string xmlCTeContent = File.ReadAllText(xmlCTePath);
            CTeXmlSigner cteSigner = new CTeXmlSigner();
            string signedCTeXml = cteSigner.Sign(xmlCTeContent, certificate);
            Console.WriteLine("CT-e assinada com sucesso!");
            File.WriteAllText("cte_assinada.xml", signedCTeXml);

            // --- Validação do CT-e assinado ---
            Console.WriteLine("Validando assinatura do CT-e...");
            bool isCTeSignatureValid = cteSigner.IsSignatureValid(signedCTeXml);
            Console.WriteLine($"Assinatura do CT-e é válida: {isCTeSignatureValid}");


            // --- Exemplo com MDF-e ---
            Console.WriteLine("Assinando MDF-e...");
            string xmlMDFeContent = File.ReadAllText(xmlMDFePath);
            MDFeXmlSigner mdfeSigner = new MDFeXmlSigner();
            string signedMDFeXml = mdfeSigner.Sign(xmlMDFeContent, certificate);
            Console.WriteLine("MDF-e assinada com sucesso!");
            File.WriteAllText("mdfe_assinada.xml", signedMDFeXml);

            // --- Validação do MDF-e assinado ---
            Console.WriteLine("Validando assinatura do MDF-e...");
            bool isMDFeSignatureValid = mdfeSigner.IsSignatureValid(signedMDFeXml);
            Console.WriteLine($"Assinatura do MDF-e é válida: {isMDFeSignatureValid}");

        }
        catch (DFeSignerException dfeEx)
        {
            Console.WriteLine($"Erro na assinatura/validação do DF-e: {dfeEx.Message}");
            if (dfeEx.InnerException != null)
            {
                Console.WriteLine($"Detalhes internos: {dfeEx.InnerException.Message}");
            }
            if (dfeEx is InvalidCertificateException)
            {
                Console.WriteLine("Verifique o certificado digital (caminho, senha ou chave privada).");
            }
            else if (dfeEx is InvalidXmlFormatException xmlFormatEx)
            {
                Console.WriteLine($"O XML não está formatado corretamente. Tag raiz esperada: {xmlFormatEx.ExpectedRootTag}");
            }
            else if (dfeEx is MissingReferenceIdException missingIdEx)
            {
                Console.WriteLine($"O XML não possui o referenceId necessário no elemento '{missingIdEx.ElementName}'.");
            }
            else if (dfeEx is MissingSignatureElementException)
            {
                Console.WriteLine("O XML não contém o elemento de assinatura digital (<Signature>).");
            }
            else if (dfeEx is UnexpectedDocumentTypeException unexpectedTypeEx)
            {
                Console.WriteLine($"Tipo de documento inesperado. Esperado: {unexpectedTypeEx.ExpectedModel}, Encontrado: {unexpectedTypeEx.FoundModel}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Ocorreu um erro inesperado: {ex.Message}");
            Console.WriteLine(ex.ToString());
        }
    }
}

📄 Licença

Este projeto está licenciado sob a Licença MIT. Clique aqui para mais detalhes.

© 2025 Tiago Ávila Saldanha

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.4 115 7/31/2025
1.0.3 116 7/30/2025
1.0.2 113 7/29/2025
1.0.1 108 7/29/2025

Biblioteca dedicada a oferecer uma solução simples para assinar e validar digitalmente seus documentos fiscais, incluindo NF-e, NFC-e, CT-e e MDF-e, utilizando um certificado digital (A1/A3).