DFeSigner.NET
1.0.4
dotnet add package DFeSigner.NET --version 1.0.4
NuGet\Install-Package DFeSigner.NET -Version 1.0.4
<PackageReference Include="DFeSigner.NET" Version="1.0.4" />
<PackageVersion Include="DFeSigner.NET" Version="1.0.4" />
<PackageReference Include="DFeSigner.NET" />
paket add DFeSigner.NET --version 1.0.4
#r "nuget: DFeSigner.NET, 1.0.4"
#:package DFeSigner.NET@1.0.4
#addin nuget:?package=DFeSigner.NET&version=1.0.4
#tool nuget:?package=DFeSigner.NET&version=1.0.4
DFeSigner.NET
📖 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:
Clone o Repositório:
git clone https://github.com/tiago-saldanha/DFeSigner.NET.git cd DFeSigner
Abra no Visual Studio:
- Abra o arquivo de solução
DFeSigner.sln
no Visual Studio (2019 ou superior).
- Abra o arquivo de solução
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
.
- O Visual Studio deve restaurar automaticamente os pacotes NuGet. Caso contrário, clique com o botão direito na solução e selecione
Construa a Solução:
- Clique em
Build
>Build Solution
(ouCtrl+Shift+B
) para compilar os projetosDFeSigner.Core
eDFeSigner.Tests
.
- Clique em
💡 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.
Copyright
© 2025 Tiago Ávila Saldanha
Product | Versions 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. |
-
net8.0
- System.Security.Cryptography.Xml (>= 9.0.7)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
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).