Skip to content

Latest commit

 

History

History
57 lines (42 loc) · 2.52 KB

README.md

File metadata and controls

57 lines (42 loc) · 2.52 KB

nfe

Bibliotecas para geração, validação, assinatura e transmissão de XMLs da NFe. Pretendo desenvolver essa biblioteca conforme a necessidade surgir. Por enquanto apenas as consultas de Status, NFe e Cadastro estão disponíveis.

Extraindo chaves de um certificado A1 (.pfx) para uso com o biblioteca

openssl pkcs12 -in certificado.pfx -out ~/client.pem -clcerts -nokeys -nodes
openssl pkcs12 -in certificado.pfx -out ~/key.pem -nocerts -nodes

Consulta NFe

Exemplo

package main

import (
	"encoding/json"
	"net/http"
	"fmt"

	"github.com/frones/nfe"
)

func main() {
	client, err := nfe.NewHTTPClient("~/client.pem", "~/key.pem")
	if err != nil {
		fmt.Printf("Erro na criação do HTTP Client e leitura do certificado. Detalhes: %v\n", err)
		return
	}
	ret, xmlfile, err := nfe.ConsultaNFe("12345678901234567890123456789012345678901234", nfe.Homologacao, client, func(req *http.Request) {req.Header.Set("User-Agent", "MyUA/1.0")})
	if err != nil {
		fmt.Printf("Erro na consulta da chave de acesso. Detalhes: %v\n", err)
		return
	}

	fmt.Printf("Objeto RetConsSitNFe: %v\n", ret)
	fmt.Printf("Arquivo XML: %v\n", string(xmlfile))

	jsonfile, err := json.Marshal(ret)
	if err != nil {
		fmt.Printf("Erro na serialização do json. Detalhes: %v\n", err)
		return
	}
	fmt.Printf("Arquivo JSON: %v\n", string(jsonfile))
}

Problemas de comunicação com a Sefaz-RS e ambientes virtuais SV-RS

Usando a crypto/tls padrão do Go, foi observado um problema intermitente de comunicação com os ambientes da Sefaz-RS, com resposta 403 sendo retornada. O problema acontece porque a crypto/tls não envia o certificado durante o handshake quando a CertificateRequest do servidor especifica autoridades certificadoras que não batem com a CA do certificado [source]. Outras Sefazes não enviam uma lista de CAs permitidas, não apresentando esse problema. Mesmo a Sefaz-RS, em algumas requests não envia lista de CAs permitidas, fazendo com que o problema seja intermitente.

Durante depuração, identifiquei que de fato, a CA do meu certificado não estava na lista de CAs permitidas pelo servidor, de maneira que faz sentido que a crypto/tls não envie, mas não fica claro porque outras bibliotecas, como a OpenSSL sempre funcionam.

Um workaround possível é compilar com uma versão alterada da crypto/tls sempre ignorando a instrução de CAs permitidas, mas isso pode ter outras consequencias indesejadas.