Duvida com assinatura de XML com o GINFES Jundiai

Olá, estou tentando assinar o XML da GINFES de Jundiai, porém está dando Assinatura inválida, ja testei de tudo e nunca da certo, estou usando php com as bibliotecas RobRichards\XMLSecLibs\XMLSecurityDSig, RobRichards\XMLSecLibs\XMLSecurityKey;

Alguém poderia me dar algum help?

Segue o XML com a assinatura gerada

digite ou cole o código <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hom="http://homologacao.ginfes.com.br">
	<soapenv:Header/>
	<soapenv:Body>
		<hom:RecepcionarLoteRpsV3>
			<arg0>
				<ns2:cabecalho versao="3" xmlns:ns2="http://www.ginfes.com.br/cabecalho_v03.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
					<versaoDados>3</versaoDados>
				</ns2:cabecalho>
			</arg0>
			<arg1>
				<EnviarLoteRpsEnvio xmlns="http://www.ginfes.com.br/servico_enviar_lote_rps_envio_v03.xsd" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:tipos="http://www.ginfes.com.br/tipos_v03.xsd" xmlns:n2="http://www.altova.com.br/samplexml/other-namespace" xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance">
					<LoteRps>
						<tipos:NumeroLote>5301</tipos:NumeroLote>
						<tipos:Cnpj>5041</tipos:Cnpj>
						<tipos:InscricaoMunicipal>48</tipos:InscricaoMunicipal>
						<tipos:QuantidadeRps>1</tipos:QuantidadeRps>
						<tipos:ListaRps>
							<tipos:Rps>
								<tipos:InfRps>
									<tipos:IdentificacaoRps>
										<tipos:Numero>0012001</tipos:Numero>
										<tipos:Serie>2</tipos:Serie>
										<tipos:Tipo>1</tipos:Tipo>
									</tipos:IdentificacaoRps>
									<tipos:DataEmissao>2023-05-22T15:26:15</tipos:DataEmissao>
									<tipos:NaturezaOperacao>1</tipos:NaturezaOperacao>
									<tipos:OptanteSimplesNacional>2</tipos:OptanteSimplesNacional>
									<tipos:IncentivadorCultural>2</tipos:IncentivadorCultural>
									<tipos:Status>1</tipos:Status>
									<tipos:Servico>
										<tipos:Valores>
											<tipos:ValorServicos>2767.46</tipos:ValorServicos>
											<tipos:ValorDeducoes>0</tipos:ValorDeducoes>
											<tipos:ValorPis>0</tipos:ValorPis>
											<tipos:ValorCofins>0</tipos:ValorCofins>
											<tipos:ValorInss>0</tipos:ValorInss>
											<tipos:ValorIr>0</tipos:ValorIr>
											<tipos:ValorCsll>0</tipos:ValorCsll>
											<tipos:IssRetido>2</tipos:IssRetido>
											<tipos:ValorIss>5.55</tipos:ValorIss>
											<tipos:ValorIssRetido>0</tipos:ValorIssRetido>
											<tipos:OutrasRetencoes>0</tipos:OutrasRetencoes>
											<tipos:BaseCalculo>2767.46</tipos:BaseCalculo>
											<tipos:Aliquota>0.0200</tipos:Aliquota>
											<tipos:ValorLiquidoNfse>2767.46</tipos:ValorLiquidoNfse>
										</tipos:Valores>
										<tipos:ItemListaServico>4.22</tipos:ItemListaServico>
										<tipos:CodigoTributacaoMunicipio>4.22.00 / 11</tipos:CodigoTributacaoMunicipio>
										<tipos:Discriminacao>VALOR REFERENTE A ASSISTENCIA MEDICA - CONTRATO 09  - CONFORME LEI 12.741/12, VALOR APROXIMADO DOS TRIBUTOS (6.65%) R$ 33.25</tipos:Discriminacao>
										<tipos:CodigoMunicipio>3509601</tipos:CodigoMunicipio>
									</tipos:Servico>
									<tipos:Prestador>
										<tipos:Cnpj>49242</tipos:Cnpj>
										<tipos:InscricaoMunicipal>173</tipos:InscricaoMunicipal>
									</tipos:Prestador>
									<tipos:Tomador>
										<tipos:IdentificacaoTomador>
											<tipos:CpfCnpj>
												<tipos:Cnpj>017117</tipos:Cnpj>
											</tipos:CpfCnpj>
										</tipos:IdentificacaoTomador>
										<tipos:RazaoSocial>GDA</tipos:RazaoSocial>
										<tipos:Endereco>
											<tipos:Endereco>PRAGUES</tipos:Endereco>
											<tipos:Numero>2</tipos:Numero>
											<tipos:Complemento>3 ADAR</tipos:Complemento>
											<tipos:Bairro>CEO</tipos:Bairro>
											<tipos:CodigoMunicipio>356</tipos:CodigoMunicipio>
											<tipos:Uf>SP</tipos:Uf>
											<tipos:Cep>114</tipos:Cep>
										</tipos:Endereco>
										<tipos:Contato>
											<tipos:Telefone>19222</tipos:Telefone>
											<tipos:Email>so.br</tipos:Email>
										</tipos:Contato>
									</tipos:Tomador>
								</tipos:InfRps>
							</tipos:Rps>
						</tipos:ListaRps>
					</LoteRps>
					<dsig:Signature>
						<dsig:SignedInfo>
							<dsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
							<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
							<dsig:Reference URI="">
								<dsig:Transforms>
									<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
									<dsig:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
								</dsig:Transforms>
								<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
								<dsig:DigestValue>teifJXSaKeiBIyqNDwmw3efM=</dsig:DigestValue>
							</dsig:Reference>
						</dsig:SignedInfo>
						<dsig:SignatureValue>skop3lU7NNrPh7FlZFMOeB0/kOV2z5tnd7ghTDYQJ/Wuq/NgNiDb5qMSkIdM/KiDuWFE9pKopaIEJArRxj1WN+ILE9iZv0533KqlyQT/n9ywR6oUX7ODcrqJUKpPLIR/96+VD3asT3UgH4X05gDje4hBIPPzSg6pinQyb0ESvc1/PwjN+vfMSKdYzh/yma2S5dLMU9SdGaEfvU/2yAl8vkefanyp5xqlhpbn8gRcIiiTpbIwv5B9Ke8vHa+AiP7zbYhhuFri/VfOekWc38Q7nGY2c9VsHvewAzIfK6Q3qDGPhPL5YU9jQegdn+JxlCMTMB8eQP+/dgbz5A==</dsig:SignatureValue>
						<dsig:KeyInfo>
							<dsig:X509Data>
								<dsig:X509Certificate>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</dsig:X509Certificate>
							</dsig:X509Data>
						</dsig:KeyInfo>
					</dsig:Signature>
				</EnviarLoteRpsEnvio>
			</arg1>
		</hom:RecepcionarLoteRpsV3>
	</soapenv:Body>
</soapenv:Envelope>aqui

Estou tentando Fazer a nota de brasilia em PHP e sofrendo demais sem sucesso. metodo GerarNfse. Tbm sofrendo demais faz 3 dias. Nota de Serviço não é coisa de Deus

Pois é, estou há duas semanas sem sucesso tbm, a documentação dos caras fala, fala mas não explica nada

Você já testou na producao?
Muitas vezes o ambiente de teste é bugado e tem comportamento diferente.

Testei sim, deu mesmo erro de assinatura inválida.

acabei de conseguir montar um xml pro metodo GerarNFSe. Agora vai começar a brincadeira. montar com dados verdadeiros e Tentar assinar. Se eu consegui posto aqui pra vc saber o que fiz.

beleza…
Qual biblioteca você esta usando para assinar?

ainda estou nas previas. Não usei nada. A principio quero conseguir fazer com o próprio php, Eu procuro evitar ao máximo bibliotecas cheias classe pra fazer algo que 6 linhas de código fazem. Mas esse biblioteca que vc está usando parece boa. Te mantenho informado aqui. Se você conseguir algum sucesso compartilhe aqui tbm.

O problema dessa biblioteca é que o C14N fica corrompido.

Já comentei sobre isso aqui:

Eu vi esse post seu, tentei fazer mas não deu certo.
O problema é que esse XML contem namespace “tipo”, dificultando ainda mais o procedimento

É simples!

Olhe essa linha onde os NS são declarados:

<EnviarLoteRpsEnvio xmlns="http://www.ginfes.com.br/servico_enviar_lote_rps_envio_v03.xsd"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" 
xmlns:tipos="http://www.ginfes.com.br/tipos_v03.xsd"
xmlns:n2="http://www.altova.com.br/samplexml/other-namespace"
xmlns:xsi="http://wwww.w3.org/2001/XMLSchema-instance">
					<LoteRps>



Você pode registrar vários namespaces, para o XPATH funcionar:
$xpath->registerNamespace('dsig', "http://www.w3.org/2000/09/xmldsig#");
$xpath->registerNamespace('n2', "http://www.altova.com.br/samplexml/other-namespace");
$xpath->registerNamespace('tipos', "http://www.ginfes.com.br/tipos_v03.xsd");
$node = $xpath->query("//tipos:{$tagid}")->item(0);
$data = file_get_contents('certificado.pfx');
$certPassword = 'senha';
openssl_pkcs12_read($data, $certs, $certPassword);
$pkey_pem = $certs['pkey'];
$cert_pem = $certs['cert'];
file_put_contents('cert.pem', $cert_pem);
file_put_contents('chave.pem', $pkey_pem);

$doc = new DOMDocument();
/*Recupera xml sem assinatura*/
$doc->load('brasilia.xml');

$objDSig = new XMLSecurityDSig();
$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
$objDSig->addReference(
    $doc, 
    XMLSecurityDSig::SHA1, 
    ['http://www.w3.org/2000/09/xmldsig#enveloped-signature', 
		'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'],
	['force_uri' => true, 'uri' => 'rpsId23253']	
);

$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
$objKey->loadKey('chave.pem', TRUE);
$objDSig->sign($objKey);
$objDSig->add509Cert(file_get_contents('cert.pem'));
/*indica a tag que será gravada a assinatura*/
$objDSig->appendSignature($doc->getElementsByTagName('Rps')->item(0));
$doc->save('signed.xml');
$xml=file_get_contents('signed.xml');

O meu código esta assim

na $tagid estou colocando o LoteRps, porem não esta encontrando pelo fato dessa tag não ter o namespace “tipos”, mas se informo InfRps por exemplo ele acha, mas mesmo assim da assinatura inválida.

Não sei se estou fazendo a coisa certa

        $doc = new DOMDocument('1.0', 'UTF-8');
        $doc->loadXML($conteudo);
        
        /** CRIAÇÃO DA CLASSE XML SECURITY DSIG  **/
        $objDSig = new XMLSecurityDSig();
        
        $tagid = 'LoteRps';

        //extrair a tag com os dados a serem assinados
        $xpath = new DOMXPath($doc);
        $xpath->registerNamespace('dsig', "http://www.w3.org/2000/09/xmldsig#");
        $xpath->registerNamespace('n2', "http://www.altova.com.br/samplexml/other-namespace");
        $xpath->registerNamespace('tipos', "http://www.ginfes.com.br/tipos_v03.xsd");
        $node = $xpath->query("//tipos:{$tagid}")->item(0);

        if (!isset($node)) 
        {
            $msg = "A tag <$tagid> não existe no XML!!";
            throw new Exception($msg);
        }

        Util::log($node, 'RPS');
        
        /** DETERMINA O MÉTODO CANONICO C14 **/
        //$objDSig->setCanonicalMethod(XMLSecurityDSig::C14N);

        $objDSig->setCanonicalMethod(XMLSecurityDSig::C14N);

        
        // ASSINA UTILIZANDO SHA-1
        $objDSig->addReference(
            $node,
            XMLSecurityDSig::SHA1,
            array('http://www.w3.org/2000/09/xmldsig#enveloped-signature',
            'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'
           ),
            array("force_uri"=> true)
        );
        
        /** CRIA UMA NOVA CHAVE PRIVADA **/
        $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
                
        /** CARREGA A CHAVE PRIVADA **/
        $objKey->loadKey(__CHPRIVADA__, true);
        
       /**  ASSINA O ARQUIVO XML **/
        $objDSig->sign($objKey);        

        // /** FAZ ASSOCIAÇÃO DA CHAVE PUBLICA **/
        $objDSig->add509Cert(file_get_contents( __CHPUBLICA__ ));
        
        /** FAZ O APPEND DA ASSINATURA NO XML **/
        $objDSig->appendSignature($node->parentNode);
        
        /** RETORNA O RPS ASSINADO COMO STRING **/
        return $doc->saveXML($doc);

este código seria para que?

o que te passei. eu recupero o xml sem a assinatura e assino. Ja conseguir transmitir em ambiente de teste

Deu certo com esse seu método Fagner, valew mesmo!!!

Obrigado também Luiz pela atenção!

O problema na verdade estava com os certificados, ao fazer esses passos:

$data = file_get_contents(‘certificado.pfx’);
$certPassword = ‘senha’;
openssl_pkcs12_read($data, $certs, $certPassword);
$pkey_pem = $certs[‘pkey’];
$cert_pem = $certs[‘cert’];
file_put_contents(‘cert.pem’, $cert_pem);
file_put_contents(‘chave.pem’, $pkey_pem);

Deu certo!!

Que legal que funcionou. Fico contente.

Este tópico foi fechado automaticamente 30 dias depois da última resposta. Novas respostas não são mais permitidas.