Fiz mais alguns teste e funcionou perfeitamente, MUITO obrigado Roberto, seu material foi de grande ajuda, abaixo coloco seu material novamente com comentários que pode ajudar programadores menos experientes como no meu caso:
<?
/**
* Código postado por Roberto L. Machado - linux.rlm [PHP Avançado]
*
http://groups.google.com.br/group/phpavancado/ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
http://www.gnu.org/licenses/gpl.txt *
*/
$nfeDir = 'inNF/'; //diretorio onde sera gravado o xml assinado
$nfeName = 'nfe.xml';// nome qeu sera dado ao arquivo xml assinado
$filename = $nfeDir.$nfeName; // diretorio e nome do arquivo xml da nota fiscal ser assinado
$res = sign($filename); // efetuar a assinatura
//mostra o documento assinado em tela
$nfe = file_get_contents($res);
header('Content-type: text/xml');
PRINT $nfe;
function sign($filename){
$xmldoc = new DOMDocument(); //inicia objeto DOM
$xmldoc->preservWhiteSpace = FALSE; //elimina espaços em branco
$xmldoc->load($filename); //carrega o xml no objeto
$infNFe = $xmldoc->getElementsByTagName('infNFe')->item(0); //cria um objeto DOM com o conteudo do node infNFe
$id = trim($infNFe->getAttribute("Id")); //extrai o id da NF, será necessário adiante no node da assinatura
unset($infNFe); // limpa a variável
/*************************************
* Para que o XMLSEC possa assinar o documento é necessário criar o
* tamplate da assinatura no XML
**************************************/
$NFe = $xmldoc->getElementsByTagName('NFe')->item(0); //carrega o node raiz NFe
$Signature = $xmldoc->createElement ('Signature'); //cria o nove da assinatura digital
$Signature->setAttribute("xmlns", "
http://www.w3.org/2000/09/xmldsig#"); //estabelece o formato da assinatura
$NFe->appendChild($Signature); //acrescenta o node ao objeto XML
$SignedInfo = $xmldoc->createElement('SignedInfo'); // cria a tag SignedInfo
$Signature->appendChild($SignedInfo); //acrescenta a tag ao node Signature
$SignatureValue = $xmldoc->createElement('SignatureValue'); // cria a tag SignatureValue
$Signature->appendChild($SignatureValue); //acrescenta a tag ao node Signature
$KeyInfo = $xmldoc->createElement('KeyInfo'); // cria a tag KeyInfo
$Signature->appendChild($KeyInfo); //acrescenta a tag ao node Signature
$X509Data = $xmldoc->createElement('X509Data'); // cria a tag X509Data
$KeyInfo->appendChild($X509Data); //acrescenta a tag ao node KeyInfo
$X509Certificate= $xmldoc->createElement('X509Certificate'); // cria a tag X509Certificate
$X509Data->appendChild($X509Certificate); //acrescenta a tag ao node X509Data
$CanonicalizationMethod = $xmldoc->createElement('CanonicalizationMethod'); // cria a tag CanonicalizationMethod e seu atributo
$CanonicalizationMethod->setAttribute("Algorithm", "
http://www.w3.org/TR/2001/REC-xml-c14n-20010315");
$SignedInfo->appendChild($CanonicalizationMethod); //acrescenta a tag ao node SignedInfo
$SignatureMethod = $xmldoc->createElement( 'SignatureMethod' ); // cria a tag SignatureMethod e seu atributo
$SignatureMethod->setAttribute('Algorithm', '
http://www.w3.org/2000/09/xmldsig#rsa-sha1' );
$SignedInfo->appendChild($SignatureMethod ); //acrescenta a tag ao node SignedInfo
$Reference = $xmldoc->createElement( 'Reference' ); // cria a tag Reference
$Reference->setAttribute("URI", '#'.$id); // acrescenta o atributo com o id da NFe obitido anteriormente
$SignedInfo->appendChild($Reference ); //acrescenta a tag ao node SignedInfo
$Transforms = $xmldoc->createElement('Transforms'); // cria a tag Transforms
$Reference -> appendChild($Transforms); //acrescenta a tag ao node Reference
$Transform = $xmldoc->createElement('Transform'); // cria a tag Transform e seu atributo
$Transform -> setAttribute('Algorithm', '
http://www.w3.org/2000/09/xmldsig#enveloped-signature' );
$Transforms-> appendChild($Transform); //acrescenta a tag ao node Transforms
$Transform = $xmldoc->createElement('Transform'); //acrescenta outra tag Transform e seu atributo
$Transform -> setAttribute('Algorithm', '
http://www.w3.org/TR/2001/REC-xml-c14n-20010315' );
$Transforms-> appendChild($Transform); //acrescenta a tag ao node Transforms
$DigestMethod = $xmldoc->createElement('DigestMethod'); // cria a tab DigestMethod e seu atributo
$DigestMethod->setAttribute('Algorithm', '
http://www.w3.org/2000/09/xmldsig#sha1' );
$Reference->appendChild($DigestMethod ); //acrescenta a tag ao node Reference
$DigestValue = $xmldoc->createElement('DigestValue'); // cria a tab DigestValue
$Reference->appendChild($DigestValue); //acrescenta a tag ao node Reference
$xmldoc->saveXML(); // atualiza o objeto DOM com os novos nodes
/**************************************************
* Fim da criação do template
<Nfe xmlns="
http://www.portalfiscal.inf.br/nfe">
<infNFe versao="1.07" Id="NFe43060992665611012850550079000000011485651995">
...
...
</infNFe>
<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/2000/09/xmldsig#rsa-sha1" />
<Reference URI="#NFe43060992665611012850550079000000011485651995">
<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/2000/09/xmldsig#sha1" />
<DigestValue/>
</Reference>
</SignedInfo>
<SignatureValue/>
<KeyInfo>
<X509Data>
<X509Certificate/>
</X509Data>
</KeyInfo>
</Signature>
</NFe>
***************************************************/
// obter um nome para o arquivo temporário de entrada
//$tmpfName = tempnam('./' , 'in'); tive que comentar esta linha e criar um nome para o arquivo com a extensão XML
$tmpfName = './in/nfe.xml';
// obter um nome para o arquivo temporário de saída
//$outputName = tempnam('./' , 'outNF'); tive que comentar esta linha e criar um mome para o arquivo com a extensão XML
$outputName = './outNF/notinha.xml';
// salvar o XML alterado no arquivo temporário
$xmldoc->save($outputDir.$tmpfName);
// liberar da memória o objeto DOM
unset($xmldoc);
// arquivo certificado de usuário possui ambas as chaves (privada e publica)
$usercert12 = './NFE.pfx'; //este é o caminho para o certificado que é disponibiliazado pelas Agencias certificadoras, o arquivo pfx
// senha da chave privada
$password = 'senhadocertificado';
// arquivo do certificado digital da entidade emissora
$cacertpem = './NFE.pem'; //este é o arquivo do certificado digital devidamente convertido, isso pode ser feito pelo Debian ou MacOS pelo seguinte comando openssl pcks12 -in certificado.pfx -out NFE.pem
/*********************************************************
* Montar o comando shell para assinar o documento salvo no arquivo temporário
* xmlsec1 - nome do comando no linux (para windows deve ser xmlsec.exe)
* sign - solicitação de assinatura
* --id-attr:Id infNFe - indica o que deve ser assinado apenas o node infNFe com o Id indicado pelo node Reference
* --output <file> - indica o arquivo de saida do comando ou seja o XML assinado
* --pkcs12 <private-key> - indica o arquivo do certificado do usuário no formato pkcs12
* --pwd <password> - indica a senha da chave privada
* --trusted-pem <certificate> - indica o arquivo do certificado digital no formato pem
* <inputfile> - no final o arquivo XML com o template da assinatura
*************************************************************/
$cmd = "xmlsec1 sign --id-attr:Id infNFe --output $outputName --pkcs12 $usercert12 --pwd $password --trusted-pem $cacertpem $tmpfName 2>&1";
//executa o comando na shell e retorna o resultado em $read
$p = popen( $cmd, 'r');
$read = fread($p , 4096);
pclose($p);
//apaga o arquivo temporário e limpa a memória
$z = unlink($tmpfName);
unset($tmpfName);
// remove quaisquer LF ou CR que ainda estejam no documento - vide Manual de Integração
$outDocument = file_get_contents($outputName);
$outDocument = str_replace(chr(13),"",$outDocument);
$outDocument = str_replace(chr(10),"",$outDocument);
file_put_contents($outputName, $outDocument);
// salva o XML como NFe43060992665611012850550079000000011485651995.xml
$signdoc = new DOMDocument();
$signdoc->preservWhiteSpace = FALSE;
$signdoc->load($outputName);
$signdoc->saveXML();
$xmlName = $id.'.xml';
$signdoc->save($xmlName);
// limpa a memoria e apaga o documento temporário
unset($signdoc);
$z = unlink($outputName);
unset($outputName);
// retorna o nome do arquivo assinado
return $xmlName;
}
?>