Erro na assinatura ISSWEB padrão ABRASF

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.issweb.fiorilli.com.br/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"><soapenv:Header/><soapenv:Body><ws:gerarxd><GerarxdEnvio xmlns="http://www.abrasf.org.br/xd.xsd"><Rps xmlns="http://www.abrasf.org.br/xd.xsd"><InfDeclaracaoPrestacaoServico Id="pfxdefc702d-e819-803c-d679-8d4a9e161618"><Rps><IdentificacaoRps><Numero>1</Numero><Serie>"60"</Serie><Tipo>1</Tipo></IdentificacaoRps><DataEmissao>2022-09-22</DataEmissao><Status>1</Status></Rps><Competencia>2022-09-22</Competencia><Servico><Valores><ValorServicos>10.00</ValorServicos><Aliquota>3.0000</Aliquota></Valores><IssRetido>2</IssRetido><ResponsavelRetencao>1</ResponsavelRetencao><ItemListaServico>01.06</ItemListaServico><Discriminacao>descricao do servico</Discriminacao><CodigoMunicipio>5220454</CodigoMunicipio><ExigibilidadeISS>1</ExigibilidadeISS><MunicipioIncidencia>5220454</MunicipioIncidencia></Servico><Prestador><CpfCnpj><Cnpj>xxxxxxx</Cnpj></CpfCnpj><InscricaoMunicipal>30010174</InscricaoMunicipal></Prestador><Tomador><IdentificacaoTomador><CpfCnpj><Cpf>07390796383</Cpf></CpfCnpj></IdentificacaoTomador><RazaoSocial>wall</RazaoSocial><Endereco><Endereco>Rua araibu</Endereco><Numero>431</Numero><Complemento>casa</Complemento><Bairro>Centro</Bairro><CodigoMunicipio>2700102</CodigoMunicipio><Uf>AC</Uf><Cep>62900000</Cep></Endereco><Contato><Email>[email protected]</Email></Contato></Tomador><RegimeEspecialTributacao>6</RegimeEspecialTributacao><OptanteSimplesNacional>1</OptanteSimplesNacional><IncentivoFiscal>2</IncentivoFiscal></InfDeclaracaoPrestacaoServico><xd:Signature xmlns:xd="http://www.w3.org/2000/09/xmldsig#"><xd:SignedInfo><xd:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><xd:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><xd:Reference URI="#pfxdefc702d-e819-803c-d679-8d4a9e161618"><xd:Transforms><xd:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><xd:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></xd:Transforms><xd:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><xd:DigestValue>UCVbegjfVGEABGpckPSuJ7VajocvreOLm1TnRz9H3LY=</xd:DigestValue></xd:Reference></xd:SignedInfo><xd:SignatureValue>HjoQdG9eEWwUPPo66GPQqzJtzZNkwitDkmwCtiLl+tOdAjlapIQyfFCxjFBRypn1C9TahFY3ieXvSGwpiSL2AqZUQmKbHMFAoGwQgSjyM9DdbPbqmeaiPy8vrurA2Wg0a2Y0Bf8Wn4uObuZ53ZElR0qtY/Ll3+Fu5TFEdpAfsowfw2aP86DFeWkykp5cEb2Ge9lbt0qcmaUF2DXFa7Nv70sz8KsGVPLdDd3+y8gL5NeeVh2DU6mJtrze+3RgtK6XxB6XFN6I1Gwvtjg0LlMftQxWc5ChdoBwpKlOegEHg7fsZ+90CKob7sz7cWFrElXiZ4ayvCpkPr9tlVsRFtnqxw==</xd:SignatureValue><xd:KeyInfo><xd:X509Data><xd:X509Certificate>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</xd:X509Certificate></xd:X509Data></xd:KeyInfo></xd:Signature></Rps></GerarxdEnvio><username>x</usexxxxxxxxxrname><password>xxxxxxx</password></ws:gerarxd></soapenv:Body></soapenv:Envelope>

Esse é o xml gerado por esse código:

   $xml = $xml = strlen($inputs->cpf_cnpj)===11?'<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.issweb.fiorilli.com.br/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"><soapenv:Header></soapenv:Header><soapenv:Body><ws:gerarNfse><GerarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Rps xmlns="http://www.abrasf.org.br/nfse.xsd"><InfDeclaracaoPrestacaoServico ><Rps><IdentificacaoRps><Numero>1</Numero><Serie>'.'"'.rand(1,99).'"'.'</Serie><Tipo>1</Tipo></IdentificacaoRps><DataEmissao>'.date('Y-m-d').'</DataEmissao><Status>1</Status></Rps><Competencia>'.date('Y-m-d').'</Competencia><Servico><Valores><ValorServicos>'.$cobrancaBD->valor_liquido.'</ValorServicos><Aliquota>3.0000</Aliquota></Valores><IssRetido>2</IssRetido><ResponsavelRetencao>1</ResponsavelRetencao><ItemListaServico>01.06</ItemListaServico><Discriminacao>descricao do servico</Discriminacao><CodigoMunicipio>5220454</CodigoMunicipio><ExigibilidadeISS>1</ExigibilidadeISS><MunicipioIncidencia>5220454</MunicipioIncidencia></Servico><Prestador><CpfCnpj><Cnpj>xxxxxxx</Cnpj></CpfCnpj><InscricaoMunicipal>30010174</InscricaoMunicipal></Prestador><Tomador><IdentificacaoTomador><CpfCnpj><Cpf>'.$inputs->cpf_cnpj.'</Cpf></CpfCnpj></IdentificacaoTomador><RazaoSocial>'.$inputs->nome.'</RazaoSocial><Endereco><Endereco>'.$inputs->rua.'</Endereco><Numero>'.$inputs->numero.'</Numero><Complemento>'.$inputs->complemento.'</Complemento><Bairro>'.$inputs->bairro.'</Bairro><CodigoMunicipio>'.$inputs->municipio.'</CodigoMunicipio><Uf>'.$inputs->estado.'</Uf><Cep>'.str_replace("-","",$inputs->cep).'</Cep></Endereco><Contato><Email>'.$inputs->email.'</Email></Contato></Tomador><RegimeEspecialTributacao>6</RegimeEspecialTributacao><OptanteSimplesNacional>1</OptanteSimplesNacional><IncentivoFiscal>2</IncentivoFiscal></InfDeclaracaoPrestacaoServico></Rps></GerarNfseEnvio><username>xxxxxxx</username><password>xxxxxxxx</password></ws:gerarNfse></soapenv:Body></soapenv:Envelope>':
		'<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.issweb.fiorilli.com.br/" xmlns:xd="http://www.w3.org/2000/09/xmldsig#"><soapenv:Header></soapenv:Header><soapenv:Body><ws:gerarNfse><GerarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Rps xmlns="http://www.abrasf.org.br/nfse.xsd"><InfDeclaracaoPrestacaoServico Id='.'"'.$id_lote.'"'.'><Rps><IdentificacaoRps><Numero>1</Numero><Serie>'.'"'.rand(1,99).'"'.'</Serie><Tipo>2</Tipo></IdentificacaoRps><DataEmissao>'.date('Y-m-d').'</DataEmissao><Status>1</Status></Rps><Competencia>'.date('Y-m-d').'</Competencia><Servico><Valores><ValorServicos>'.$cobrancaBD->valor_liquido.'</ValorServicos><Aliquota>2.0000</Aliquota></Valores><IssRetido>2</IssRetido><ResponsavelRetencao>1</ResponsavelRetencao><ItemListaServico>01.05</ItemListaServico><Discriminacao>descricao do servico</Discriminacao><CodigoMunicipio>3504800</CodigoMunicipio><ExigibilidadeISS>1</ExigibilidadeISS><MunicipioIncidencia>3504800</MunicipioIncidencia></Servico><Prestador><CpfCnpj><Cnpj>01001001000113</Cnpj></CpfCnpj><InscricaoMunicipal>15000</InscricaoMunicipal></Prestador><Tomador><IdentificacaoTomador><CpfCnpj><Cnpj>'.$inputs->cpf_cnpj.'</Cnpj></CpfCnpj></IdentificacaoTomador><RazaoSocial>'.$inputs->nome.'</RazaoSocial><Endereco><Endereco>'.$inputs->rua.'</Endereco><Numero>'.$inputs->numero.'</Numero><Complemento>'.$inputs->complemento.'</Complemento><Bairro>'.$inputs->bairro.'</Bairro><CodigoMunicipio>'.$inputs->municipio.'</CodigoMunicipio><Uf>'.$inputs->estado.'</Uf><Cep>'.str_replace("-","",$inputs->cep).'</Cep></Endereco><Contato><Email>'.$inputs->email.'</Email></Contato></Tomador><OptanteSimplesNacional>2</OptanteSimplesNacional><IncentivoFiscal>2</IncentivoFiscal></InfDeclaracaoPrestacaoServico></Rps></GerarNfseEnvio><username>xxxxx</username><password>xxxxxxx</password></ws:gerarNfse></soapenv:Body></soapenv:Envelope>';
$file_name = uniqid().'_xml_gerar.xml';$file_name = uniqid().'_xml_gerar.xml';


		$priKEY = __DIR__.'/certificado.pem';
		$keypass = "12345";
		$pubKEY =  __DIR__.'/certificado.pem';

		// Habilita a manipulação de erros da libxml
		libxml_use_internal_errors(true);
		//limpar erros anteriores que possam estar em memória
		libxml_clear_errors();
		// carrega o documento no DOM
		$xmldoc = new DOMDocument('1.0', 'UTF-8');
		$xmldoc->preservWhiteSpace = true; //elimina espaços em branco
		$xmldoc->formatOutput = false;
		// muito importante deixar ativadas as opções para limpar os espacos em branco
		// e as tags vazias
		if (!$xmldoc->loadXML($xml, LIBXML_NOBLANKS | LIBXML_NOXMLDECL | LIBXML_BIGLINES)) {
			$msg = "Erro ao carregar XML, provavel erro no proprio xml!!";
			$errors = libxml_get_errors();
			if (!empty($errors)) {
				$i = 1;
				foreach ($errors as $error) {
					$msg .= "\n  [$i]-" . trim($error->message);
				}
				libxml_clear_errors();
			}
			throw new Exception($msg);
		}

		//extrair a tag com os dados a serem assinados
		$xpath = new DOMXPath($xmldoc);
		$xpath->registerNamespace('nfse', "http://www.abrasf.org.br/nfse.xsd");
		$node = $xpath->query("//nfse:InfDeclaracaoPrestacaoServico")->item(0);
		if (!isset($node)) {
			$msg = "A tag <$tagid> não existe no XML!!";
			throw new Exception($msg);
		}

		// Cria novo Security object
		$objDSig = new XMLSecurityDSig('nfse');
		// Usa a c14n exclusive canonicalization
		$objDSig->setCanonicalMethod(XMLSecurityDSig::C14N);
		// Assina usando SHA-1
		$objDSig->addReference(
			$node,
			XMLSecurityDSig::SHA256,
			[
				"http://www.w3.org/2000/09/xmldsig#enveloped-signature",
				"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
			],
			array('id_name' => 'Id', "overwrite"=>false)
		);

		// Cria nova (private) Security key
		$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, array('type'=>'private'));
		$objKey->passphrase = "123456";
		$objKey->loadKey(__DIR__.'/certificado.pem', TRUE);

		// Assina o XML
		$objDSig->sign($objKey);
		// Adiciona a public key para a signature
		$objDSig->add509Cert(file_get_contents(__DIR__ .'/certificado.pem'));
		// Acrescenta a signature para o XML
		$objDSig->appendSignature($node->parentNode);
		$objDSig = null;

		//grava na string o objeto DOM
		$xml = $xmldoc->saveXML();


Pode me ajudar por favor
1 Like

Olá Wallison,

Pelo visto o erro está na assinatura.

Use esse código:

    function assinaXML($docxml, $tagid){
        $URLdsig='http://www.w3.org/2000/09/xmldsig#';
        $URLCanonMeth='http://www.w3.org/TR/2001/REC-xml-c14n-20010315';
        $URLSigMeth='http://www.w3.org/2000/09/xmldsig#rsa-sha1';
        $URLTransfMeth_1='http://www.w3.org/2000/09/xmldsig#enveloped-signature';
        $URLTransfMeth_2='http://www.w3.org/TR/2001/REC-xml-c14n-20010315';
        $URLDigestMeth='http://www.w3.org/2000/09/xmldsig#sha1';
        
        
        try {
            //Certificado
            $crt_dir = getcwd().DIRECTORY_SEPARATOR.'cert'.DIRECTORY_SEPARATOR;
            $priKEY = "{$crt_dir}pkey.pem";
            $keypass = file_get_contents("{$crt_dir}pass.txt");
            $pubKEY = "{$crt_dir}cert.pem";

            $xml = $docxml;
            // obter o chave privada para a ssinatura
            $prikeyid = openssl_pkey_get_private(file_get_contents($priKEY), $keypass);
            // limpeza do xml com a retirada dos CR, LF e TAB
            $order = array("\r\n", "\n", "\r", "\t");
            $replace = '';
            $xml = str_replace($order, $replace, $xml);
            // Habilita a manipulação de erros da libxml
            libxml_use_internal_errors(true);
            //limpar erros anteriores que possam estar em memória
            libxml_clear_errors();
            // carrega o documento no DOM
            $xmldoc = new DOMDocument('1.0', 'utf-8');
            $xmldoc->preservWhiteSpace = true; //elimina espaços em branco
            $xmldoc->formatOutput = false;
            // muito importante deixar ativadas as opções para limpar os espacos em branco
            // e as tags vazias
            if ($xmldoc->loadXML($xml, LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG)) {
                $root = $xmldoc->documentElement;
            } else {
                $msg = "Erro ao carregar XML, provavel erro na passagem do parametro docxml ou no proprio xml!!";
                $errors = libxml_get_errors();
                if (!empty($errors)) {
                    $i = 1;
                    foreach ($errors as $error) {
                        $msg .= "\n  [$i]-" . trim($error->message);
                    }
                    libxml_clear_errors();
                }
                throw new Exception($msg);
            }
            //extrair a tag com os dados a serem assinados
            $node = $xmldoc->getElementsByTagName($tagid)->item(0);
            if (!isset($node)) {
                $msg = "A tag < $tagid > não existe no XML!!";
                throw new Exception($msg);
            }
            $id = trim($node->getAttribute("Id"));
            $idnome = preg_replace('/[^0-9]/', '', $id);
            //extrai os dados da tag para uma string
            $dados = $node->C14N(false, false, NULL, NULL);
            //calcular o hash dos dados
            $hashValue = hash('sha1', $dados, true);
            //converte o valor para base64 para serem colocados no xml
            $digValue = base64_encode($hashValue);
            //monta a tag da assinatura digital
            $Signature = $xmldoc->createElementNS($URLdsig, 'Signature');
            //adiciona a assinatura
            $node->parentNode->appendChild($Signature);
            
            $SignedInfo = $xmldoc->createElement('SignedInfo');
            $Signature->appendChild($SignedInfo);
            //Cannocalization
            $newNode = $xmldoc->createElement('CanonicalizationMethod');
            $SignedInfo->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $URLCanonMeth);
            //SignatureMethod
            $newNode = $xmldoc->createElement('SignatureMethod');
            $SignedInfo->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $URLSigMeth);
            //Reference
            $Reference = $xmldoc->createElement('Reference');
            $SignedInfo->appendChild($Reference);
            $Reference->setAttribute('URI', '#' . $id);
            //Transforms
            $Transforms = $xmldoc->createElement('Transforms');
            $Reference->appendChild($Transforms);
            //Transform
            $newNode = $xmldoc->createElement('Transform');
            $Transforms->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $URLTransfMeth_1);
            //Transform
            $newNode = $xmldoc->createElement('Transform');
            $Transforms->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $URLTransfMeth_2);
            //DigestMethod
            $newNode = $xmldoc->createElement('DigestMethod');
            $Reference->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $URLDigestMeth);
            //DigestValue
            $newNode = $xmldoc->createElement('DigestValue', $digValue);
            $Reference->appendChild($newNode);
            // extrai os dados a serem assinados para uma string
            $dados = $SignedInfo->C14N(false, false, NULL, NULL);
            //inicializa a variavel que irá receber a assinatura
            $signature = '';
            //executa a assinatura digital usando o resource da chave privada
            $resp = openssl_sign($dados, $signature, $prikeyid);
            //codifica assinatura para o padrao base64
            $signatureValue = base64_encode($signature);
            //SignatureValue
            $newNode = $xmldoc->createElement('SignatureValue', $signatureValue);
            $Signature->appendChild($newNode);
            //KeyInfo
            $KeyInfo = $xmldoc->createElement('KeyInfo');
            $Signature->appendChild($KeyInfo);
            //X509Data
            $X509Data = $xmldoc->createElement('X509Data');
            $KeyInfo->appendChild($X509Data);
            //carrega o certificado sem as tags de inicio e fim
            $cert = str_replace("\r", '', file_get_contents($pubKEY));
            $cert = str_replace("\n", '', $cert);
            $cert = str_replace('-----BEGIN CERTIFICATE-----', '', $cert);
            $cert = wordwrap(trim(str_replace('-----END CERTIFICATE-----', '', $cert)), 64, "\n", true);
            //X509Certificate
            $newNode = $xmldoc->createElement('X509Certificate', $cert);
            $X509Data->appendChild($newNode);
            //grava na string o objeto DOM
            $xml = $xmldoc->saveXML($xmldoc->documentElement);
            // libera a memoria
            openssl_free_key($prikeyid);
        } catch (Exception $e) {
            throw $e;
        }
        //retorna o documento assinado
        return $xml;
    } //fim signXML

Se for implementação da Fiorilli.
Aguarde que estou gerando um GIST para ela.

GIST para a Fiorilli padrão Abrasf 2.01:

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