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?
NFe
132 Respostas
eu participo do projeto da NFe da secretaria da fazenda daqui de MG. Qual a sua dúvida especificamente? 
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("[email removido]");
//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/N[email removido]
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.
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, 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 
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 = “<a href="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">http://www.w3.org/TR/2001/REC-xml-c14n-20010315</a>”;
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.<em>;
import javax.xml.crypto.dsig.</em>;
import javax.xml.crypto.dom.<em>;
import javax.xml.crypto.dsig.keyinfo.</em>;
/**
-
A
KeySelectorthat returns {@link PublicKey}s of trusted -
This
KeySelectoruses the specifiedKeyStore -
to find a trusted
X509Certificatethat 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,
-
nullis returned. See theselectmethod 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
keyStoreis -
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
digitalSignaturebit and - matches an
X509Certificatein theKeyStore. - X509Data X509IssuerSerial: if the serial number and issuer DN match an
-
X509Certificatein theKeyStore. - X509Data X509SubjectName: if the subject DN matches an
-
X509Certificatein theKeyStore. - X509Data X509SKI: if the subject key identifier matches an
-
X509Certificatein theKeyStore. - 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 benull) - @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
XMLCryptoContextthat 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 (
nullshould 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; } }
- Creates an
–
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 [email removido] 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:
-
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);
-
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;
-
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
-
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
- Retorno da Transmiss?o de Lote de NF-e
- 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…
Pessoal, eu estou com 2 dificuldades:
-
Possuo um cartão e-CNPJ (Serasa, SP) e ainda não descobri como usar. Sei que este cartão serve como um keystore, mas como acessar via classe java?
-
Para acessar os webservices, é necessário o credenciamento na SEFAZ, e para isso é necessário o usuário e senha. Como somos uma empresa prestadora de serviços, não temos inscrição estadual, portanto não temos como obter acesso nem ao ambiente de testes. É isso mesmo?
Obrigado
É isso mesmo… Peça para o seu cliente habilitá-lo para vc, afinal ele vai ter a NFe, né…
Agora o certificado tipo A3 é beeem mais lento, cuidado com o volume de assinaturas. Quanto a como acessá-lo, é só entender que o keystore dele segue o pkcs#11 e não o pkcs#12 como o A1. fora isso todo o conceito é o mesmo. Você deve tambem ter um provider para a leitora do cartão, a qual vc configura programaticamente em java. traquilo.
[]´s
Pessoal, alguém conseguiu assinar a NF-e utilizando aquela dll fornecida assinaturaNFe32dll.dll? Existe algum exemplo de código em java?
Obrigado
cara, não faça isso… Tem vários exemplos no fórum de como fazer as coisas direito… Se vc vai utilizar serviços de infraestrutura externos, será que vale a pena fazer isso em java???
ae rafaelbtz … show de bola mano … tava enroscado aqui já uns dias pra chamar o WS … mas depois de ver a dica de geração das classes Java para chamada do WS através do WSDL … pimba … vlwss 
Show de bola essas dicas ai!!!
Valeu 
–
Joao Luiz - Linux user #159951
GRATIS eh POUCO: http://br.geocities.com/jluizsc (explicacoes orolix)
GRATIS eh POUCO: http://www.crescenet.dahora.net (explicacoes crescenet)
Pessoal, já consegui obter o status e assinar um xml. Existe algum tópico com código exemplo para a recepção do arquivo? Estou usando NetBeans mas tenho muito pouca experiência com java…
Desde já agradeço qualquer ajuda.
Pessoal,
Estou gerando os xml e assinando. Tudo está passando normalmente na validação e sendo enviado com status de sucesso para a sefaz. Mas a situação fica sempre “Em processamento pelo SEFAZ”.
Se eu pego o mesmo xml, importo para o sistema emissor da SEFAZ e assino nesse sistema, a situação vai para “Autorizada” imediatamente.
Como eu disse,eu não estou recebendo nenhuma mensagem de erro. Mesmo quando envio pelo meu sistema eu recebo a mensagem de “Lote recebido com sucesso”, mas não consigo encontrar a NF-e nas consultas oferecidas no site da SEFAZ.
Alguém sabe o porque disso?
Não teria nada a ver com o fato de o processamento ser assíncrono, ou seja, o status de autorizado precisa ser conferido em uma 2a conexão?
Eu estou precisando de algum exemplo de código para testar, tb já consegui pegar o status e assinar o arquivo. Mas ainda não consegui enviar, uma vez que meu arquivo está gerado e assinado.
Obrigado
Bom dia pessoal,
Tenho muitas duvidas tecnicas a respeito da nfe,
vou esplicar para vcs a minha situação aqui na empresa:
alguns clientes precisam emitir a nota fiscal eletronica,
nosso sistema é desenvolvido em visual foxpro, e com isso não conseguiremos
fazer a conexão e a assinatura nesta linguagem,
optamos por java por ja saber que irá funcionar nesta linguagem,
no entãnto tenho apenas um conhecimento basico em java.
o que foi feito até agora:
ja estamos com o nosso certificado digital,
consigo acessar a url de homologacao pelo IE,
ja criei o xml para o StatusServico,
agora estou tentando consumir o WS,
uso o netbeans, e quando vou criar um novo cliente para serviço web,
coloco a WSDL url: e mando finalizar,
no entanto ele da uma mensagem:
“Problema com download do arquivo wsld ou do esquema.
Verifique a URL, as configurações do proxy ou se o servidor esta em execução.”
a URL esta ok, o servidor tbm pois consigo acessar via IE,
não usamos proxy aqui na empresa.
agora vão as duvidas:
estou no caminho certo?
se sim, o que pode estar acontecendo a respeito deste problema?
tem algum tutorial, curso online, qualquer coisa que possa me ajudar nesse inicio
da nfe?
tenho lido bastante aqui no forum, lido uns tutoriais no site do netbeans, e estou
interessado em aprender bastante sobre essa linguagem.
obrigado pela ajuda!
Clayton Dias
Clayton você pode fazer download dos WSDL direto do site http://www.fazenda.sp.gov.br/nfe/url_webservices/url_webservices.asp, o primeiro link desta pagina são os WSDL, depois disso crie as classes java a partir do arquivo WSDL que vc baixou, (na pagina anterior tem um totorial explicando como fazer isso no Eclipse) eu nunca usei NetBeans mas deve ser mais ou menos a mesma coisa. Depois de criada as classes java basta vc criar o keystore e se conectar atraves das classes criadas…
De uma olhada no tutorial que eu coloquei na pagina anterior la tem o passo a passo pra consumir o web service da receita…
Eu desenvolvi aqui na minha empresa e depois escrevi esse passo a passo ai pra ajudar a galera… o meu aqui ta funcionando perfeitamente…
Segue ele ai, qq dúvida só perguntar
rafaelbtz
eu gerei o XML mas agora eu preciso fazer a assinatura digital… pelo que vi, suas dicas ja são para se comunicar com o webService…
como você fez só para fazer a assinatura Digital da NF-e?!?
abraco
rafaelbtzeu gerei o XML mas agora eu preciso fazer a assinatura digital… pelo que vi, suas dicas ja são para se comunicar com o webService…
como você fez só para fazer a assinatura Digital da NF-e?!?
abraco
Ola alves.Felipe,
assinatura do xml da nf-e eh esse codigo aki, nesse topico:
http://www.guj.com.br/posts/list/52035.java#576483
[]´s
Joao Luiz - Linux user #159951
GRATIS eh POUCO: http://www.gratisepouco.com.br
jluizsc…
estava vendo o codigo… e sobre seu certificado… como que vc fez?
nessa parte do código:
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(caminhoCertificado), senha.toCharArray());
esse caminhoCertificado é o .pfx? ou o .jks??
jluizsc…estava vendo o codigo… e sobre seu certificado… como que vc fez?
nessa parte do código:
KeyStore ks = KeyStore.getInstance("PKCS12"); ks.load(new FileInputStream(caminhoCertificado), senha.toCharArray());esse caminhoCertificado é o .pfx? ou o .jks??
Testo com um certificado q ionstalei no windows de um arquivo .pfx (registrado pelo serasa)
nesse trecho (copiado de outro colega daki e de alguns sites) carrego o cerficado informando a senha do certificado
[]´s
Joao Luiz - Linux user #159951
my space : http://www.myspace.com/jluizsc
GRATIS eh POUCO: http://www.gratisepouco.com.br
arquivo .pfx
O arquivo .jks é aqui:
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\certificados\\nfe.keystore");
PS. desculpe os dois posts é que eu cliquei sem querer
blz… esta assinando… mas onde vc’s estão validando o xml??
eu estou usando um validador do RS, o SEFAZ-RS…
e aparece a seguinte mensagem quando ele valida:
alguém já viu isso?? mas mesmo assim aparece todos os dados do certificado…tipo… o validador reconheceu na assinatura os dados do certificado…
essa parte usa para setar o certificado para fazer a comunicação com o ws??
Quando eu usava esse assinador ai dava um punhado de erro estranho mesmo… Crie seu próprio assinador, é só copiar e colar o código que o jluizsc colocou na primeira página deste tópico, aqui funcionou certinho…
Isso nessa parte vc coloca o certificado público do servidor que vc está acessando. Lembrando que são dois certificados o público que vc baixa na WEB e o privado que é seu e vc compra em alguns lugares…
Da uma olhada no tutorial que eu coloquei no final da primeira pagina deste post que la eu to explicando…
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.wsdlgenerating 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
cinglez boa tarde,
tambem segui os passos que o rafael passou e estou com o mesmo problema,
vc ja conseguiu solucionar?
grato!
Clayton Dias
Valeu pessoal…
a assinatura esta bombando… referente as mensagens de erro do validador SEFAZ-RS, descobri
que é por causa do certificado… pois eu sou do PR e o programa só aceita do RS…
vou começar a fazer consumir o WS…
abraco
Sim você precisa ter o certificado privado .pfx e o certificado público. Lembrando que exite certificado publico de Homologação e de Produção.
cinglez boa tarde,
tambem segui os passos que o rafael passou e estou com o mesmo problema,
vc ja conseguiu solucionar?
Está me parecendo que o NetBeans está tentando se conectar ao servidor do SEFAZ para poder gerar as classes Java, e pra isso vc deve precisar configurar os certificados no NetBeans (alguem que estenda melhor do NetBeans pode dar uma força pq eu nunca nem Vi o NetBeans). O Eclipse não se conecta ele simplesmente pega o arquivo WSDL e gera as classes Java, então no Eclipse para geração dos .java não precisa nem ter o certificado instalado.
Tentem instalar o Eclipse ai gerem os .java como eu falei depois colem os .java no NetBeans e faças o resto do NetBeans (é só um conselho)
Exato. Se vc apontar uma URL de um server remoto, o netbeans vai tentar a conexão com o sufixo ?wsdl para fazer o download do arquivo e depois realizar a geração. Como vc não está autenticado via SSL no servidor, não consegue obter o arquivo. Baixe o arquivo WSDL sozinho e gere seus clientes com base no arquivo local.
Senhores,
não sei se alguém passou por isso, mas consegui conectar e pegar os status das SEFAZ de SP, RS e BA sem problemas. No entanto, ao tentar em alguns outros, como por exemplo, CE ou AM, os WSDL não trazem referência às classes br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServicoSoap, apenas br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServico. Por usa vez, não conseguimos instanciar br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServico, pois é abstrata.
Alguém passou por isso?
Tb não encontrei em lugar algum referências aos webservices do RJ.
Se puderem me ajudar, agradeço.
Hum deve haver alguma divergência no WSDL… tem como vc postar o WSDL? não estou encontrando o do RJ…
Na verdade já encontrei o problema. A classe a ser instanciada para alguns estados é NfeStatusServico_Service, por isso a divergência. Quanto ao RJ, realmente ainda não encontrei. Nem mesmo no portal. Será que ainda não está publicado?
Pessoal, quanto à assinatura do XML utilizando o código postado aqui no fórum…
Sempre que envio uma NF assinada recebo a resposta 225 - falha do schema XML. Utilizando um software análogo, verifiquei que a diferença está no local onde é inserida a tag da assinatura. No nosso caso, está sendo inserida FORA da tag , ou seja, após esta, e no caso do outro software, está dentro desta Tag. Se manualmente coloco a assinatura dentro da tag NFe, a SEFAZ aceita o SCHEMA. Como podemos contornar este problema?
Desde já obrigado
Existe algum certificado digital para teste, tipo estou programando mas não tenho nenhum cliente ainda que vai usar a NFe mas eu queria ir adiantando o programa e fazer testes, para eu gerar a assinatura existe um certificado de teste?
Dario
infelizmente não existe…
Existe algum certificado digital para teste, tipo estou programando mas não tenho nenhum cliente ainda que vai usar a NFe mas eu queria ir adiantando o programa e fazer testes, para eu gerar a assinatura existe um certificado de teste?Dario
Existe sim. Neste link, tem um Download de um .pfx para vc poder fazer os testes.
Masss, masss…
Ele so serve pra assinar os documentos. Vai servir pra vc.
http://nf-eletronica.com/blog/?page_id=71
E’ o penultimo link, la em baixo.
- Muito bom o blog.
[ ]s,
Existe algum certificado digital para teste, tipo estou programando mas não tenho nenhum cliente ainda que vai usar a NFe mas eu queria ir adiantando o programa e fazer testes, para eu gerar a assinatura existe um certificado de teste?Dario
Existe sim. Neste link, tem um Download de um .pfx para vc poder fazer os testes.
Masss, masss…
Ele so serve pra assinar os documentos. Vai servir pra vc.http://nf-eletronica.com/blog/?page_id=71
E’ o penultimo link, la em baixo.
- Muito bom o blog.
[ ]s,
É na verdade eu me enganei mesmo… . Esses certificados são válidos para a assinatura, eu os conhecia, mas achei q o companheiro queria um válido para o SEFAZ, li errado… Dãaaa rs valeu pela correção
Muito obrigado,
Já me ajuda muito ter como testar a assinatura do documento pois como eu disse não tenho nenhum cliente ainda que fará a NFe mas quero deixar tudo pronto para quando eles se enquadrarem.
Outro fato, li que após gerar o arquivo de envio da NFe em .XML já assinado, posso validar ele com o esquema .XSD e verificar se existe possiveis erros de layout, isto é correto? se sim como proceder isto em JAVA?
Dario.
Opa, par ao primeiro, a maneir amais fácil é vc testar o documento assinado no aplicativo de SP.
Agora, para validar seu schema, dá uma olhada no pacote javax.xml.validation.
Pessoal, tenho um caso, da AM, que o XML está retornando com erro 999 - Rejei??o: Erro n?o catalogado. O que fazer nestes casos? Para os outros estados está ok!
Ola cinglez!
Infelizmente ainda existe alguns erros em algumas WS dos Estados. São erros não tratados que eles enviam essa mensagem.
Eu faço parte do Comite Nacional de Nota Fiscal Eletronica e SPED, e frequentemente falo com os gerentes de informatica de alguns estados, e isso ja está sendo corrigido, em alguns estados, por exemplo em Minas Gerais, alguns erros ja foram adicionados no catalago, erros esses que não existiam a alguns meses a traz, retornando entao 999.
O que temos que fazer é esperar e manter contato com o SEFAZ de cada estado, informando os problemas.
[ ]s,
Pessoal, talvez vcs possam me esclarecer uma dúvida.
Testando o NfeStatusServico dos SEFAZ, notei que o de SP se comporta um pouco diferente dos dos outros estados. Seguindo as dicas do rafaelbtz, gerei o keystore para a comunicação com o SEFAZ.
Para todos os estados, gerando em um ambiente, o keystore funciona sem problemas em qualquer outro ambiente, quero dizer, levo para outros locais, sistemas operacionais, certificados, digitais, e sempre funciona. Mesmo para o SEFAZ de homologação de SP, funciona sem problemas. Para o SEFAZ de produção de SP, ocorreu de ter que gerar novamente (exportando o certificado no IE) em alguns casos em algumas máquinas. Exportei novamente, e gerei o keystore novamente (usando o keytool). Neste caso, o keystore só funciona no ambiente em que foi gerado.
O engraçado é que só percebi isso com o SEFAZ de produção de SP.
Outro ponto que não compreendi é que ontem (07 de abril), todos os certificados dos SEFAZ de produção de SP tiveram que ser regerados, apesar de a data de validade ainda não ter sido vencida).
Alguém sabe o que eu posso estar fazendo de errado? Alguma dica?
Fora isso, aparentemente está tudo ok.
Desde já agradeço.
Carlos
Ola cinglex!
Muito estranho, nao passei por problemas assim, outras mas nao exatemente este.
Como vc esta gerando o keystore?
Qualquer coisa, siga os passos de um artigo no meu Blog:
http://mateusprado.com/blog/?p=12
[ ]s,
Olá,
na verdade, identifiquei parcialmente o problema. Mas não consigo entender.
Ao invés de fazer o download dos certificados no site do SEFAZ-SP, eu simplesmente exportei o certificado que é instalado automaticamente no Firefox quando acessamos o WebService (X.509 PEM), gerando um arquivo .cer. Este arquivo é utilizado para gerar a keystore com o keytool com o seguinte comando: “keytool -import -alias nfe -keystore xxxxxxxxx -file xxxxxxxxxxx”. Até aí, tudo bem. Funcionou pra todos os estados que eu precisei. Mas para o ambiente de produção de SP, houve algumas peculiariedades. Em alguns sites que estive tive que refazer o processo de exportação do certificado, etc, etc. No dia 07/04, TODOS os sites pararam de funcionar (mais uma vez, produção, SP), e tivemos que regerar tudo.
Ao tentar utilizar o certificado disponibilizado para download no site do SEFAZ-SP, aqui no meu escritório não funcionava em princípio. Por ser um arquivo p7b, eu o importava no firefox, para reexportá-lo no formato .cer. Gerava o keystore mas ao tentar a comunicação com o SEFAZ, dava erro.
Qual não foi a minha surpresa ao levar o notebook para casa e verificar que de lá funcionava? Mudei o roteamento aqui no escritório, em português claro, utilizei outro link de internet e passou a funcionar com o certificado baixado. No AJATO Empresas, não funciona. No Embratel, funciona. Não entendo nada do assunto, mas acho isso simplesmente bizarro, e gostaria que alguém pudesse me dar uma luz. Pelo Ajato, só funciona acessando o webservice com o browser e exportando o certificado que é instalado automaticamente. Não sei se fui claro, mas é exatamante isso que ocorre…
Desculpem pelo post muito longo…
Obrigado
É amigos, estou parado neste ponto realmente.
Já tentei de todas as formas regerar o keystore, mas realmente não entendo por que funciona por uma conexão e por outra não. Se alguém puder me ajudar, agradeço.
Abs
Estava seguindo esse topico, e estou tendo problemas com essa parte. Não consigo selecionar o WSDL, mesmo eu colocando o caminho para o arquivo em “service definition”, não consigo concluir o processo, pois aparece a mensagem “The service definition selected is invalid.”
Como eu não manjo muito de web services, deve ter algum passo antes desse que eu não estou fazendo e não estou sabendo o que é.
Alguem poderia me dar uma luz sobre o que é?
cara entra no endereço do ws e salva os wsdl… e a paritr desses vc cria os web services…
Se eu preencho o campo Service Definition com a url do web service da que eu quero, por exemplo https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico.asmx?wsdl, ele me mostra um erro " The service definition selected is invalid."
Testei com um outro wsdl de um site qualquer e funcionou, criou as classes java normalmente, ou seja, não deve ser problema do eclipse.
Tenho os wsdl que peguei no site aqui. Como eu faço essa conversão a partir deles? É só preencher o campo “Service Definition” com o caminho dele (por exemplo, c:\teste.wsdl) ou o procedimento é outro?
Consegui resolver.
Coloquei os wsdl num servidor Apache Axis e assim consegui gerar as classes java.
a classe NfeStatusServicoLocator não é gerada automaticamente, o que exatamente ela faz ?
abraço !
[size=14]Olá pessoal,
Apenas startei meu projeto NFe, bem atrasado e correndo atrás do prejuízo, vi neste tópico algumas dicas, mas
antes de entrar em alguns detalhes, gostaria de saber se alguém conseguiu baixar os arquivos WSDL do SEFAZ-BA
e se alguém tem desenvolvido em Linux, pois eu baixei o arquivo Associacao.pfx pra começar a fazer uns testes,
mas só vjo exemplos para win.
Rafael deu umas dicas q parecem ótimas, mas aqui no Ubuntu me perdi um pouco em como gerar, por exemplo, o
nfe.keystore.
Tenho muito a fazer ainda, mas gostaria de ter essas dicas, alguém? 
[/size]
[size=14]Olá pessoal,Apenas startei meu projeto NFe, bem atrasado e correndo atrás do prejuízo, vi neste tópico algumas dicas, mas
antes de entrar em alguns detalhes, gostaria de saber se alguém conseguiu baixar os arquivos WSDL do SEFAZ-BA
e se alguém tem desenvolvido em Linux, pois eu baixei o arquivo Associacao.pfx pra começar a fazer uns testes,
mas só vjo exemplos para win.Rafael deu umas dicas q parecem ótimas, mas aqui no Ubuntu me perdi um pouco em como gerar, por exemplo, o
nfe.keystore.Tenho muito a fazer ainda, mas gostaria de ter essas dicas, alguém?
[/size]
Apesar de usarmos Windows aqui, o keystore eu gerei no Ubuntu porque foi mais simples. Basta ter o Java instalado, abrir um terminal e digitar o comando que o Rafael Passou, mas precedido do comando sudo:
sudo keytool -import -alias nfe -keystore <caminho_para_um_keystore Ex: /home/pasta_do_usuario/nfe.keystore> -file <caminho_completo_para_o_cert_exportado_do_IE ( arquivo .cer)>
Might Angel,
Então, essa parte eu consegui fazer diferente, achei aqui mesmo no forum, n me lembro quem deu a solução,
mas no caso, usa o arquivo PFX de forma direta, sem precisar usar Keytool.
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;
}
}
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();
Este é um trecho do código.
Falew.
UpTheIrons
mas esse código vai ser vai para a assinatura certo?!?
e os passos usando o keytool é para fazer a comunicação com o ws…
Alves Felipe,
Sim vc está certo.
Na verdade, não cheguei nesta parte ainda (dos WebServices), tô no “início” de tudo,
bem atrasado eu sei, mas tentando 
Pessoal,
Segui todos os passos do tópico e consegui rodar a conexão.
Agora estou com outro problema, preciso que uma única execução do programa envie notas para diferentes clientes/empresas.
Há alguma forma de informar os parâmetros “javax.net.ssl.keyStoreType, javax.net.ssl.keyStore e javax.net.ssl.keyStorePassword” por thread???
Estou usando JAX-WS com jboss.
Att,
Fábio Viana
Ola, legal o codigo, parece que esta quase agora.
Seguinte, estava tendo mto problema com o famoso erro 403 mas acho q agora foi, mas apenas para confirmar, qual(is) certificados tenho q deixar no keystore final ?? Eu coloquei o Raiz e o meu exportado.
Agora pra mim nao aparece mais 403, agora so tenho “Caused by: java.net.ConnectException: Connection timed out: connect”.
Alguma ideia ???
Eu verifiquei na classe gerada pelo wsdl SP para verificar o status e o site é “https://homologacao.nfe.fazenda.sp.gov.br/nfeWEB/services/NfeStatusServico.asmx” (acho).
Preciso urgente de uma ajuda gente.
Abracos,
Magno
[email removido]
Bom dia gente, seguinte, ja tentei de td qto é jeito e agora eu caí no problem em: “HTTP Error 403.7 - Forbidden: SSL client certificate is required”. Alguem poderia me ajudar.
Eu importei no IE os certificados associacao e condominio de testes (ja testei com ambos e nada) e exportei de volta para .cer, entao importei SEFAZSP_homologacao.p7b e exportei a Raiz para .cer (tem q ser algum outro ou mais de um??) e dai adicionei no mesmo keystore o cliente+raiz, mas nada, agora o erro é esse q falei.
Alguma dica ??
Meu codigo:
public static void main(String[] args) {
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","D:\\Desenvolvimento\\Nota-e\\certificados_nfe\\Certificados\\Condominio.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "condominio");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "D:\\Desenvolvimento\\Nota-e\\Certificados_NFe_SefazSP\\v01.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "xxx");
NfeStatusServico service = new NfeStatusServicoLocator();
try {
NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));
} catch (Throwable e1) {
e1.printStackTrace();
}
}
E outra pergunta, meu cliente ja possui um A3, mas o servidor deles nao sera no cliente em si, entao como seria um sistema em java mesmo para acessar o cartao com um leitor? Onde teria q ficar o leitor? Seria bem mais aconselhavel nesse 1o. momento usarmos o A1 q seria o arquivo “simples” mesmo ??
Abracos,
Magno
[email removido] (email e msn)
Olá pessoal,
Nossa… qntos problemas variados… pena que o meu não é igual =/
Bom… antes…
magno_jr
Acredito que o seu erro é porque a SEFAZ não achou um certificado registrado no servidor deles para, ou seja, a forma como “Condominio” é passado deve ser diferente para que eles achem o certificado do lado deles…
Deve ser isso, porque para usar o serviço é preciso registrar o certificado na SEFAZ, como Condominio e Associacao são certificados de teste que disponibilizam, eles devem estar cadastrados… então, so nos resta a forma de passar essa infomação para o WS…
Espero que ajude…
Aproveitando… ^^
Estou com um problema um pouco antes de você… justamente na montagem dos parâmetros CabecMsg e DadosMsg…
Ao converter os XSD ganhei as classes CabecMsg.java e TConsStatServ.java, que olhando o código delas demonstram terem a finalizadade para montar as msg… mas estou com um erro na hora de fazer o marshall
Para não desviar muito este post, creiei um para o assunto em http://www.guj.com.br/posts/list/134641.java#724376, se alguem puder dar um help, agradeço muito.
Uma dica em relação ao NFe, eu baixei o programa da SEFAZ, o tal “Emissor de Nota Fiscal Eletronica (NF-e)”… no que ele me ajudou ??? Após gerar o XML, Assinar e Validar pelo meu software, importei o XML assinado para ele, onde consigo mais detalhes sobre exceções de preenchimento que posso usar na hora de montar o XML e também, posso usar ele para testar o envio para a SEFAZ… que até o momento estou só recebendo “time out” Ô,o
Fui !
Bom dia gente, seguinte, ja tentei de td qto é jeito e agora eu caí no problem em: “HTTP Error 403.7 - Forbidden: SSL client certificate is required”. Alguem poderia me ajudar.
Eu importei no IE os certificados associacao e condominio de testes (ja testei com ambos e nada) e exportei de volta para .cer, entao importei SEFAZSP_homologacao.p7b e exportei a Raiz para .cer (tem q ser algum outro ou mais de um??) e dai adicionei no mesmo keystore o cliente+raiz, mas nada, agora o erro é esse q falei.
Agora cheguei neste mesmo problema… segue trechos da minha mensagem de erro…
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
...
at br.inf.portalfiscal.www.nfe.wsdl.NfeStatusServico.NfeStatusServicoSoapStub.nfeStatusServicoNF(NfeStatusServicoSoapStub.java:110)
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
at sun.security.validator.Validator.validate(Validator.java:203)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
... 25 more
...
Qualquer novidade aviso!
Olá pessoal!
Alguém obteve esse erro e sabe o que pode ser?
com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:146)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:122)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:226)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:189)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:159)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:83)
at javax.xml.ws.Service.<init>(Service.java:56)
at br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServico.<init>(NfeStatusServico.java:46)
at br.orquestra.nfe.ClientConnection.getStatusServico(ClientConnection.java:66)
at br.orquestra.nfe.ClientConnection.main(ClientConnection.java:87)
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:179)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:199)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:178)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at br.orquestra.nfe.ClientConnection.main(ClientConnection.java:104)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at java.security.Provider$Service.newInstance(Provider.java:1245)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
... 13 more
Caused by: java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1277)
at java.security.KeyStore.load(KeyStore.java:1185)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:150)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at java.security.Provider$Service.newInstance(Provider.java:1221)
... 20 more
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.PKCS12PBECipherCore.b(DashoA13*..)
at com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndRC2_40.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1274)
... 30 more
{http://xml.apache.org/axis/}hostname:ft-304
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:154)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at br.orquestra.nfe.ClientConnection.main(ClientConnection.java:104)
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:179)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:199)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:178)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
... 10 more
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at java.security.Provider$Service.newInstance(Provider.java:1245)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
at org.apache.axis.components.net.JSSESocketFactory.initFactory(JSSESocketFactory.java:61)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:79)
... 13 more
Caused by: java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1277)
at java.security.KeyStore.load(KeyStore.java:1185)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.getDefaultKeyManager(DefaultSSLContextImpl.java:150)
at com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at java.security.Provider$Service.newInstance(Provider.java:1221)
... 20 more
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.PKCS12PBECipherCore.b(DashoA13*..)
at com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndRC2_40.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1274)
... 30 more
Eu segui o passo-a-passo postado e gerei o seguinte código:
public NfeStatusServicoSoap getStatusServico()
{
try{
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:\\Orquestra\\Certificado\\Associacao.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\Orquestra\\Certificado\\exportadonfe.keystore");
Properties props = System.getProperties();
props.put("Dhttp.proxyHost", "ISA");
props.put("Dhttp.proxyPort", "8080");
System.setProperty("http.proxyUser", "usuario");
System.setProperty("http.proxyPassword", "senha");
URL url = new URL(local);
//url.openConnection(new Proxy(type, sa))
QName qname = new QName("NFeStatusServico.asmx");
NfeStatusServico service = new NfeStatusServico(url, qname);
NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));
return nfeStatus;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
O Associacao.pfx eu baixei do site da receita. Exportei o certificado pelo IE e usei o KeyTool.
Obrigado!
Marck
Me aprece ser algo errado no caminho… como “NFeStatusServico.asmx?wsdl”, como vc esta usando ISA ainda… tenta acessar pelo browser e ve se esta tudo certo antes de por no código.
magno_jr
Ola, legal o codigo, parece que esta quase agora.
Seguinte, estava tendo mto problema com o famoso erro 403 mas acho q agora foi, mas apenas para confirmar, qual(is) certificados tenho q deixar no keystore final ?? Eu coloquei o Raiz e o meu exportado.
Agora pra mim nao aparece mais 403, agora so tenho “Caused by: java.net.ConnectException: Connection timed out: connect”.
Alguma ideia ???
Pelo que andei lendo sobre certificados… você precisa deixar no keystore apenas o certificado Publico (.cer) do seu certificado privado…
Por exemplo… se estiver usando o Associacao.pfx, após exportar o .cer dele… importa esse .cer para o seu keystore.
Não sei se isso da certo, porque tb estou com o erro 403 maledito…
HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)</h2>
Só falta ter que instalar o IIS aki e ter que configurar o certificado nele… já não bastasse o trampo para configurar no JRE…
Acho que estou no caminho errado… porque já esta ficando muito complexo o treco… hehe
Fui !
Entao, ja testei de td qto é jeito e nao vai de jeito nenhum. Quinta feira agora vou conseguir um certificado “certo”, dai vamos ver.
To torcendo pra q funcione com o certificado. Eu vi em algum canto q nao lembro onde q os certificados Associacao e Condominio vc so consegue utilizar caso seja pelo programa deles, e nao pelo webservice. Mas nao a informacao nao era nada oficial.
Se tiver novidade eu te aviso.
E valeu pelas respostas.
Magno
Acabei de publicar uma notícia sobre o Caelum Stella NFe. Estamos procurando contribuidores para ajudar a finalizar o desenvolvimento.
Alguem tem algum simples exemplo de como utilizar o webservice de cadconsultacadastro e/ou NfeRecepcao ??
Eu consegui fazer funcionar o status serviço, mas esses outros 2 nao vai de jeito nenhum.
Obrigado,
Magno
[email removido]
Alguem tem algum simples exemplo de como utilizar o webservice de cadconsultacadastro e/ou NfeRecepcao ??
Eu consegui fazer funcionar o status serviço, mas esses outros 2 nao vai de jeito nenhum.Obrigado,
Magno
[email removido]
Aqui funcionou normal, é só fazer do mesmo jeito que o outro, só que usando as classes para recerpção. Na variavel nfeCabecMsg passe o cabeçalho e na variavel nfeDadosMsg a string XML da nota ja assinada.
Qual o erro que esta dando aí?
Aproveitando,
Meu programa para enviar para o ambiente de homologação esta funcionando certinho, sem problemas.
Meu medo esta em dar algum erro inesperado quando for mudar para o ambiente de produção, afinal não tem como “testar” o ambiente de produção. Alguém aqui ja passou por essa mudança e pode dizer se foi simples? é só alterar as classes para usar os wsdl do ambiente de produção e o certificado de mesmo ambiente?
Eu tentei acessar o ambiente do produção para verificar o status do serviço fazendo só as alterações que eu disse aí em cima, mas esta me retornando um erro “unable to find valid certification path to requested target”. Estou assumindo que esse erro ocorre porque ainda não estou autorizado a usar o ambiente de produção. Alguém sabe se é por isso mesmo?
Pessoal, estou precisando de uma ajuda importantissima!
Eu entrei em modo de produção na sexta-feira. Tudo funcionou certinho, até ontem no final da tarde, quando o programa simplesmente se recusa a aceitar o keystore com os certificados do ambiente de produção!
Quando tento transmitir algo, recebo o erro:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at org.apache.axis.components.net.JSSESocketFactory.create(JSSESocketFactory.java:186)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:404)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at br.inf.portalfiscal.www.nfe.wsdl.NfeStatusServico.NfeStatusServicoSoapStub.nfeStatusServicoNF(NfeStatusServicoSoapStub.java:110)
at main.Principal.main(Principal.java:236)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 23 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 29 more
É como se o keystore não fosse mais valido. E isso foi do nada, pois não alterei absolutamente nada no meu código.
Ja tentei gerar o keystore novamente, inclusive por metodos diferentes do ensinado nesse topico, e nada…
Alguem pode dar uma luz??
Consegui resolver o problema q eu tinha mencionado acima… como pode ser util para mais alguem, vou postar como resolvi:
Aparentemente, o SEFAZ de SP passou a exigir mais certificados para a conexao com o webservice, alem daquele do ambiente de produção disponivel para download. O que eu fiz foi pegar todos os certificados do repositório do windows que eram da Certisign e da Autoridade certificadora brasileira (eu tinha 29 desses instalados) e importar para o keystore q eu estava usando como truststore, e deu certo.
Muito provavel que não seja necessario importar todos esses certificados, mas, na duvida coloquei tudo q eu tinha
Alguem mais ja teve esse problema ??? O q fizeram ???
Enviei uma nota fiscal pelo sistema gratuito do sefaz pelo sistema de teste e funcionou perfeitamente. Entao exportei/importei para o sistema de producao e enviei a NFe mas ela consta faz umas 2 horas ja como “em processamento”, e se tento consultar pela Chave via web o status diz q essa NFe nao consta no Sefaz.
Alguem poderia me ajudar por favor ??
Grato,
Magno
[email removido]
Senhores, estou com problemas na hora de fazer a comunicacao.
com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: Connection timed out: connect
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:142)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
Ja Baixei, os WSDL gerei as classes Java e estou usando o seguinte codigo:
//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.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", new File("").getAbsolutePath() +
"\\certificados\\nfe.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "senha");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStore",
new File("").getAbsolutePath() + "\\certificados\\certificadoA1.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "senha");
// As classes abaixo são as classes geradas atavés do arquivo WSDL no passo 1
NfeStatusServico_Service service = new NfeStatusServico_Service();
NfeStatusServico nfeStatus = service.getNfeStatusServico();
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));// O retorno deve ser um XML com o status do serviço
return nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg);
se alguem puder me ajudar, agradeco muito.
Lembrei que quando gerei as classes a partir do wsdl ele gerou as seguintes classes:
NfeStatusServico.java
NfeStatusServicoNF.java
NfeStatusServicoNFResponse.java
NfeStatusServico_Service.java
ObjectFactory.java
package-info.java
No exemplo que eu peguei aqui mesmo no Guj usavam as seguintes classes:
NfeStatusServico
NfeStatusServicoLocator
NfeStatusServicoSoap
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();
}
Como nao foram geradas as classes NfeStatusServicoSoap e NfeStatusServicoLocator eu as substitui por NfeStatusServico e NfeStatusServico_Service respectivamente, visto que contem os mesmos metodos.
Sera que pode ser este o motivo?
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
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:-file , esse comando irá gerar um arquivo que no exemplo é c:\\certificados\\nfe.keystore É 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.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 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)
Realmente entre todas as que vi sobre NF-e esse é o melhor post de todos.
Uma pergunta, peguei seu código só que tem um problema, eu não tenho o certificado do cliente (arquivo .pfx) mas preciso fazer o teste no ambiente de homologação.
Como fazer? Meu problema está no No.1 e no No.2 no meu código:public void statusServico() {
//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");
// No.1) Aqui vem o arquivo do certificado do seu cliente
System.setProperty("javax.net.ssl.keyStore", "C:\\certificados\\cert.pfx");
// No.2) Aqui a senha deste certificado
System.setProperty("javax.net.ssl.keyStorePassword", "SENHA DO CERTIFICADO");
// No.3) Aqui vem o arquivo criado através do comando keytool no passo 3
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\Projetos\\Desktop\\KNFe\\nfe.keystore");
// No.4) As classes abaixo são as classes geradas atavés do arquivo WSDL no passo 1
NfeStatusServico service = new NfeStatusServico();
try {
NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
// O retorno deve ser um XML com o status do serviço
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));
} catch (Throwable e1) {
e1.printStackTrace();
}
}
Ola PessoalEu 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 = “<a href="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">http://www.w3.org/TR/2001/REC-xml-c14n-20010315</a>”;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.<em>; import javax.xml.crypto.dsig.</em>; import javax.xml.crypto.dom.<em>; import javax.xml.crypto.dsig.keyinfo.</em>;/**
A
KeySelectorthat returns {@link PublicKey}s of trustedThis
KeySelectoruses the specifiedKeyStoreto find a trusted
X509Certificatethat matches informationspecified in the {@link KeyInfo} passed to the {@link #select} method.
The public key from the first match is returned. If no match,
nullis returned. See theselectmethod for moreinformation.
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
keyStoreisnull
*/
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
digitalSignaturebit and- matches an
X509Certificatein theKeyStore.- X509Data X509IssuerSerial: if the serial number and issuer DN match an
X509Certificatein theKeyStore.- X509Data X509SubjectName: if the subject DN matches an
X509Certificatein theKeyStore.- X509Data X509SKI: if the subject key identifier matches an
X509Certificatein theKeyStore.- 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 benull)- @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
XMLCryptoContextthat 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 (
nullshould 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
WEB : http://site.pop.com.br/jluizsc
my space : http://www.myspace.com/jluizsc
GRATIS eh POUCO: http://br.geocities.com/jluizsc (explicacoes orolix)
GRATIS eh POUCO 2 : http://www.crescenet.dahora.net (explicacoes crescenet)
Usei seu código para assinar um lote de notas fiscais mas ele assinou a tag enviNFe e não cada NFe.
Veja a imagem do XML (no NB):

O que tenho que mudar para ele assinar a tab NFe?
Cara… naum sei se é a forma correta de fazer, mas, eu assinei cada nota individualmente e depois só inseri elas no xml do lote.
Tah funcionando normal aqui.
Poderia mostrar parte do código que faz isso?
Você pega XML de notas separadas e junta no XML de lote ou você pega um XML de lote e vai lendo as notas separadas e assinando e depois grava em outro XML?
Cara eh o seguinte, gero os arquivos de todas as notas separadamente, depois leio estes aquivos e gravo o conteudo dos arquivos em uma variavel string.
Envio esta variavel como argumento do metodo abaixo.
public static String geraXmlEnvNfe(String xmlNFe, String idLote){
String xmlEnviNfe = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<enviNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"1.10\">"
+ "<idLote>" + idLote + "</idLote>"
+ xmlNFe
+ "</enviNFe>";
//aqui eu gravo o arquivo
MetodosGenericos.GravaArquivoCp1252NaPastaDaAplicacao(xmlEnviNfe, "\\xml-resources\\envio\\" + idLote + "-env-lot.xml");
//retorno o local do arquivo gerado
return MetodosGenericos.getAplicationFolder() + "\\xml-resources\\envio\\" + idLote + "-env-lot.xml";
}
espero ter ajudado
Pessoal,
Estou tentando consultar o status do serviço, mas ainda não obtive exito ao consumir o webservice…
Segue abaixo meu código:
public void getStatusServico() throws Exception
{
//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:\\work\\erp\\nfe\\certificado\\CD.pfx");//Aqui vem o arquivo do certificado do seu cliente
System.setProperty("javax.net.ssl.keyStorePassword", "cd9431");//Aqui a senha deste certificado
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\work\\erp\\nfe\\certificado\\kpalmieri.jks");//Aqui vem o arquivo criado através do comando keytool no passo 3
try
{
// As classes abaixo são as classes geradas atavés do arquivo WSDL no passo 1
NfeStatusServico service = new NfeStatusServico();
NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));// O retorno deve ser um XML com o status do serviço
}
catch (Exception erro)
{
erro.printStackTrace();
}
}
O Erro que eu obtenho é o seguinte:
SEVERE: A WebService annotation is not present on class: java.net.URL
SEVERE: at com.sun.xml.ws.modeler.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:218)
SEVERE: at com.sun.xml.ws.client.ServiceContextBuilder.processAnnotations(ServiceContextBuilder.java:169)
SEVERE: at com.sun.xml.ws.client.ServiceContextBuilder.build(ServiceContextBuilder.java:82)
SEVERE: at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:117)
SEVERE: at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:50)
SEVERE: at javax.xml.ws.Service.<init>(Service.java:57)
SEVERE: at br.com.startsoftware.webservice.NfeStatusServico.<init>(NfeStatusServico.java:44)
SEVERE: at br.com.startsoftware.dwr.NFeDWR.getStatusServico(NFeDWR.java:46)
SEVERE: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
SEVERE: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
SEVERE: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
SEVERE: at java.lang.reflect.Method.invoke(Method.java:597)
SEVERE: at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
SEVERE: at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
SEVERE: at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
SEVERE: at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
SEVERE: at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
SEVERE: at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
SEVERE: at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
SEVERE: at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
SEVERE: at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
SEVERE: at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:431)
SEVERE: at org.apache.catalina.core.StandardWrapperValve.preInvoke(StandardWrapperValve.java:462)
SEVERE: at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:139)
SEVERE: at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:186)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
SEVERE: at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:96)
SEVERE: at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
SEVERE: at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:187)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
SEVERE: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651)
SEVERE: at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
SEVERE: at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:142)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
SEVERE: at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
SEVERE: at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651)
SEVERE: at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
SEVERE: at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
SEVERE: at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:242)
SEVERE: at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
SEVERE: at com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:633)
SEVERE: at com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:570)
SEVERE: at com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:827)
SEVERE: at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152)
SEVERE: at com.sun.enterprise.v3.services.impl.GlassfishProtocolChain.executeProtocolFilter(GlassfishProtocolChain.java:71)
SEVERE: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:103)
SEVERE: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:89)
SEVERE: at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
SEVERE: at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67)
SEVERE: at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56)
SEVERE: at com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:325)
SEVERE: at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184)
O que pode ser? Alguem poderia me dar uma luz por favor? Desde já agradeço a atenção prestada… Obrigado!
Algúem já desenvolveu para NFe2 com JAX-WS ?
Consegui resolver, segue:
- Baixe o Apache AXIS para gerar as classes a partir do WSDl, http://ws.apache.org/axis2/download.cgi
- Depois de descompactar, execute dentro da pasta BIN “/wsdl2java.sh -uri NFeStatusServico2.wsdl” (Linux)
- Copie os fontes para a pasta do projeto, inclua as bibliotecas do Apache AXIS no projeto
NfeStatusServico2Stub stub = new NfeStatusServico2Stub();
NfeStatusServico2Stub.NfeDadosMsg dados = new NfeStatusServico2Stub.NfeDadosMsg();
String s = "<consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"+
"<tpAmb>2</tpAmb>"+
"<cUF>43</cUF>"+
"<xServ>STATUS</xServ>"+
"</consStatServ>";
OMElement el = AXIOMUtil.stringToOM(s);
dados.setExtraElement(el);
NfeStatusServico2Stub.NfeCabecMsg cab = new NfeStatusServico2Stub.NfeCabecMsg();
cab.setVersaoDados("2.00");
cab.setCUF("43");
NfeStatusServico2Stub.NfeCabecMsgE cabE = new NfeStatusServico2Stub.NfeCabecMsgE();
cabE.setNfeCabecMsg(cab);
System.out.println(stub.nfeStatusServicoNF2(dados , cabE).getExtraElement());
olá pessoal descumpem atravesar …
e que estou com um problema aparentemente ridiculo
estou fazendo NFe usando jaxb na verdade terminei porem estou com um problema
Criei a classe raiz NFe em “N” em mausculo conf ex:
@XmlRootElement
public class NFe {
public NFe(){}
public NFe(String xmlns,infNFe infNFe)
{
this.infNFe = infNFe;
this.xmlns = xmlns;
}
@XmlAttribute(name ="xmlns")
private String xmlns;
private infNFe infNFe;
porem guando gero a NFe sai minusculo…
já fiz refiz e não acho o problema fiz uns teste e pude ver que todos os doc… xml que gero com jaxb
sai a primeita letra minusca alguem sabe o que devo fazer ?
exemplo de saida NFe.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<nFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe35100369348936000104551000000578591367169950" versao="2.00">
<ide>
Em pessoal …
O que vcs estão usando para gerar o XML .
Encontrei várias bibliotecas : JDOM / Xerces / JAXP
Mas não sei qual é melhor para o problema em questão .
olá pessoal descumpem atravesar …
e que estou com um problema aparentemente ridiculoestou fazendo NFe usando jaxb na verdade terminei porem estou com um problema
Criei a classe raiz NFe em “N” em mausculo conf ex:@XmlRootElement public class NFe { public NFe(){} public NFe(String xmlns,infNFe infNFe) { this.infNFe = infNFe; this.xmlns = xmlns; } @XmlAttribute(name ="xmlns") private String xmlns; private infNFe infNFe;porem guando gero a NFe sai minusculo…
já fiz refiz e não acho o problema fiz uns teste e pude ver que todos os doc… xml que gero com jaxb
sai a primeita letra minusca alguem sabe o que devo fazer ?exemplo de saida NFe.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <nFe xmlns="http://www.portalfiscal.inf.br/nfe"> <infNFe Id="NFe35100369348936000104551000000578591367169950" versao="2.00"> <ide>
CONSEGUIIIIIIIIIIIIIIII !!!
ufa!!
a solução foi atribuir (name=“NFe”) na definição do root element
conf exp…
@XmlRootElement (name="NFe")
public class NFe {
public NFe(){}
public NFe(String xmlns,infNFe infNFe)
{
this.infNFe = infNFe;
this.xmlns = xmlns;
}
@XmlAttribute(name ="xmlns")
private String xmlns;
private infNFe infNFe;
Em pessoal …
O que vcs estão usando para gerar o XML .
Encontrei várias bibliotecas : JDOM / Xerces / JAXP
Mas não sei qual é melhor para o problema em questão .
Irmão Tiver esse mesmo problema que vc passei por quasse todas as ferramentas fiz uma aplicação toda em XStream
achei que tava bom quando foi pra salvar doc.xml o xStream não se mostrou tão bom …
JDom SAX fiz em todos …
mais eu queria JAXB …
achei esse Tutorial
http://www.devmedia.com.br/articles/viewcomp.asp?comp=11547
que salvo meu projeto minha ultima duvida consegui resolver…
Na minha Opinião Eu usaria Jaxb… “na meu caso foi o que fiz”
acho melhor para trabalhar com schema …
porem vc tem um leque de ferramentas …
faça esse tutorial do link que te passei…
antes de mais nada…
boa sorte …
Alguém ja montou a NFe do destinátario??
eu montei a nfe do destinatário , mas quando valido da um erro loco…
org.xml.sax.SAXParseException: Identity Constraint error: identity constraint "KeyRef@1d15445" has a keyref which refers to a key or unique that is out of scope.
se alguém tiver alguma dica…
alguem sabe de algum validador para o layout 2?
abraco
Validador: http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx
então… esse ai passa batido…não pega o problema…
o problema esta ligado a tag infProt… no schema esta assim… mas não consigo fazer funcionar ainda…
<xs:sequence>
<xs:element name="NFe" type="TNFe">
<xs:key name="Id_NFe">
<xs:selector xpath="NFe/*"/> //elemento que contem chave
<xs:field xpath="infNFe"/> //campo que vai ser a chave
</xs:key>
</xs:element>
<xs:element name="protNFe" type="TProtNFe">
<xs:keyref name="Id_Prot" refer="Id_NFe">
<xs:selector xpath="protNFe/*"/> //elemento que "recebe" a chave
<xs:field xpath="infProt"/> //campo que vai ser a referencia da chave
</xs:keyref>
</xs:element>
</xs:sequence>
consegui arrumar… na verdade eu estava usando o pacote de schema PL_006preC ai baixei o PL_006e e ai foi na boa…
pq no 6e não tem essa chave de referencia que tem no 6c…
acho que os caras tinham meio q se perdido com o schema e o layout…
Pessoal estou tentando fazer client pro webservice statusservico, estão sendo gerados 6 arquivos como havia lido neste tópico, mas não está sendo gerada a classe NfeStatusServicoLocator(), gostaria de saber o por que e qual a finalidade desta classe, estou seguindo um exemplo de código postado neste tópico, as classes geradas são :
NfeStatusServicoNF.java
NfeStatusServicoNFResponse.java
NfeStatusServicoSoap.java
ObjectFactory.java
package-info.java
segue o meu código
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.10</versaoDados>" + "</cabecMsg>";
String nfeDadosMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<consStatServ " + " versao=\"1.10\"" + " xmlns=\"http://www.portalfiscal.inf.br/nfe\">" + "<tpAmb>2</tpAmb>" + "<cUF>15</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", "PKCS11");
System.setProperty("javax.net.ssl.keyStore", "C:\\certificados\\RA.cer");//Aqui vem o arquivo do certificado do seu cliente
System.setProperty("javax.net.ssl.keyStorePassword", "oagb2010");//Aqui a senha deste certificado
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "C:\\certificados\\certificado.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(); <---esta não é gerada!
System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));// O retorno deve ser um XML com o status do serviço
} catch (Throwable e1) {
e1.printStackTrace();
}
}
Outro jeito de vizualisar e imprimir a NFe sem ter que instalar programa algum é utilizar o WebDANFE ( http://www.webdanfe.com.br ) WebDANFE . Basta arrastar o arquivo XML para este site que ele gera o PDF da NFE.
cara entra no endereço do ws e salva os wsdl.. e a paritr desses vc cria os web services...
Poderia me dar uma luz de como fazer isso?
Eu baixei os WSDL e gerei apenas o de status do serviço com o Axis2 mas acho que não foi gerado corretamente.
Foram geradas 2 classes: NfeStatusServico2CallbackHandler e NfeStatusServico2Stub
Não consigo verificar o status do serviço com essas classes, segue o código:NfeStatusServico2Stub stub = new NfeStatusServico2Stub();
NfeStatusServico2Stub.NfeDadosMsg dados = new NfeStatusServico2Stub.NfeDadosMsg();
String cUF = "35"; // SP
String tipoAmbiente = "1"; //1=homologacao, 2=producao
String s = ""
+ "<consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
+ " <tpAmb>" + tipoAmbiente + "</tpAmb>"
+ " <cUF>" + cUF + "</cUF>"
+ " <xServ>STATUS</xServ>"
+ "</consStatServ>";
OMElement el = AXIOMUtil.stringToOM(s);
dados.setExtraElement(el);
NfeStatusServico2Stub.NfeCabecMsg cab = new NfeStatusServico2Stub.NfeCabecMsg();
cab.setVersaoDados("2.00");
cab.setCUF(cUF);
NfeStatusServico2Stub.NfeCabecMsgE cabE = new NfeStatusServico2Stub.NfeCabecMsgE();
cabE.setNfeCabecMsg(cab);
String status = stub.nfeStatusServicoNF2(dados, cabE).getExtraElement().toStringWithConsume(); // Erro aqui...
System.out.println("Status: "+status);
org.apache.axis2.AxisFault: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:203)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at emissor.webservices.status2.NfeStatusServico2Stub.nfeStatusServicoNF2(NfeStatusServico2Stub.java:174)
at emissor.lib.NFe.statusServico(NFe.java:65)
Consegui resolver, segue:1. Baixe o Apache AXIS para gerar as classes a partir do WSDl, http://ws.apache.org/axis2/download.cgi
2. Depois de descompactar, execute dentro da pasta BIN "/wsdl2java.sh -uri NFeStatusServico2.wsdl" (Linux)
3. Copie os fontes para a pasta do projeto, inclua as bibliotecas do Apache AXIS no projetoNfeStatusServico2Stub stub = new NfeStatusServico2Stub(); NfeStatusServico2Stub.NfeDadosMsg dados = new NfeStatusServico2Stub.NfeDadosMsg(); String s = "<consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"+ "<tpAmb>2</tpAmb>"+ "<cUF>43</cUF>"+ "<xServ>STATUS</xServ>"+ "</consStatServ>"; OMElement el = AXIOMUtil.stringToOM(s); dados.setExtraElement(el); NfeStatusServico2Stub.NfeCabecMsg cab = new NfeStatusServico2Stub.NfeCabecMsg(); cab.setVersaoDados("2.00"); cab.setCUF("43"); NfeStatusServico2Stub.NfeCabecMsgE cabE = new NfeStatusServico2Stub.NfeCabecMsgE(); cabE.setNfeCabecMsg(cab); System.out.println(stub.nfeStatusServicoNF2(dados , cabE).getExtraElement());
Amigo tentei o seu código mas sempre me dá um java.lang.NullPointerException nessa linha que você manda imprimir o stub, o que pode ser? Eu mudei só um pouquinho porque minha UF é 35 (SP):
NfeStatusServico2Stub stub = new NfeStatusServico2Stub();
NfeStatusServico2Stub.NfeDadosMsg dados1 = new NfeStatusServico2Stub.NfeDadosMsg();
String s1 = "<consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
+ "<tpAmb>1</tpAmb>"
+ "<cUF>35</cUF>"
+ "<xServ>STATUS</xServ>"
+ "</consStatServ>";
OMElement el1 = AXIOMUtil.stringToOM(s1);
dados.setExtraElement(el1);
NfeStatusServico2Stub.NfeCabecMsg cab1 = new NfeStatusServico2Stub.NfeCabecMsg();
cab1.setVersaoDados("2.00");
cab1.setCUF("35");
NfeStatusServico2Stub.NfeCabecMsgE cabE1 = new NfeStatusServico2Stub.NfeCabecMsgE();
cabE.setNfeCabecMsg(cab1);
System.out.println(stub.nfeStatusServicoNF2(dados1, cabE1).getExtraElement());
amigo
de onde veio esse arquivo pfx ???
e o wsdl, para curitiba, voce tem conhecimento ?
obrigado
pfx é o seu certificado digital (A1)
http://www.sped.fazenda.pr.gov.br/modules/conteudo/conteudo.php?conteudo=49
qual versão baixar ?
ainda não entendi o que fazer com esse wsdl ?
devo baixar e salvar como xml ?
importar no eclipse ?
e o pfx, o que tem a ver ?
não esta claro o que fazer
está complicado
na versão 1.10
1º link, recepção, copiando e colando no browser
https://homologacao.nfe.fazenda.pr.gov.br/NFENWebServices/services/nfeRecepcao
no internet explorer não abre
no firefox pede pra adicionar um certificado, eu adiciono, e dae da a seguinte mensagem no browser
Falha na conexão segura
Ocorreu um erro durante uma conexão com homologacao.nfe.fazenda.pr.gov.br.
O sistema remoto SSL não esperava uma mensagem do processo de handshake que recebeu.
(Código do erro: ssl_error_handshake_unexpected_alert)
* A página que você está tentando abrir não pode ser exibida porque a autenticidade dos dados recebidos não pôde ser comprovada.
* Por favor, contate os responsáveis pelo site para informá-los sobre este problema. Você também pode usar comando localizado no menu Ajuda para reportar o site como incompatível.
da uma lida ai
http://www.guj.com.br/posts/list/52035.java#581090
Amigo, por partes.
Olha só, o WSDL é o modelo das classes dos Webservices que você vai usar.
Para criar as classes a partir dos WSDL você usar o Apache CFX depois você usa a classe já pronta somente para fazer o acesso ao Webservice, passando os devidos argumentos.
Um outro exemplo é usar o próprio wsimport que já está no java 6:
=========== Gerando as classes do WebService
Para quem utiliza o Java 6, existe um utilitário chamado wsimport, muito bacana, que
já gera as classes para acessar o WebService da Sefaz.
Uma das vantagens do wsimport é que não precisa enviar outros .jars pois a tecnologia
de acesso já está no java 6.
wsimport -keep -p nome.pacote.homologacao.status NfeStatusServico.wsdl
qual import devo dar para este metodo ?
não esta achando a linha 14
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
import java.security.Security;
Use uma IDE que te ajuda nisso.
continua com erro
agora só no
new com.sun.net.ssl.internal.ssl.Provider()
Informe o erro inteiro, todo o StackTrace do Exception.
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Access restriction: The constructor Provider() is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\jsse.jar
Access restriction: The type Provider is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\jsse.jar
at br.inf.portalfiscal.www.nfe.wsdl.NfeStatusServico.Iniciar.main(Iniciar.java:14)
estou usando o eclipse galileo !
já tentei adicionar esse jsse.jar no meu projeto mas continua com o mesmo erro !
consegui resolver o problema do erro
agora só falta um arquivo pfx para eu testar
alguem pode disponibilizar um para teste ?
…
se eu renomear o arquivo jsse.jar da pasta jre6\lib para jsse2.jar e importar o jsse.jar par ao meu projeto funciona
e mesmo com esse jar no meu projeto, ao renomear para jsse.jar no jre6\lib, dae continua dando erro
eu hein, o java tá loco !!!
rsrssrrsrssrrs
Como assim arquivo .pfx?
Que arquivo pfx você precisa?
o rafaelbtz fala na 1º pagina do forum que recebeu um .pfx do cliente …
e no código postado ele chama esa .pfx
Nesse caso o arquivo .pfx se refere a um Certificado Digital tipo A1, você precisa que seu cliente adquira esse certificado para que você possa usar no ambiente de Homologação (ou pode ser um tipo A3, muito mais complicado para implantar).
Para fazer essa comunicação você precisa basicamente de duas "coisas" o certificado do cliente devidamente cadastrado no órgão emissor autorizado e o certificado de "confiança" (TrustStore, certificado emitido pelo SEFAZ).
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.keyStore",caminhoCertificado);//Aqui vem o arquivo do certificado do seu cliente
System.setProperty("javax.net.ssl.keyStorePassword", senha);//Aqui a senha deste certificado
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", caminhoCertificadoSefaz);//Aqui vem o arquivo
voce não consegue disponibilizar um .pfx para eu testar
sou de curitiba, não tenho cliente em SP
Infelizmente não funciona assim, para testar você precisa de um certificado válido emitido por um órgão autorizado (em qualquer estado do Brasil), e quando me refiro a SEFAZ é a Secretaria da Fazendo do seu estado (no Paraná acho que se chama SEFA).
Para mais informações sobre a NF-e no Paraná leia mais aqui.
Saudações a todos!
Para alguém MUITO leigo no assunto, tantando implementar uma solução para emissão de NFe, com relação a testes, o certificado disponível no link http://nf-eletronica.com/blog/?page_id=71 , citado na pág 4 desse fórum, não serve para um teste completo?
Mesmo para testar, sou obrigado a adquirir (comprar) um certificado válido?
Obrigado!!!
Carlos.
Acredito que seja necessário um certificado válido sim. Inclusive, para usar o ambiente de homologação e produção é necessário que a empresa (dona do certificado) faça o cadastro solicitando o uso do ambiente.
Baixei o Axis2, utilizei o comando WSDL2Java, gerou dois arquivos .java, mas não gerou nenhum .class, fiz algo errado?
Prezados,
Estive verificando é não achei nada em relação a algo para saber quando foi liberado novas versões dos XSD para validação da NF-e.
Para que possamos saber se a versão que estamos utilizando é a mais recente, falei com algumas pessoas e mim informaram que temos que esta sempre olhando no site do portal NF-e, sendo que o mesmo, nem um serviço de RSS encontrei.
Alguém teria alguma outra sugestão para que possamos estar atentos as mudanças que são disponibilizadas no portal na NF-e?
Desde já agradeço a atenção de todos.
Eu também tenho problema com a publicação desses Schemas, toda semana tem que olhar no portal manualmente.
Outro problema:
desde a semana passada a SEFAZ de SP está voltando algumas retEnviNFe com falha no SCHEMA, mas alguém teve esse problema?
no meu caso eu peguei no ambiente de produção retEnviNFe com , mas alguém recebeu isso?
EDIT: postei no tópico errado vou postar novamente no: http://www.guj.com.br/java/72325-nfe—nota-fiscal-eletronica/ que é o tópico mais atual da NFe aqui no guj
Existe um site que oferece uma API com a funcionalidade de baixar o XML da NF-e de maneira automatizada e com validade jurídica, pois é necessário o uso do certificado digital. O serviço é pago porém funciona muito bem, contratei para minha empresa e facilitou muito a vida, pois agora baixamos automaticamente os XMLs e já são armazenados no sistema para utilização. Como são muitas NF-e, baixar manualmente cada XML estava inviável para nós.
Para quem se interessar, o link é esse aqui : http://knu.com.br/ajuda/documentacao/documentacao#nfe
Abraços