Página 1 de 1

Portar para Linux a SefazClass

Enviado: 28 Jun 2021 19:30
por Itamar M. Lins Jr.
Olá!
Alguém que usa a SefazClass no Linux ?
Estou lendo algumas coisas e a principio será apenas entender o processo de assinar, enviar e receber o XML.
O resto acredito que não precisa mexer.
O certificado PFX precisa ser extraído o arquivo privado ".pem" e publico ".pem" alguns tutoriais ensinam como é feito.
Seria bom alguém com mais experiência para ajudar.
https://users.dcc.uchile.cl/~pcamacho/t ... mlsec.html
Este link ensina como fazer a assinatura. Falta a parte de envio e recebimento.
Temos que ir testando cada passo, assinar no Linux e enviar pelo windows para ver se ficou Ok...

Saudações,
Itamar M. Lins Jr.

Portar para Linux a SefazClass

Enviado: 29 Jun 2021 11:31
por JoséQuintas
Itamar M. Lins Jr. escreveu:Temos que ir testando cada passo, assinar no Linux e enviar pelo windows para ver se ficou Ok...
Enviar o XML, tanto faz Linux ou Windows, trata-se de enviar.

Já a assinatura.....
Talvez dê pra dividir em duas etapas:

a) é gerado um HASH encima do XML FORMATADO, não exatamente o que XML que temos
b) é assinado o HASH com o certificado

NÃO SEI se dá pra testar essas coisas de forma separada, pelo menos facilitaria tentar resolver uma de cada vez.
Com as duas juntas, vai ficar difícil saber qual das duas pode estar com problema, e mais difícil de resolver.
De repente uma já está certa, e a outra está errada.

Portar para Linux a SefazClass

Enviado: 29 Jun 2021 11:47
por Itamar M. Lins Jr.
Olá!
Pelo que estou "entendendo", dentro do .PFX temos 3 arquivos(zipados/criptografados)
O OpenSSL extrai eles para usar no Linux com a extensão .PEM (é o que estou entendendo.)
Parece que usa o cURL para fazer o envio ou podemos usar a classe TIP.
Estou sem tempo para isso, passei algumas horas lendo sobre o assunto e é o que estou entendendo.
O pessoal da área jurídica usa muito isso mas é por cartão ou token no Linux.

Saudações,
Itamar M. Lins Jr.

Portar para Linux a SefazClass

Enviado: 29 Jun 2021 11:56
por JoséQuintas
Digamos que seja algo como:

Código: Selecionar todos

cBloco := Substr( cXml, ???, ??? )
cBloco := Converte( cBloco )
cHash := CalculaHash( cBloco )
cAssinatura := AssinaXml( cHash, ???, ??? )
Então...

Que parte exatamente assina?
Que tipo de conversão é aplicada? pode ter variações
Como calcula o hash? provavelmente é estilo CRC32
Como assina o hash? pode ter variações

No Windows faço uso de MSXML5 e CAPICOM PRA ASSINATURA.
CAPICOM por si só já assina, mas... o MSXML5 tem os "segredos" adicionais.

Desvendar esse pequeno mistério, poderia num primeiro momento eliminar a dependência de MSXML5.
E num segundo momento, eliminar a dependência de CAPICOM.

Até lá.... talvez inventem de assinar usando TPM do Windows 11....
E aí, de nada adianta resolver o mistério atual...

Assinar.... vamos assinar somente um hash.
Desvendar como se assina um hash é apenas uma parte do problema.
A outra parte é: como se chega a esse hash?

Portar para Linux a SefazClass

Enviado: 29 Jun 2021 12:16
por JoséQuintas
assinaA.png
assinaB.png
Por exemplo:

CANONICALIZAÇÃO DO XML

É justamente o padrão de formatação, pra que uma rotina de assinatura considere exatamente o mesmo conteúdo.
Se uma assinatura "formatar" diferente, vai dar outro resultado
Um mesmo XML pode ter assinatura diferente, se não for formatado direito pela rotina de assinatura.
Ou... vai assinar usando o código ASC, binário, ou o código UTF-8?

Se assinarmos certo, mas usando string errada, a assinatura não vai bater.
Se calcularmos o hash certo, mas usando string errada, a assinatura também não vai bater.
Os detalhes fazem muita diferença.

Talvez até o Harbour tenha funções prontas pra fazer as coisas.
Talvez os masters do Harbour saibam nos informar detalhes sobre o que tudo isso significa.

Portar para Linux a SefazClass

Enviado: 29 Jun 2021 19:10
por JoséQuintas
Itamar M. Lins Jr. escreveu:Alguém que usa a SefazClass no Linux ?
Estou lendo algumas coisas e a principio será apenas entender o processo de assinar, enviar e receber o XML.
O resto acredito que não precisa mexer.
Basicamente seria trocar a comunicação pela LIBCURL, e a assinatura pela OPENSSL.
No fonte tem um exemplo anotado da LIBCURL, que também pode ser visto na HBNFE.

Sobre a assinatura... não sei dizer.
Conforme já mencionei por aqui, foi a HBNFE que me mostrou como assinar XMLs.