Página 1 de 3

eSocial - Assinatura Inválida - URGENTE

Enviado: 02 Jul 2018 17:05
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)

***************************

eSocial - Assinatura Inválida - URGENTE

Enviado: 02 Jul 2018 21:48
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.

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 08:38
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#.

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 09:51
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) ??

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:15
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

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:28
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.

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:32
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

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:41
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)

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:44
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

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 10:54
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)

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 11:17
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.

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 11:32
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 ??

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 12:52
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

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 13:37
por fladimir
Verifiquei aki, pra quem usar o eSocial pelo ACBrMonitor, o mesmo já cria o XML e Assina

Imagem

eSocial - Assinatura Inválida - URGENTE

Enviado: 03 Jul 2018 13:51
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....