Como eu disse eu uso apenas algumas funções da classe do NfePHP, como não trabalho com emissão de notas ao meu ver é desnecessário carregar a classe Tools.
Sim, o SSL está instalado, inclusive ele consegue gerar o Resource da chave pública. O erro está na comparação do que foi assinado e do retorno da assinatura.
O digest value gerado é igual o da nota.
Somente a comparação das chaves dá um retorno de erro. Sendo que o {{$ok}} retorna NULL.
/**
* verifySignatureXML
* Verifica correção da assinatura no xml
*
* @version 1.01
* @package NFePHP
* @author Bernardo Silva <bernardo at datamex dot com dot br>
* @param string $conteudoXML xml a ser verificado
* @param string $tag tag que é assinada
* @return boolean false se não confere e true se confere
*/
public function verifySignatureXML($conteudoXML, $tag){
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = false;
$dom->loadXML($conteudoXML);
$tagBase = $dom->getElementsByTagName($tag)->item(0);
// validar digest value
$tagInf = $tagBase->C14N(false, false, null, null);
$tagInf = str_replace($retXML, '', $tagInf);
$digestCalculado = base64_encode(sha1($tagInf, true));
$digestInformado = $dom->getElementsByTagName('DigestValue')->item(0)->nodeValue;
if ($digestCalculado != $digestInformado){
$this->errStatus = true;
$this->errMsg = "O conteúdo do XML não confere com o Digest Value.\nDigest calculado [{$digestCalculado}], informado no XML [{$digestInformado}].\nO arquivo pode estar corrompido ou ter sido adulterado.\n";
return false;
}
// Remontando o certificado
$X509Certificate = $dom->getElementsByTagName('X509Certificate')->item(0)->nodeValue;
$X509Certificate = "-----BEGIN CERTIFICATE-----\n".
$this->__splitLines($X509Certificate)."\n-----END CERTIFICATE-----\n";
$pubKey = openssl_get_publickey($X509Certificate);
if ($pubKey === false){
$this->errStatus = true;
$this->errMsg = "Ocorreram problemas ao remontar a chave pública. Certificado incorreto ou corrompido!!\n";
return false;
}
// remontando conteudo que foi assinado
$conteudoAssinado = $dom->getElementsByTagName('SignedInfo')->item(0)->C14N(false, false, null, null);
// Retirar itens das tags da assinatura da nota
$conteudoAssinado = str_replace($retXML, '', $conteudoAssinado);
// validando assinatura do conteudo
$conteudoAssinadoNoXML = $dom->getElementsByTagName('SignatureValue')->item(0)->nodeValue;
$conteudoAssinadoNoXML = base64_decode(str_replace(array("\r", "\n"), '', $conteudoAssinadoNoXML));
$ok = openssl_verify($conteudoAssinado, $conteudoAssinadoNoXML, $pubKey);
if ($ok != 1){
$this->errStatus = true;
$this->errMsg = "Problema ({$ok}) ao verificar a assinatura do digital!!";
return false;
}
$this->errStatus = false;
$this->errMsg = "";
return true;
} // fim verifySignatureXML