NFe

Olá, estou estudando a possibilidade de desenvolver um sistema para envio de Notas Fiscais Eletronicas utilizando JAVA.
Eu reparei que tem dois aplicativos no site da receita federal. Um para visualizar uma nota fiscal a partir de um arquivo XML, detalhe que eu não achei nenhuma versão compativel para testar.
E tem um assinador de notas fiscais que parece estar funcionando.
Alguem do forum ja desenvolveu aplicativos para NFe em java e pode me orientar?

eu participo do projeto da NFe da secretaria da fazenda daqui de MG. Qual a sua dúvida especificamente? :slight_smile:

Olá, Bom Dia!
Obrigado pelo contato.
Vou te explicar o que eu conheço e você compara se estou no caminho certo.
Inicialmente eu recebi uma tarefa na minha empresa para desenvolver um programa em java que crie o XML, assine e transmita para a receita.

Bom inicialmente eu acessei o site
http://www.nfe.fazenda.gov.br
e fiz o download das duas ferramentas, o visualizador e o assinador, mais reparei que o visualizador de NF-e 3.2 não é compatível com o Assinador.
Esse é o meu primeiro problema, eu gostaria de poder gerar a nota fiscal em XML, assinar pelo assinador e depois visualizar no Visualizador e transmitir para o SPED.

Estou no caminho certo?
Se desejar falar comigo por msn eu te passo meu endereco.

Ola mhinz

Voce conseguiu desenvolver o projeto da nota fiscal e se conseguiu, o que utilizou?

Bom dia a todos. Sou desenvolvedor do projeto NF-e da empresa onde trabalho.Um dica inicial e muito importante, baixe o manual de integração e leia-o. Ele será muito útil quando estiver desenvolvendo, alias vc deve segui-lo, pois nele contem todas as regras, tipos de campos, etc. Nosso produto interage com qualquer ERP. O pontos mais critico que enfrentamos foi a assinatura de xml. O consumo de web service é tranquilo, basta ter o certificado na mao e “dois” cliques vc consome o webservice.

Qualquer dúvida estou a disposição do forum, que por sinal vem me ajudado muito em minha carreira de Desenvolvedro Java.

Obrigado a todos.

Ola Mateus

Eu iniciei um projeto de nota fiscal eletronica ha 2 semanas, tenho mais 22 semanas para terminar.

Eu consegui gerar meu primeiro xml utilizando jdom atraves de um exemplo aqui mesmo do guj.

Classe :

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

public class GeraXML
{
public GeraXML(){
}

public static void main(String[] args) 
{
    Element agenda = new Element("Agenda");
    //Define Agenda como root
    Document documento = new Document(agenda);
    //Cria o elemento Contato
    Element contato = new Element("Contato");
    //Adiciona o atributo id ao Contato
    contato.setAttribute("id","123");
    //Criando os elementos de contato
    Element nome = new Element("nome");
    nome.setText("Glaucio Guerra");
    Element telefone = new Element("telefone");
    telefone.setText("123-456");
    Element endereco = new Element("endereco");
    endereco.setText("Av. Amaral Peixoto S/N");
    Element email = new Element("email");
    email.setText("glaucioguerra@gmail.com");
    //Adicionando elementos nome, telefone, endereco e email no Contato
    contato.addContent(nome);
    contato.addContent(telefone);
    contato.addContent(endereco);
    contato.addContent(email);
    //Adicionado o Contato a Agenda
    agenda.addContent(contato);
    //Classe responsável para imprimir / gerar o XML
    XMLOutputter xout = new XMLOutputter();
    try 
    {
        //Criando o arquivo de saida
        FileWriter arquivo = new FileWriter
        (
                new File("C:/arquivo.xml")
        );
        //Imprimindo o XML no arquivo
        xout.output(documento, arquivo);
    } catch (IOException e) 
    {
        e.printStackTrace();
    }	

}
}

O resultado foi esse:

<?xml version="1.0" encoding="UTF-8"?>

Glaucio Guerra123-456Av. Amaral Peixoto S/Nglaucioguerra@gmail.com

As minhas duvida são:

Estou no caminho certo?
A estrutura da nota fiscal eletronica é esta mesma?
Devo seguir com jdom?
Devo seguir no caminho para um programa web ou desktop?
Qual seria meu proximo passo, seria estudar como assinar este xml?

Espero que alguem possa me ajudar.

Abraços.

Amigo, vai umas dicas:
-baixe o manual de integração.
-Acesse o site do portal da nota fiscal eletronica e verifique os Schemas XML.
http://www.nfe.fazenda.gov.br/portal/

-Aqui ha noticias da NF-e, sobre prazos, downloads, atualizações, etc.
http://www.fazenda.sp.gov.br/nfe/default.asp

**** Se vc esta dizendo isso pq suas empresa(clientes) se encacham nisso:
http://www.fazenda.sp.gov.br/nfe/perguntas_frequentes/respostas_II.asp#1
o ENCAT disse em uma nota que seria adiado para 1°dezembro, mas aconteceu uma reuniao na ultima sexta-feira, do CONFAZ, para resolver se seria prorogado ou nao.
O pq adiar é pela quantidade de formularios de segurança procurados para compra pelas empresas que estaram obrigatorias a emitir NF-e em 1°setembro, tendo em vista que sao poucas as graficas que emitem o formulario de segurança, apenas 7 no brasil.
O formulario de segurança é o papel onde sera impresso a danfe em caso de contingencia(webservices off, nao consegue emviar nfe xml, etc).

Nao conte com isso ainda. mas na segunda ja terei uma noticia para vc.

um abraço,

Ola Mateus

As minhas duvidas é operacional, pois na empresa donde trabalho ha um sistema alugado que emite nota fiscal eletronica, porem meu superior quer substitui este sistema por um sistema proprio da empresa.

Entao seria duvidas operacionais:

Quais ferramentas utilizar.

Ja consegui gerar xml, agora preciso saber qual o proximo passo que preciso fazer.

Estava pensando em partir para persitencia de dados, isto é, terei a base de dados no banco oracle e persisitirei estes dados gerando o xml.

Que ferramentas devo utilizar para conseguir implementar o sistema da nota fiscal eletronica?

Nao tenho muito conhecimento em java, eu trabalho com oracle.

Desde ja, muito obirgado mateus.

[quote=mateusprado]Bom dia a todos. Sou desenvolvedor do projeto NF-e da empresa onde trabalho.Um dica inicial e muito importante, baixe o manual de integração e leia-o. Ele será muito útil quando estiver desenvolvendo, alias vc deve segui-lo, pois nele contem todas as regras, tipos de campos, etc. Nosso produto interage com qualquer ERP. O pontos mais critico que enfrentamos foi a assinatura de xml. O consumo de web service é tranquilo, basta ter o certificado na mao e “dois” cliques vc consome o webservice.

Qualquer dúvida estou a disposição do forum, que por sinal vem me ajudado muito em minha carreira de Desenvolvedro Java.

Obrigado a todos.[/quote]

Ola, consegui assinar e etc… o meu maior problema eh o consumo do webservice, simplismente nao consigo fazer no NetBeans 6.0 (nunca usei soap/webservice/etc…) e tenho poucos dias para fazer funcionar.
vc tem alguma dica ou tutorial, ou qq coisa,
serve um codigo de verificacao se o servico esta funcionando :wink:

muito obrigado e []´s

Ola Amigos

O xml estou gerando da nota fiscal, agora estou precisando aprender persistencia de objetos, pois nao quero utilizar sql para ler da base as informacoes da nota para gerar xml.

Alguem pode me ajudar, nem que seja um exemplo de uma unica tabela e com uma unica coluna para que eu possa persitir.

Desde ja, muito obrigado.

Alguem pode me ajudar… estou precisando de uma ajuda para assinar a nfe… alguem tem algum exemplo ou tutorial sobre essa assinatura

Ola Pessoal

Eu usei o mesmo codigo postado aqui no grupo
e adicionei um codigo o codigo X509 no projeto (ou na pasta)

somente esses dois jah funcionou

usar: Assinador.assinar( … )

segue os dois arquivos *.java na sequencia

Assinador.java

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package assinadornfe01;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
//import sun.misc.BASE64Encoder;

import java.util.Enumeration;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.security.PrivateKey;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import javax.swing.JOptionPane;

import AssinadorNFE.X509KeySelector;

public class Assinador
{
private static final String C14N_TRANSFORM_METHOD = “http://www.w3.org/TR/2001/REC-xml-c14n-20010315”;

    private static final String PROVIDER_CLASS_NAME = "org.jcp.xml.dsig.internal.dom.XMLDSigRI";
    private static final String PROVIDER_NAME = "jsr105Provider";
    
    public void assinar(String caminhoXml, String caminhoCertificado, String senha, String caminhoXmlNovo, String tipo) throws Exception 
{
	// tipo
	// '1' - NFE
	// '2' - CANCELAMENTO
	// '3' - INUTILIZACAO
	//
	String tag = "";		
	if(tipo.equals("1"))
		tag = "infNFe";
	else if (tipo.equals("2"))
		tag = "infCanc";
	else if (tipo.equals("3"))
		tag = "infInut";
		
            
		
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	factory.setNamespaceAware(false);
	DocumentBuilder builder = factory.newDocumentBuilder();
	Document docs = builder.parse(new File(caminhoXml));
	//Document docs = builder.parse(new File("c:/xml/430802017886010001735500000000010000030371-nfe.xml"));

	// Obtem elemento do documento a ser assinado, será criado uma
	// REFERENCE para o mesmo
	NodeList elements = docs.getElementsByTagName(tag);
	Element el = (Element) elements.item(0);
	String id = el.getAttribute("Id");
	//System.out.println(id);
	
	// Create a DOM XMLSignatureFactory that will be used to
	// generate the enveloped signature.
            String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
            XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
	//XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
	
	// Create a Reference to the enveloped document (in this case,
	// you are signing the whole document, so a URI of "" signifies
	// that, and also specify the SHA1 digest algorithm and
	// the ENVELOPED Transform.
	ArrayList transformList = new ArrayList();
	TransformParameterSpec tps = null;
	Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,tps);
	Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
	transformList.add(envelopedTransform);
	transformList.add(c14NTransform);

	Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
	// Create the SignedInfo.
	SignedInfo si = fac
			.newSignedInfo(fac.newCanonicalizationMethod(
					CanonicalizationMethod.INCLUSIVE,
					(C14NMethodParameterSpec) null), fac
					.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
					Collections.singletonList(ref));
	
	// Load the KeyStore and get the signing key and certificate.
	///Provider p = new sun.security.pkcs11.SunPKCS11("c:/taliam/sclara.cer");
	//Security.addProvider(p);
	//KeyStore ks = KeyStore.getInstance("PKCS11");
	//ks.load(null, new String("safeweb").toCharArray());
	
	KeyStore ks = KeyStore.getInstance("PKCS12");
	ks.load(new FileInputStream(caminhoCertificado), senha.toCharArray());
	Enumeration aliasesEnum = ks.aliases();
	String alias = "";
	while (aliasesEnum.hasMoreElements()) {
		alias = (String) aliasesEnum.nextElement();

		if (ks.isKeyEntry(alias)) {
			//System.out.println(alias);
			break;
		}
	}
	
	// Original
	//KeyStore ks = KeyStore.getInstance("JKS");
	//ks.load(new FileInputStream("santaclara.jks"), "RAIMUNDO".toCharArray());
	
	//		
	KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(senha.toCharArray()));
    
	X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
	// Create the KeyInfo containing the X509Data.
	KeyInfoFactory kif = fac.getKeyInfoFactory();
	List x509Content = new ArrayList();
	// x509Content.add(cert.getSubjectX500Principal().getName());
	
	x509Content.add(cert);
	X509Data xd = kif.newX509Data(x509Content);
	KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
	
	// Instantiate the document to be signed.
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	dbf.setNamespaceAware(true);
	Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(caminhoXml));

	// Create a DOMSignContext and specify the RSA PrivateKey and
	// location of the resulting XMLSignature's parent element.
	DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());

	// Create the XMLSignature, but don't sign it yet.
	XMLSignature signature = fac.newXMLSignature(si, ki);

	// Marshal, generate, and sign the enveloped signature.
	signature.sign(dsc);

	// Output the resulting document.
	OutputStream os = new FileOutputStream(caminhoXmlNovo);
	TransformerFactory tf = TransformerFactory.newInstance();
	Transformer trans = tf.newTransformer();
	trans.transform(new DOMSource(doc), new StreamResult(os));

	// Find Signature element.
	NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
	
	if (nl.getLength() == 0) {
		throw new Exception("Cannot find Signature element");
	}
	// Create a DOMValidateContext and specify a KeySelector and document
	// context.
	DOMValidateContext valContext = new DOMValidateContext( new X509KeySelector(ks), nl.item(0));
	// Unmarshal the XMLSignature.
	XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
	// Validate the XMLSignature.
	boolean coreValidity = signatures.validate(valContext);
	// Check core validation status.
	if (coreValidity == false) {
		System.err.println("Falha na Assinatura!");
	} else {
		System.out.println("Assinatura Correta!");
	}
}

public static void main(String[] args) throws Exception {
	
	if(args.length != 5)
	{
		//JOptionPane.showMessageDialog(null, "São esperados 5 parâmetros!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
		System.out.println("Sao esperados 5 parametros!");
                    return;
	}
	String caminhoXml = args[0];
	String caminhoCertificado = args[1];
	String senha = args[2];
	String arquivoXmlNovo = args[3];
	String tipo = args[4];
	
	File file = new File(caminhoXml);
	if(!file.exists())
	{
		//JOptionPane.showMessageDialog(null, "Arquivo " + caminhoXml + " não encontrado!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
            System.out.println("Arquivo " + caminhoXml + " não encontrado!");
		return;
	}
	file = new File(caminhoCertificado);
	if(!file.exists())
	{
		//JOptionPane.showMessageDialog(null, "Arquivo " + caminhoCertificado + " não encontrado!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
            System.out.println("Arquivo " + caminhoCertificado + " não encontrado!");
		return;
	}
	try
	{
		Assinador t = new Assinador();
		t.assinar(caminhoXml, caminhoCertificado, senha, arquivoXmlNovo, tipo);
		//JOptionPane.showMessageDialog(null, "Arquivo xml assinado com sucesso!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
                    System.out.println("Arquivo xml assinado com sucesso" + caminhoXml + "!");
	}
	catch(Exception e)
	{
		//JOptionPane.showMessageDialog(null, "Erro ao tentar assinar arquivo xml! \n\n" + e.toString(), "Atenção", JOptionPane.INFORMATION_MESSAGE);
                    System.out.println("Erro ao tentar assinar arquivo xml! \n\n" + e.toString());
	}
}

}

X509KeySelector.java

package AssinadorNFE;

import java.io.InputStream;
import java.io.IOException;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.CertSelector;
import java.security.cert.X509Certificate;
import java.security.cert.X509CertSelector;
import java.util.Enumeration;
import java.util.Iterator;
import javax.security.auth.x500.X500Principal;
import javax.xml.crypto.;
import javax.xml.crypto.dsig.
;
import javax.xml.crypto.dom.;
import javax.xml.crypto.dsig.keyinfo.
;

/**

  • A KeySelector that returns {@link PublicKey}s of trusted

  • {@link X509Certificate}s stored in a {@link KeyStore}.

  • This KeySelector uses the specified KeyStore

  • to find a trusted X509Certificate that matches information

  • specified in the {@link KeyInfo} passed to the {@link #select} method.

  • The public key from the first match is returned. If no match,

  • null is returned. See the select method for more

  • information.

  • NOTE!: This X509KeySelector requires J2SE 1.4 because it uses the

  • java.security.cert.X509CertSelector & javax.security.auth.x500.X500Principal

  • classes to parse X.500 DNs and match on certificate attributes.

  • @author Sean Mullan
    */
    public class X509KeySelector extends KeySelector {

    private KeyStore ks;

    /**

    • Creates an X509KeySelector.
    • @param keyStore the keystore
    • @throws KeyStoreException if the keystore has not been initialized
    • @throws NullPointerException if keyStore is
    • null
      */
      public X509KeySelector(KeyStore keyStore) throws KeyStoreException {
      if (keyStore == null) {
      throw new NullPointerException(“keyStore is null”);
      }
      this.ks = keyStore;
      // test to see if KeyStore has been initialized
      this.ks.size();
      }

    /**

    • Finds a key from the keystore satisfying the specified constraints.
    • This method compares data contained in {@link KeyInfo} entries

    • with information stored in the KeyStore. The implementation
    • iterates over the KeyInfo types and returns the first {@link PublicKey}
    • of an X509Certificate in the keystore that is compatible with the
    • specified AlgorithmMethod according to the following rules for each
    • keyinfo type:
    • X509Data X509Certificate: if it contains a KeyUsage
    • extension that asserts the digitalSignature bit and
    • matches an X509Certificate in the KeyStore.
    • X509Data X509IssuerSerial: if the serial number and issuer DN match an
    • X509Certificate in the KeyStore.
    • X509Data X509SubjectName: if the subject DN matches an
    • X509Certificate in the KeyStore.
    • X509Data X509SKI: if the subject key identifier matches an
    • X509Certificate in the KeyStore.
    • KeyName: if the keyname matches an alias in the KeyStore.
    • RetrievalMethod: supports rawX509Certificate and X509Data types. If
    • rawX509Certificate type, it must match an X509Certificate
    • in the KeyStore.
    • @param keyInfo a KeyInfo (may be null)
    • @param purpose the key’s purpose
    • @param method the algorithm method that this key is to be used for.
    • Only keys that are compatible with the algorithm and meet the
    • constraints of the specified algorithm should be returned.
    • @param an XMLCryptoContext that may contain additional
    • useful information for finding an appropriate key
    • @return a key selector result
    • @throws KeySelectorException if an exceptional condition occurs while
    • attempting to find a key. Note that an inability to find a key is not
    • considered an exception (null should be
    • returned in that case). However, an error condition (ex: network
    • communications failure) that prevented the KeySelector
    • from finding a potential key should be considered an exception.
    • @throws ClassCastException if the data type of method
    • is not supported by this key selector
      */
      public KeySelectorResult select(KeyInfo keyInfo,
      KeySelector.Purpose purpose, AlgorithmMethod method,
      XMLCryptoContext context) throws KeySelectorException {
     SignatureMethod sm = (SignatureMethod) method;
    
     try {
         // return null if keyinfo is null or keystore is empty
         if (keyInfo == null || ks.size() == 0) {
             return new SimpleKeySelectorResult(null);
         }
    
         // Iterate through KeyInfo types
         Iterator i = keyInfo.getContent().iterator();
         while (i.hasNext()) {
             XMLStructure kiType = (XMLStructure) i.next();
     // check X509Data
             if (kiType instanceof X509Data) {
                 X509Data xd = (X509Data) kiType;
         KeySelectorResult ksr = x509DataSelect(xd, sm);
             if (ksr != null) {
             return ksr;
             }
     // check KeyName
             } else if (kiType instanceof KeyName) {
         KeyName kn = (KeyName) kiType;
         Certificate cert = ks.getCertificate(kn.getName());
         if (cert != null && algEquals(sm.getAlgorithm(),
     	cert.getPublicKey().getAlgorithm())) {
     	return new SimpleKeySelectorResult(cert.getPublicKey());
         }
     // check RetrievalMethod
             } else if (kiType instanceof RetrievalMethod) {
         RetrievalMethod rm = (RetrievalMethod) kiType;
                 try {
     	KeySelectorResult ksr = null;
             if (rm.getType().equals
     	    (X509Data.RAW_X509_CERTIFICATE_TYPE)) {
     	    OctetStreamData data = (OctetStreamData) 
     		rm.dereference(context);
     	    CertificateFactory cf = 
     	        CertificateFactory.getInstance("X.509");
     	    X509Certificate cert = (X509Certificate) 
     	        cf.generateCertificate(data.getOctetStream());
                 ksr = certSelect(cert, sm);
             } else if (rm.getType().equals(X509Data.TYPE)) {
     	    NodeSetData nd = (NodeSetData) 
     		rm.dereference(context);
     	    // convert nd to X509Data
                 // ksr = x509DataSelect(xd, sm);
             } else {
     	    // skip; keyinfo type is not supported
     	    continue;
     	}
             if (ksr != null) {
                 return ksr;
                 }
                 } catch (Exception e) {
             throw new KeySelectorException(e);
         }
     }
         }
     } catch (KeyStoreException kse) {
         // throw exception if keystore is uninitialized
         throw new KeySelectorException(kse);
     }
    
     // return null since no match could be found
     return new SimpleKeySelectorResult(null);
    

    }

    /**

    • Searches the specified keystore for a certificate that matches the
    • criteria specified in the CertSelector.
    • @return a KeySelectorResult containing the cert’s public key if there
    • is a match; otherwise null
      */
      private KeySelectorResult keyStoreSelect(CertSelector cs)
      throws KeyStoreException {
      Enumeration aliases = ks.aliases();
      while (aliases.hasMoreElements()) {
      String alias = (String) aliases.nextElement();
      Certificate cert = ks.getCertificate(alias);
      if (cert != null && cs.match(cert)) {
      return new SimpleKeySelectorResult(cert.getPublicKey());
      }
      }
      return null;
      }

    /**

    • Searches the specified keystore for a certificate that matches the
    • specified X509Certificate and contains a public key that is compatible
    • with the specified SignatureMethod.
    • @return a KeySelectorResult containing the cert’s public key if there
    • is a match; otherwise null
      */
      private KeySelectorResult certSelect(X509Certificate xcert,
      SignatureMethod sm) throws KeyStoreException {
      // skip non-signer certs
      boolean[] keyUsage = xcert.getKeyUsage();
      if (keyUsage[0] == false) {
      return null;
      }
      String alias = ks.getCertificateAlias(xcert);
      if (alias != null) {
      PublicKey pk = ks.getCertificate(alias).getPublicKey();
      // make sure algorithm is compatible with method
      if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
      return new SimpleKeySelectorResult(pk);
      }
      }
      return null;
      }

    /**

    • Returns an OID of a public-key algorithm compatible with the specified
    • signature algorithm URI.
      */
      private String getPKAlgorithmOID(String algURI) {
      if (algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
      return “1.2.840.10040.4.1”;
      } else if (algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
      return “1.2.840.113549.1.1”;
      } else {
      return null;
      }
      }

    /**

    • A simple KeySelectorResult containing a public key.
      */
      private static class SimpleKeySelectorResult implements KeySelectorResult {
      private final Key key;
      SimpleKeySelectorResult(Key key) { this.key = key; }
      public Key getKey() { return key; }
      }

    /**

    • Checks if a JCA/JCE public key algorithm name is compatible with
    • the specified signature algorithm URI.
      */
      //@@@FIXME: this should also work for key types other than DSA/RSA
      private boolean algEquals(String algURI, String algName) {
      if (algName.equalsIgnoreCase(“DSA”) &&
      algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
      return true;
      } else if (algName.equalsIgnoreCase(“RSA”) &&
      algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
      return true;
      } else {
      return false;
      }
      }

    /**

    • Searches the specified keystore for a certificate that matches an
    • entry of the specified X509Data and contains a public key that is
    • compatible with the specified SignatureMethod.
    • @return a KeySelectorResult containing the cert’s public key if there
    • is a match; otherwise null
      */
      private KeySelectorResult x509DataSelect(X509Data xd, SignatureMethod sm)
      throws KeyStoreException, KeySelectorException {

    // convert signature algorithm to compatible public-key alg OID
    String algOID = getPKAlgorithmOID(sm.getAlgorithm());

    KeySelectorResult ksr = null;
    Iterator xi = xd.getContent().iterator();
    while (xi.hasNext()) {
    ksr = null;
    Object o = xi.next();
    // check X509Certificate
    if (o instanceof X509Certificate) {
    X509Certificate xcert = (X509Certificate) o;
    ksr = certSelect(xcert, sm);
    // check X509IssuerSerial
    } else if (o instanceof X509IssuerSerial) {
    X509IssuerSerial xis = (X509IssuerSerial) o;
    X509CertSelector xcs = new X509CertSelector();
    try {
    xcs.setSubjectPublicKeyAlgID(algOID);
    xcs.setSerialNumber(xis.getSerialNumber());
    xcs.setIssuer(new X500Principal
    (xis.getIssuerName()).getName());
    } catch (IOException ioe) {
    throw new KeySelectorException(ioe);
    }
    ksr = keyStoreSelect(xcs);
    // check X509SubjectName
    } else if (o instanceof String) {
    String sn = (String) o;
    X509CertSelector xcs = new X509CertSelector();
    try {
    xcs.setSubjectPublicKeyAlgID(algOID);
    xcs.setSubject(new X500Principal(sn).getName());
    } catch (IOException ioe) {
    throw new KeySelectorException(ioe);
    }
    ksr = keyStoreSelect(xcs);
    // check X509SKI
    } else if (o instanceof byte[]) {
    byte[] ski = (byte[]) o;
    X509CertSelector xcs = new X509CertSelector();
    try {
    xcs.setSubjectPublicKeyAlgID(algOID);
    } catch (IOException ioe) {
    throw new KeySelectorException(ioe);
    }
    // DER-encode ski - required by X509CertSelector
    byte[] encodedSki = new byte[ski.length+2];
    encodedSki[0] = 0x04; // OCTET STRING tag value
    encodedSki[1] = (byte) ski.length; // length
    System.arraycopy(ski, 0, encodedSki, 2, ski.length);
    xcs.setSubjectKeyIdentifier(encodedSki);
    ksr = keyStoreSelect(xcs);
    // check X509CRL
    // not supported: should use CertPath API
    } else {
    // skip all other entries
    continue;
    }
    if (ksr != null) {
    return ksr;
    }
    }
    return null;
    }
    }


Joao Luiz - Linux user #159951
my space : http://www.myspace.com/jluizsc
GRATIS eh POUCO: http://www.gratisepouco.com.br

Ola amigos

Espero que alguem possa me ajudar.

Estou implementando o sistema da nota fiscal eletronica em casa e por este motivo nao tenho certificado e nem a senha.

Onde trabalho emite nota fiscal eletronica. entao se eu ulilizar um
dos certificados referente a uma das notas vai funcionar?

Preciso aprender a consumir o web service, eu fiz o download do web service do serviço da nota fiscal eletronica, porem quando vou testar o we4b service, da um erro.

Como eu devo fazer para enviar as informaçoes para a sefaz, o correto seria eu testar as informaçoes em um webservice local, esta correto?

Eu utilizo o assinador do xml antes de enviar para o serviço web?

Por favor, alguem tem como me passar passo a passo o que devo fazer para transmitir as informcoes para sefaz.

Desde ja, muito obrigado amigos.

FINALMENTE FUNCIONOOOOOOOU… vou explicar aqui como eu fiz a comunicação com o web-service para alguem que possa estar sofrendo tanto quanto eu sofri…

Eu recebi do meu cliente um arquivo .pfx que é a chave que eu assino os XML’s gerdos. Não precisa exportar via IE como disseram em outros posts. Pelo que eu entendi só precisa exportar via IE quem está na máquina que solicitou o certificado pela internet, caso vc tenha recebido o certificado de algum cliente então usa o certificado recebido mesmo.

O certificado do Servidor deve ser baixado junto ao site do seu estado (SP no meu caso http://www.fazenda.sp.gov.br/nfe/url_webservices/url_webservices.asp) este certificado sim deve ser exportado pelo IE. Neste mesmo site eu baixei os arquivos WSDL do Web Service.

Depois de baixar todos os arquivos e receber o certificado do cliente (.pfx) vem esse Passo a Passo:
1. via Eclipse EE crie as classes JAVA a partir dos arquivos WSDL baixados: menu - File->New->Other->Web Services ->Web Service Client selecione o arquivo WSDL baixado do site do governo.

2. faça a instalação do certificado do governo, entre no IE Ferramenta->Conteudo->Certificados, vai até a aba Outras Pessoas selecione o certificado do e clique em exportar, exporte ele como X.509 codificado na Base 64(*.cer)

3. importe este arquivo para um keystore através do keytool: keytool -import -alias nfe -keystore <caminho_para_o_keystore> -file <caminho_completo_para_o_cert_exportado_do_IE>

4 agora vem o Java:


		String nfeCabecMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			+ "<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" "
			+ "versao=\"1.02\">" + "<versaoDados>1.07</versaoDados>"
			+ "</cabecMsg>";

		String nfeDadosMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
			+ "<consStatServ " + " versao=\"1.07\""
			+ " xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
			+ "<tpAmb>2</tpAmb>" + "<cUF>42</cUF>"
			+ "<xServ>STATUS</xServ>" + "</consStatServ>";


                System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

		System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
		System.setProperty("javax.net.ssl.keyStore","Caminho do Cerificado .pfx");
		System.setProperty("javax.net.ssl.keyStorePassword", "senha do certificado");

		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
		System.setProperty("javax.net.ssl.trustStore", "<caminho_para_o_keystore> gerado no passo 3");


		NfeStatusServico service = new NfeStatusServicoLocator();//Essas classes foram geradas no Passo 1
		try {
			NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
			System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));
		} catch (Throwable e1) {
			e1.printStackTrace();
		}

É isso ai, assim eu consegui fazer funcionar.

Espero ter ajudado… qualquer coisa pode me mandar um email rafaelbtz@yahoo.com.br que eu ajudo, já que eu recebi muita ajuda aqui no GUJ também

Abraços,

Amigo

Me envie um passo a passo, desde o inicio se possivel.

Sou leigo com webservice.

Eu utilizo o Netbeans.

Fico no aguardo.

Bom dia farzac, é o seguinte a ordem das coisas é:
Obter o Certificado Digital (no meu caso um arquivo .pfx que o meu cliente obteve junto a receita) - Gerar o XML - Assinar o XML (com o certificado .pfx) - Validar o XML no Schema (.XSD) - Enviar o XML pro SEFAZ.

Como eu fiz aqui:
Gerei, Assinei o XML e validei no Schema, e depois pra testar eu usei o programa Emissor de NF obtido no site http://www.nfe.fazenda.gov.br/portal/default.aspx - link downloads. Assim que eu consegui importar e enviar o meu XML via esse emissor do governo eu vi que a nota estava OK (Atenção, para conseguir importar o XML neste programa é preciso colocar o valor “3” na tag procEmi e o valor “TESTE 1.1.21” na tag verProc do XML). Ai eu parti para consumir o WebService:

Web Service (esse eu sofri, hehe), (por enquanto eu só testei a comunicação através do WebService StatusServico, ainda não enviei nenhum XML pois agora estou estruturando a aplicação inteira, mas se o StatusServiço funcionou e se eu consegui enviar a NF via o emissor do governo acho que não vou ter problemas para enviar via WebService):

Passo a Passo:
Baixar os arquivos .WSDL junto a receita do seu estado (no meu caso SP que fica em http://www.fazenda.sp.gov.br/nfe/url_webservices/url_webservices.asp), baixe neste mesmo link o arquivo da chave pública do Web-Service em SP esses são 2 arquivos com extensão .p7b um para Homologação outro para produção.

Passo a Passo:

  1. Com os arquivos WSDL crie as classes .java para acesso ao WebService - Eu não sei como isso funciona no NetBeans já que eu uso eclipse, mas de uma procurado no Google por “WSDL to Java on NetBeans” que com certeza vc vai achar ele vai criar umas 6 classes para cada arquivo .WSDL (por enquanto eu só criei para o WSDL do StatusServico);

  2. Instale no seu Windows a chave publica (.p7b) baixada do site da receita estadual, depois de instalar vai no Internet Explorer -> Ferramentas -> Opções da internet -> (Aba) Conteúdo -> (botão) certificados -> (Aba) outras pessoas; a chave instalada deve estar ai, selecione ela e clique no botão Exportar; na tela da exportação marque o RadioButton X.509 codificado na base 64 (*.cer) informe o arquivo com extensão .cer;

  3. Importe esta chave pública que vc exportou no IE para um keystore do Java com a ferramenta Keytool: via DOS va até a pasta bin da sua JRE e execute o seguinte comando: keytool -import -alias nfe -keystore <caminho_para_um_keystore Ex: c:\certificados\nfe.keystore> -file <caminho_completo_para_o_cert_exportado_do_IE ( arquivo .cer)>, esse comando irá gerar um arquivo que no exemplo é c:\certificados\nfe.keystore

  4. Agora é só ir pro JAVA, vamos la ( o exemplo é para verificar o Status do Serviço, para cada WebService existe um layout de mensagem diferente você pode ver isso no manual de integração que você encontra em http://www.nfe.fazenda.gov.br/portal/default.aspx), classe Java para verificar o Status é essa aqui:

public static void main(String[] args) {
   
         //Esse é o layout para o cabeçalho e rodapé para o Status do Serviço conforme o manual de integração explica
        String nfeCabecMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" "
            + "versao=\"1.02\">" + "<versaoDados>1.07</versaoDados>"
            + "</cabecMsg>";
        String nfeDadosMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<consStatServ " + " versao=\"1.07\""
            + " xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
            + "<tpAmb>2</tpAmb>" + "<cUF>42</cUF>"
            + "<xServ>STATUS</xServ>" + "</consStatServ>";

       
       
       
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
        System.setProperty("javax.net.ssl.keyStore","C:\\certificados\\cert.pfx");//Aqui vem o arquivo do certificado do seu cliente
        System.setProperty("javax.net.ssl.keyStorePassword", "SENHA DO CERTIFICADO");//Aqui a senha deste certificado

        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", "C:\\certificados\\nfe.keystore");//Aqui vem o arquivo criado através do comando keytool no passo 3

       
        // As classes abaixo são as classes geradas atavés do arquivo WSDL no passo 1
        NfeStatusServico service = new NfeStatusServicoLocator();
        try {
            NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
            System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));// O retorno deve ser um XML com o status do serviço
        } catch (Throwable e1) {
            e1.printStackTrace();
        }
    }

É isso ai para enviar a nota deve ser mais ou menos o mesmo procedimento alterando obviamente o layout da mensagem que pode ser encontrado la no manual de integração.

É isso ai espero ter ajudado, qualquer coisa é só perguntar

Obs: acho que foi vc que me mandou um email, mas todo caso se não foi estou colocando a resposta aqui também)

Boa noite

Fiz o download dos webservices e criei um novo projeto e criei um novo cliente para servico web utilizando
o wsdl nfeStatusServicoNF

Porem assim que criei baseado no wsdl descrito acima deu os seguintes erros:

Compiling 6 source files to D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\web\WEB-INF\classes
D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\NfeStatusServico.java:15: warning: unmappable character for encoding UTF-8

  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\NfeStatusServico.java:15: warning: unmappable character for encoding UTF-8
  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\NfeStatusServico.java:15: warning: unmappable character for encoding UTF-8
  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\NfeStatusServicoSoap.java:27: warning: unmappable character for encoding UTF-8
    • Retorno da Transmiss?o de Lote de NF-e
      D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\package-info.java:2: warning: unmappable character for encoding UTF-8
  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\package-info.java:2: warning: unmappable character for encoding UTF-8
  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    D:\Meus Documentos\FarzacSystem\Sefaz\NFE_4\build\generated\wsimport\client\br\inf\portalfiscal\nfe\wsdl\nfestatusservico\package-info.java:2: warning: unmappable character for encoding UTF-8
  • Servi?o destinado ? consulta do status do servi?oprestado pelo Portal da Secretaria de Fazenda
    7 warnings
    CONSTRUÍDO COM SUCESSO (tempo total: 5 segundos)

Espero que alguem possa me ajudar.

Me parece ser algum problema com caracter não reconhecido, nada a ver com java ou com o procedimento em si.

Vou realizar o teste agora e já coloco o resultado.

Obrigado

Carlos Inglez

rafaelbtz, bom dia.

Acabo de realizar um teste, sou novo neste projeto, e tenho algumas dúvidas.

Para consumir o WebService de status de serviço (NfeStatusServico), eu tb preciso de um certificado pfx? Mesmo no ambiente de homologação?

Seguindo os seus passos, obtive o seguinte resultado:

init:
deps-jar:
wsimport-init:
wsimport-client-check-NfeStatusServico:
wsimport-client-NfeStatusServico:
Consider using / so that wsimport won’t do unnecessary compilation
parsing WSDL…

[WARNING] SOAP port “NfeStatusServicoSoap12”: uses a non-standard SOAP 1.2 binding.
line 65 of file:/C:/Users/cis/Documents/NetBeansProjects/StatusWSSEFAZSP/xml-resources/web-service-references/NfeStatusServico/wsdl/NfeStatusServico.wsdl

generating code…

compiling code…

wsimport-client-generate:
wsimport-client-compile:
compile:
run:
java.lang.UnsupportedOperationException: Not yet implemented
at statuswssefazsp.NfeStatusServicoLocator.getNfeStatusServicoSoap(NfeStatusServicoLocator.java:20)
at statuswssefazsp.Main.main(Main.java:50)
CONSTRUÍDO COM SUCESSO (tempo total: 4 segundos)

Estou utilizando o NetBeans.

Obrigado

rafaelbtz

segui o seu tutorialzinho… porém eu não tenho o certificado .p7b…(para conseguir esse .p7b, tenho que cadastrar a empresa
na secretaria da fazenda, isso?!? sou do Pr)
mas gostaria de saber se faz diferença colocar esse código:

System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");   
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());   
  
        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");   
        System.setProperty("javax.net.ssl.keyStore","C:\\certificados\\cert.pfx");//Aqui vem o arquivo do certificado do seu cliente   
        System.setProperty("javax.net.ssl.keyStorePassword", "SENHA DO CERTIFICADO");//Aqui a senha deste certificado   
  
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");   
        System.setProperty("javax.net.ssl.trustStore", "C:\\certificados\\nfe.keystore");//Aqui vem o arquivo criado através do comando keytool no passo 3   

pois,
eu tenho o certificado . pfx e a partir deste ,gerei um . cert , que importei o .cert para um jks…
ai
criei o ws client, e em cima de seu código rodei… ele só me retorna null, ai comentei o codigo acima, e continua retornando null

agora não sei se não esta conectando la… se é o problema do certificado… entende?!?

valeo pela ajuda…