eSocial - Assinatura Inválida - URGENTE

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Henrique Victory
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 02 Jul 2018 09:52
Localização: Goiania-Go

eSocial - Assinatura Inválida - URGENTE

Mensagem por Henrique Victory »

Boa tarde a todos do Grupo.
Estou implementando o eSocial no meu sistema e meu prazo já está esgotado.
Preciso enviar o evento S1000 (Inicial). Já estruturei todo o xml mas quando envio, recebo a mensagem :
Codigo = 142
Descricao = Assinatura do evento inválida. Ações Sugeridas: Verificar se houve alteração do evento após a assinatura. Verificar a validade da assinatura.
Localizacao = /eSocial/Signature
Com muitas pesquisas para assinar com SHA256 (diferente da NFe que é SHA1), cheguei ao código abaixo.
Pergunto:
1) Tem algo errado no código ?
2) A base da assinatura (pedaço do xml) está correta ? (O manual diz que a assinatura tem que ser sobre o Evento)
3) Tem como eu checar se a assinatura está correta antes de enviar ? (Pela string da assinatura achar a base que foi assinada ?)

Alguém já passou por esse erro ?
Pode dar uma dica ?
Desde já, agradeço, lembrando: é URGENTE.
------------------------------------------------------------------código

Código: Selecionar todos

xml :=
<?xml version="1.0"?>
<eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v02_04_02">
	<evtInfoEmpregador Id="ID1290588510000002018070122564800001">
		<ideEvento>
			<tpAmb>2</tpAmb>
			<procEmi>0</procEmi>
			<verProc>1.0</verProc>
		</ideEvento>
		<ideEmpregador>
			<tpInsc>1</tpInsc>
			<nrInsc>19052251</nrInsc>
		</ideEmpregador>
		<infoEmpregador>
			<inclusao>
				<idePeriodo>
					<iniValid>2018-05</iniValid>
				</idePeriodo>
				<infoCadastro>
					<nmRazao>LOJA DO COMERCIO LTDA</nmRazao>
					<classTrib>01</classTrib>
					<natJurid>2305</natJurid>
					<indCoop>0</indCoop>
					<indConstr>0</indConstr>
					<indDesFolha>0</indDesFolha>
					<indOptRegEletron>0</indOptRegEletron>
					<indEntEd>N</indEntEd>
					<indEtt>N</indEtt>
					<contato>
						<nmCtt>JOAO DA SILVA</nmCtt>
						<cpfCtt>02223323232</cpfCtt>
						<foneFixo>6239412233</foneFixo>
						<foneCel>62999999999</foneCel>
						<email>joaoorganizacao@yahoo.com.br</email>
					</contato>
					<softwareHouse>
						<cnpjSoftHouse>22332323232357</cnpjSoftHouse>
						<nmRazao>Sistemas Informatica Ltda</nmRazao>
						<nmCont>Joao Mensdes Mendonca</nmCont>
						<telefone>6232559090</telefone>
						<email>suporte@sistemasgestaox.com.br</email>
					</softwareHouse>
					<infoComplementares>
						<situacaoPJ>
							<indSitPJ>0</indSitPJ>
						</situacaoPJ>
					</infoComplementares>
				</infoCadastro>
			</inclusao>
		</infoEmpregador>
	</evtInfoEmpregador>
</eSocial>

sig :=
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
   <SignedInfo>
         <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
		 <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
         <Reference URI="">
         <Transforms>
		 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
		 <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
		 </Transforms>
		 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
         <DigestValue></DigestValue>'
		 </Reference>
    </SignedInfo>
    <SignatureValue></SignatureValue>
         <KeyInfo>  ;
             <X509Data>
                <X509Certificate></X509Certificate>
             </X509Data>
         </KeyInfo>
</Signature>'

xmlassinado := Minha_Assina( Xml , Sig )

Código: Selecionar todos

*************************************************************
Function Minha_Assina(Veio_Xml , Veio_Sig )
	LOCAL DigestValue,aAss,SignatureValue, X509

	cXML  := PegaTag( Veio_XML  , "evtInfoEmpregador")
	// Alernativa 1
    	DigestValue    := _HashCapicom( cXml )
	// Alernativa 2 (Nativa do Harbour)
	DigestValue    :=  hb_sha256( cXml )
    	aAss           := _SignatureCapicom( DigestValue )

	If aAss[1]==NIL
	   Return NIL
	Endif
    	SignatureValue := aAss[1]  
    	X509           := aAss[2]

   	cXmlSig := _InsereDadosTag( cXmlSig, "DigestValue"     , DigestValue  )
   	cXmlSig := _InsereDadosTag( cXmlSig, "SignatureValue"  , SignatureValue  )
   	cXmlSig := _InsereDadosTag( cXmlSig, "X509Certificate" , x509  )

   	cTexto := SUBS( ccXML ,1,AT('</eSocial>', ccXML )-1)
   	cTexto += cXMLSig
   	cTexto := cTexto + '</eSocial>'

Return( cTexto )

FUNCTION _SignatureCapicom( DigestValue, Cert, Encode )   
LOCAL SignedData, CertBase64, Signer, sRet, TimeAttrib  
  
	Signer := win_oleCreateObject("CAPICOM.Signer.2")  //versao 2

    	IF Cert = NIL  
       		Cert :=  _SelecionaCertificadoCapicom()
       		IF Cert = NIL  
          		RETURN{ NIL,NIL}
       		ENDIF  
      		Signer:Certificate := cert  
	ELSE  
       		Signer:Certificate := cert:DefaultInterface  
    	ENDIF  
  
    	IF !(Signer:Certificate:HasPrivateKey ;  
       .and. DToS(Signer:Certificate:ValidFromDate) <= DToS(Date()) ;  
       .and. DToS(Signer:Certificate:ValidToDate) >= DToS(Date()) )  
       		RETURN NIL  
    	ENDIF  
  
    	Signer:Options := CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT  
  
    	CertBase64 := Signer:Certificate:Export(CAPICOM_ENCODE_BASE64)  
    	CertBase64 := Trim(StrTran(certBase64, Chr(13) + Chr(10), ''))  
    	TimeAttrib :=  win_oleCreateObject("CAPICOM.Attribute")

    	TimeAttrib:Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME  
    	TimeAttrib:Value = DateTime()  
  
    	Signer:AuthenticatedAttributes:Add(TimeAttrib)  
    	SignedData := win_oleCreateObject("CAPICOM.SignedData.1")

    	SignedData:Content := DigestValue  
  
    	sRet := SignedData:Sign(Signer, .F., Encode)
  
RETURN{ sRet, CertBase64 }  



FUNCTION _HashCapicom( sTexto, AlgoritimoHash  )  
LOCAL objHash  
  
    IF sTexto = NIL  
       sTexto := DToS(Date()) + Time()  
    ENDIF  
  
    IF AlgoritimoHash = NIL  
       AlgoritimoHash := CAPICOM_HASH_ALGORITHM_SHA_256  
    ENDIF  

    objHash := win_oleCreateObject("CAPICOM.HashedData.1")
    objHash:Algorithm := AlgoritimoHash
    objHash:Hash( sTexto )

RETURN objHash:Value  

FUNCTION _SelecionaCertificadoCapicom()  
    LOCAL MyStore, Certificates , oError  
  
    MyStore := CreateObject("CAPICOM.Store")
    MyStore := win_oleCreateObject("CAPICOM.Store")

    MyStore:Open( CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY )  
  
    TRY  
       Certificates := MyStore:Certificates:Select("Selecione um certificado digital","Algoritimo de Assinatura SHA256RSA")  
    CATCH oError  
  
       MsgStop('Não foi possível carregar objeto XMLHTTPServer', 'Erro')  
       RETURN NIL  
    END  
  
    IF MyStore:certificates:Count = 0  
       RETURN NIL  
    ENDIF  

RETURN( certificates:Item(1) )  

FUNCTION _InsereDadosTag( cXml, cTag, cDados  )  
    LOCAL nPosIni, nPosFim, cPart1, cPart2  
    LOCAL cRetorno  
  
    cRetorno := cXml  
  
    nPosIni    := At( "<"+cTag,cXml )  
    IF nPosIni == 0  
        RETURN( cRetorno )  
    ENDIF  
    nPosIni     := nPosIni + Len( cTag ) + 1  
    cPart1      := SubStr( cXml,1,nPosIni )  
  
    nPosFim     := At( "</"+cTag+">",cXml )  
    cPart2      := SubStr( cXml,nPosFim, Len( cXml ) )  
    cRetorno    := cPart1 + cDados + cPart2  
  
RETURN( cRetorno )

Function pegaTag(cXML, cTag)
LOCAL cRetorno, cTagInicio,cTagFim
   cTagInicio := "<"+cTag //+">"
   cTagFim := "</"+cTag+">"
   cRetorno := SUBS( cXML, AT(cTagInicio,cXML)+LEN(cTagInicio)+1, AT(cTagFim,cXML)-(AT(cTagInicio,cXML)+LEN(cTagInicio)+1) )
RETURN(cRetorno)

***************************
Editado pela última vez por Toledo em 02 Jul 2018 17:17, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

eSocial - Assinatura Inválida - URGENTE

Mensagem por fladimir »

Não, passei, mas o ACBr vi q tem o e-Social, como uso o ACBr pra vários documentos eletronicos quem sabe a funcionalidade q tem do e-social no ACBr te ajude em algo. Da uma pesquisada.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

eSocial - Assinatura Inválida - URGENTE

Mensagem por jairfab »

O capicom não serve para assinatura do esocial, antes servia, depois de algum tempo passou a não servir, fiquei tres meses alterando a forma de assinatura ate chegar a conclusão de que a assinatura do capicom não tem nenhum jeito de funcionar.


Assinatura mais fácil seria com java ou c#.
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Henrique Victory
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 02 Jul 2018 09:52
Localização: Goiania-Go

eSocial - Assinatura Inválida - URGENTE

Mensagem por Henrique Victory »

Ok Jairfab
Já vi algumas rotinas em Java e C#.
Mas como não domino o Java e nem o C#, pergunto :
Como converter essas rotinas pra colocar na minha aplicação (Minigui + Harbour) ??
Avatar do usuário
jairfab
Usuário Nível 3
Usuário Nível 3
Mensagens: 252
Registrado em: 21 Mai 2007 09:43
Localização: São Paulo, Região Leste - Suzano

eSocial - Assinatura Inválida - URGENTE

Mensagem por jairfab »

Não sei converter, sem que tem opção pra fazer ele ser acessado por quaisquer linguagem mas eu utilizo como serviço, depois gravo o xml em uma pasta e o serviço faz a validação, assinatura, envio e retorno
Delpji 7, harbour 3.2, xharbour 1.2.3, Bcc7, Minigw, Minigui 19.11, hwgui 2.20, FiveWin 19.05 Gtwvw, Gtwvg, C# VS 2017
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

jairfab escreveu:O capicom não serve para assinatura do esocial
Não sei não....
A SefazClass tem rotina de assinatura, basta acrescentar na lista o começo/término das tags do documento.
Acho que não adianta usar só Capicom, infelizmente precisa de MSXML5, a única versão da Microsoft que trabalha com assinatura, e que fez (não sei se ainda faz) parte do Office - acho que ela faz a parte de ajustar codepage.

Repare também no seguinte:
A assinatura usa uma identificação do bloco a ser assinado, que vai pra assinatura.
Verifique se está no mesmo padrão, acho que é "ID" ou "#ID", só olhar no fonte e identificar aonde pega essa identificação.

Não custa tentar...
Ainda mais que assinatura vai ser cada vez mais necessária.

Em todo caso, vou alterar a rotina com base nesse XML... acrescentar o início/final de bloco na lista do array.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Pronto.
Fiz uma alteração complicada na Sefazclass pra isso....

acrescentei esta linha... rs

Código: Selecionar todos

      { "<evtInfoEmpregador",     "</eSocial>" }, ;
Agora é só testar.

Nota. É sério, basta conferir aqui.

https://github.com/JoseQuintas/sefazcla ... 8e5c24c6d3

esocial.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Aproveitando....
No programa de teste tem um XML mínimo pra teste de assinatura de NFE, só ajustar pro ESocial.
Opcionalmente, só usar o ze_spedassinatura.prg e arquivos relacionados, sem passar pela sefazclass.

Código: Selecionar todos

         oSefaz:cXmlDocumento := [<NFe><infNFe Id="Nfe0001"></infNFe></NFe>]
         oSefaz:AssinaXml()
         ? oSefaz:cXmlRetorno
         ? oSefaz:cXmlDocumento
         Inkey(0)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Tem a criação, que no caso do ESocial vai precisar do certificado - O NOME DO CERTIFICADO não o serial.
O resto não precisa pra assinar.

Código: Selecionar todos

      oSefaz              := SefazClass():New()
      oSefaz:cUF          := cUF
      oSefaz:cVersao      := cVersao
      oSefaz:cCertificado := cCertificado
      oSefaz:cAmbiente    := cAmbiente
      oSefaz:cNFCe        := cNFCe
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Uma alteração rápida, pra qualquer documento, assim nem vai ter trabalho pra testar. (se tiver capicom e msxml5 instalados)
esocial1.png

O programa faz parte da Sefazclass (os fontes).
Aqui compilado com Harbour 3.4

test.zip
(750.03 KiB) Baixado 122 vezes

Código: Selecionar todos

      CASE nOpc == nOpcTemp++
         oSefaz:cXmlDocumento := MemoRead( win_GetOpenFileName(, "Arquivo a assinar", "importa\", "XML", "*.XML", 1 ) )
         oSefaz:AssinaXml()
         ? oSefaz:cXmlRetorno
         ? oSefaz:cXmlDocumento
         hb_MemoWrit( "testassina.xml", oSefaz:cXmlDocumento )
         Inkey(0)
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Henrique Victory
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 02 Jul 2018 09:52
Localização: Goiania-Go

eSocial - Assinatura Inválida - URGENTE

Mensagem por Henrique Victory »

Obrigado José Quintas pelo interesse e orientação.
Vou providenciar os testes conforme indicado imediatamente e posto aqui o resultado.
Abraço.
Henrique Victory
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 02 Jul 2018 09:52
Localização: Goiania-Go

eSocial - Assinatura Inválida - URGENTE

Mensagem por Henrique Victory »

José Quintas,
Usei o Test.exe e o xml foi assinado.
Anexei ao Envelope (cuja rotina esta OK) e enviei ao eSocial.
O Lote foi recebido com sucesso, porem, a consulta do processamento retornou :
Assinatura do evento inválida. Elemento 'SignatureMethod' inválido.
É porque foi assinado com método SHA1 e o eSocial exige o SHA256.
Alguns colegas dizem que pelo SHA256 não dá certo.
Alguma alternativa ??
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Nesse caso vai ser criar uma variação pra esocial.
O teste se o suporte é automático seria alterar as informações no bloco signature.
Se não for automático....

Segundo este site, dá pra trocar manualmente, via programação:

https://stackoverflow.com/questions/106 ... ith-sha256
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

eSocial - Assinatura Inválida - URGENTE

Mensagem por fladimir »

Verifiquei aki, pra quem usar o eSocial pelo ACBrMonitor, o mesmo já cria o XML e Assina

Imagem
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

eSocial - Assinatura Inválida - URGENTE

Mensagem por JoséQuintas »

Achei uma página com informação interessante....

https://knowledge.digicert.com/generali ... O2274.html
sha256.png
"O Windows 7 aceita assinatura SHA256, mas precisa atualizações da Microsoft...."


Sei lá....
É TLS 1.2, é assinatura SHA256....
Parece que Windows 10 vai acabar sendo obrigatório....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder