| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/02/2007 13:40:02
|
mhinz
HelloWorld
Membro desde: 25/01/2007 16:00:20
Mensagens: 11
Offline
|
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?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/02/2007 15:00:42
|
vivi_grieco
JavaEvangelist
![[Avatar]](/images/avatar/c8f2e743409a2b1d467ea.jpg)
Membro desde: 29/10/2003 21:57:45
Mensagens: 366
Localização: Belo Horizonte/MG
Offline
|
eu participo do projeto da NFe da secretaria da fazenda daqui de MG. Qual a sua dúvida especificamente?
|
Viviane Grieco
SCJP 1.4, SCWCD 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2007 09:52:05
|
mhinz
HelloWorld
Membro desde: 25/01/2007 16:00:20
Mensagens: 11
Offline
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/07/2008 18:27:04
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
Ola mhinz
Voce conseguiu desenvolver o projeto da nota fiscal e se conseguiu, o que utilizou?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/07/2008 09:02:44
|
mateusprado
JavaEvangelist
![[Avatar]](/images/avatar/b7e2588d3cbee971f93dd87308720d90.jpg)
Membro desde: 26/02/2008 07:20:38
Mensagens: 412
Localização: Araraquara, SP
Offline
|
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.
|
Mateus Prado

Caelum Stella
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/07/2008 09:57:03
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
Ola Mateus
Eu iniciei um projeto de nota fiscal eletronica ha 2 semanas, tenho mais 22 semanas para terminar.
Eu consegui gerar meu primeiro xml utilizando jdom atraves de um exemplo aqui mesmo do guj.
Classe :
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
public class GeraXML
{
public GeraXML(){
}
public static void main(String[] args)
{
Element agenda = new Element("Agenda");
//Define Agenda como root
Document documento = new Document(agenda);
//Cria o elemento Contato
Element contato = new Element("Contato");
//Adiciona o atributo id ao Contato
contato.setAttribute("id","123");
//Criando os elementos de contato
Element nome = new Element("nome");
nome.setText("Glaucio Guerra");
Element telefone = new Element("telefone");
telefone.setText("123-456");
Element endereco = new Element("endereco");
endereco.setText("Av. Amaral Peixoto S/N");
Element email = new Element("email");
email.setText("glaucioguerra@gmail.com");
//Adicionando elementos nome, telefone, endereco e email no Contato
contato.addContent(nome);
contato.addContent(telefone);
contato.addContent(endereco);
contato.addContent(email);
//Adicionado o Contato a Agenda
agenda.addContent(contato);
//Classe responsável para imprimir / gerar o XML
XMLOutputter xout = new XMLOutputter();
try
{
//Criando o arquivo de saida
FileWriter arquivo = new FileWriter
(
new File("C:/arquivo.xml")
);
//Imprimindo o XML no arquivo
xout.output(documento, arquivo);
} catch (IOException e)
{
e.printStackTrace();
}
}
}
O resultado foi esse:
<?xml version="1.0" encoding="UTF-8"?>
<Agenda><Contato id="123"><nome>Glaucio Guerra</nome><telefone>123-456</telefone><endereco>Av. Amaral Peixoto S/N</endereco><email>glaucioguerra@gmail.com</email></Contato></Agenda>
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/07/2008 18:58:53
|
mateusprado
JavaEvangelist
![[Avatar]](/images/avatar/b7e2588d3cbee971f93dd87308720d90.jpg)
Membro desde: 26/02/2008 07:20:38
Mensagens: 412
Localização: Araraquara, SP
Offline
|
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,
|
Mateus Prado

Caelum Stella
SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/07/2008 07:41:46
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/07/2008 20:09:13
|
jluizsc
Thread.start()
![[Avatar]](/images/avatar/ac27b77292582bc293a51055bfc994ee.png)
Membro desde: 06/02/2005 23:38:26
Mensagens: 45
Offline
|
mateusprado wrote: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
|
__________________
Joao Luiz
Gratis eh pouco:
Explicacoes detalhadas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/07/2008 13:56:27
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/10/2008 09:28:40
|
rafaelbtz
Java Ninja
![[Avatar]](/images/avatar/c5f441cd5f43eb2f2c024e1f8b5d00cd.jpg)
Membro desde: 29/03/2005 10:53:56
Mensagens: 276
Offline
|
Alguem pode me ajudar... estou precisando de uma ajuda para assinar a nfe... alguem tem algum exemplo ou tutorial sobre essa assinatura
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/10/2008 16:35:33
|
jluizsc
Thread.start()
![[Avatar]](/images/avatar/ac27b77292582bc293a51055bfc994ee.png)
Membro desde: 06/02/2005 23:38:26
Mensagens: 45
Offline
|
Ola Pessoal
Eu usei o mesmo codigo postado aqui no grupo
e adicionei um codigo o codigo X509 no projeto (ou na pasta)
somente esses dois jah funcionou
usar: Assinador.assinar( ... )
segue os dois arquivos *.java na sequencia
Assinador.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package assinadornfe01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
//import sun.misc.BASE64Encoder;
import java.util.Enumeration;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.security.PrivateKey;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import javax.swing.JOptionPane;
import AssinadorNFE.X509KeySelector;
public class Assinador
{
private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
private static final String PROVIDER_CLASS_NAME = "org.jcp.xml.dsig.internal.dom.XMLDSigRI";
private static final String PROVIDER_NAME = "jsr105Provider";
public void assinar(String caminhoXml, String caminhoCertificado, String senha, String caminhoXmlNovo, String tipo) throws Exception
{
// tipo
// '1' - NFE
// '2' - CANCELAMENTO
// '3' - INUTILIZACAO
//
String tag = "";
if(tipo.equals("1"))
tag = "infNFe";
else if (tipo.equals("2"))
tag = "infCanc";
else if (tipo.equals("3"))
tag = "infInut";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document docs = builder.parse(new File(caminhoXml));
//Document docs = builder.parse(new File("c:/xml/430802017886010001735500000000010000030371-nfe.xml"));
// Obtem elemento do documento a ser assinado, será criado uma
// REFERENCE para o mesmo
NodeList elements = docs.getElementsByTagName(tag);
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
//System.out.println(id);
// Create a DOM XMLSignatureFactory that will be used to
// generate the enveloped signature.
String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
//XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
// Create a Reference to the enveloped document (in this case,
// you are signing the whole document, so a URI of "" signifies
// that, and also specify the SHA1 digest algorithm and
// the ENVELOPED Transform.
ArrayList transformList = new ArrayList();
TransformParameterSpec tps = null;
Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,tps);
Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
// Create the SignedInfo.
SignedInfo si = fac
.newSignedInfo(fac.newCanonicalizationMethod(
CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null), fac
.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
Collections.singletonList(ref));
// Load the KeyStore and get the signing key and certificate.
///Provider p = new sun.security.pkcs11.SunPKCS11("c:/taliam/sclara.cer");
//Security.addProvider(p);
//KeyStore ks = KeyStore.getInstance("PKCS11");
//ks.load(null, new String("safeweb").toCharArray());
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(caminhoCertificado), senha.toCharArray());
Enumeration aliasesEnum = ks.aliases();
String alias = "";
while (aliasesEnum.hasMoreElements()) {
alias = (String) aliasesEnum.nextElement();
if (ks.isKeyEntry(alias)) {
//System.out.println(alias);
break;
}
}
// Original
//KeyStore ks = KeyStore.getInstance("JKS");
//ks.load(new FileInputStream("santaclara.jks"), "RAIMUNDO".toCharArray());
//
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(senha.toCharArray()));
X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
// Create the KeyInfo containing the X509Data.
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
// x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
// Instantiate the document to be signed.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(caminhoXml));
// Create a DOMSignContext and specify the RSA PrivateKey and
// location of the resulting XMLSignature's parent element.
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
// Create the XMLSignature, but don't sign it yet.
XMLSignature signature = fac.newXMLSignature(si, ki);
// Marshal, generate, and sign the enveloped signature.
signature.sign(dsc);
// Output the resulting document.
OutputStream os = new FileOutputStream(caminhoXmlNovo);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
// Find Signature element.
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new Exception("Cannot find Signature element");
}
// Create a DOMValidateContext and specify a KeySelector and document
// context.
DOMValidateContext valContext = new DOMValidateContext( new X509KeySelector(ks), nl.item(0));
// Unmarshal the XMLSignature.
XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature.
boolean coreValidity = signatures.validate(valContext);
// Check core validation status.
if (coreValidity == false) {
System.err.println("Falha na Assinatura!");
} else {
System.out.println("Assinatura Correta!");
}
}
public static void main(String[] args) throws Exception {
if(args.length != 5)
{
//JOptionPane.showMessageDialog(null, "São esperados 5 parâmetros!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Sao esperados 5 parametros!");
return;
}
String caminhoXml = args[0];
String caminhoCertificado = args[1];
String senha = args[2];
String arquivoXmlNovo = args[3];
String tipo = args[4];
File file = new File(caminhoXml);
if(!file.exists())
{
//JOptionPane.showMessageDialog(null, "Arquivo " + caminhoXml + " não encontrado!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Arquivo " + caminhoXml + " não encontrado!");
return;
}
file = new File(caminhoCertificado);
if(!file.exists())
{
//JOptionPane.showMessageDialog(null, "Arquivo " + caminhoCertificado + " não encontrado!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Arquivo " + caminhoCertificado + " não encontrado!");
return;
}
try
{
Assinador t = new Assinador();
t.assinar(caminhoXml, caminhoCertificado, senha, arquivoXmlNovo, tipo);
//JOptionPane.showMessageDialog(null, "Arquivo xml assinado com sucesso!", "Atenção", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Arquivo xml assinado com sucesso" + caminhoXml + "!");
}
catch(Exception e)
{
//JOptionPane.showMessageDialog(null, "Erro ao tentar assinar arquivo xml! \n\n" + e.toString(), "Atenção", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Erro ao tentar assinar arquivo xml! \n\n" + e.toString());
}
}
}
X509KeySelector.java
package AssinadorNFE;
import java.io.InputStream;
import java.io.IOException;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.CertSelector;
import java.security.cert.X509Certificate;
import java.security.cert.X509CertSelector;
import java.util.Enumeration;
import java.util.Iterator;
import javax.security.auth.x500.X500Principal;
import javax.xml.crypto.*;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dom.*;
import javax.xml.crypto.dsig.keyinfo.*;
/**
* A <code>KeySelector</code> that returns {@link PublicKey}s of trusted
* {@link X509Certificate}s stored in a {@link KeyStore}.
*
* <p>This <code>KeySelector</code> uses the specified <code>KeyStore</code>
* to find a trusted <code>X509Certificate</code> that matches information
* specified in the {@link KeyInfo} passed to the {@link #select} method.
* The public key from the first match is returned. If no match,
* <code>null</code> is returned. See the <code>select</code> method for more
* information.
*
* <p>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 <code>X509KeySelector</code>.
*
* @param keyStore the keystore
* @throws KeyStoreException if the keystore has not been initialized
* @throws NullPointerException if <code>keyStore</code> is
* <code>null</code>
*/
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.
*
* <p>This method compares data contained in {@link KeyInfo} entries
* with information stored in the <code>KeyStore</code>. 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 <code>KeyUsage</code>
* extension that asserts the <code>digitalSignature</code> bit and
* matches an <code>X509Certificate</code> in the <code>KeyStore</code>.
* X509Data X509IssuerSerial: if the serial number and issuer DN match an
* <code>X509Certificate</code> in the <code>KeyStore</code>.
* X509Data X509SubjectName: if the subject DN matches an
* <code>X509Certificate</code> in the <code>KeyStore</code>.
* X509Data X509SKI: if the subject key identifier matches an
* <code>X509Certificate</code> in the <code>KeyStore</code>.
* KeyName: if the keyname matches an alias in the <code>KeyStore</code>.
* RetrievalMethod: supports rawX509Certificate and X509Data types. If
* rawX509Certificate type, it must match an <code>X509Certificate</code>
* in the <code>KeyStore</code>.
*
* @param keyInfo a <code>KeyInfo</code> (may be <code>null</code>
* @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 <code>XMLCryptoContext</code> that may contain additional
* useful information for finding an appropriate key
* @return a key selector result
* @throws KeySelectorException if an exceptional condition occurs while
* attempting to find a key. Note that an inability to find a key is not
* considered an exception (<code>null</code> should be
* returned in that case). However, an error condition (ex: network
* communications failure) that prevented the <code>KeySelector</code>
* from finding a potential key should be considered an exception.
* @throws ClassCastException if the data type of <code>method</code>
* is not supported by this key selector
*/
public KeySelectorResult select(KeyInfo keyInfo,
KeySelector.Purpose purpose, AlgorithmMethod method,
XMLCryptoContext context) throws KeySelectorException {
SignatureMethod sm = (SignatureMethod) method;
try {
// return null if keyinfo is null or keystore is empty
if (keyInfo == null || ks.size() == 0) {
return new SimpleKeySelectorResult(null);
}
// Iterate through KeyInfo types
Iterator i = keyInfo.getContent().iterator();
while (i.hasNext()) {
XMLStructure kiType = (XMLStructure) i.next();
// check X509Data
if (kiType instanceof X509Data) {
X509Data xd = (X509Data) kiType;
KeySelectorResult ksr = x509DataSelect(xd, sm);
if (ksr != null) {
return ksr;
}
// check KeyName
} else if (kiType instanceof KeyName) {
KeyName kn = (KeyName) kiType;
Certificate cert = ks.getCertificate(kn.getName());
if (cert != null && algEquals(sm.getAlgorithm(),
cert.getPublicKey().getAlgorithm())) {
return new SimpleKeySelectorResult(cert.getPublicKey());
}
// check RetrievalMethod
} else if (kiType instanceof RetrievalMethod) {
RetrievalMethod rm = (RetrievalMethod) kiType;
try {
KeySelectorResult ksr = null;
if (rm.getType().equals
(X509Data.RAW_X509_CERTIFICATE_TYPE)) {
OctetStreamData data = (OctetStreamData)
rm.dereference(context);
CertificateFactory cf =
CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)
cf.generateCertificate(data.getOctetStream());
ksr = certSelect(cert, sm);
} else if (rm.getType().equals(X509Data.TYPE)) {
NodeSetData nd = (NodeSetData)
rm.dereference(context);
// convert nd to X509Data
// ksr = x509DataSelect(xd, sm);
} else {
// skip; keyinfo type is not supported
continue;
}
if (ksr != null) {
return ksr;
}
} catch (Exception e) {
throw new KeySelectorException(e);
}
}
}
} catch (KeyStoreException kse) {
// throw exception if keystore is uninitialized
throw new KeySelectorException(kse);
}
// return null since no match could be found
return new SimpleKeySelectorResult(null);
}
/**
* Searches the specified keystore for a certificate that matches the
* criteria specified in the CertSelector.
*
* @return a KeySelectorResult containing the cert's public key if there
* is a match; otherwise null
*/
private KeySelectorResult keyStoreSelect(CertSelector cs)
throws KeyStoreException {
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements()) {
String alias = (String) aliases.nextElement();
Certificate cert = ks.getCertificate(alias);
if (cert != null && cs.match(cert)) {
return new SimpleKeySelectorResult(cert.getPublicKey());
}
}
return null;
}
/**
* Searches the specified keystore for a certificate that matches the
* specified X509Certificate and contains a public key that is compatible
* with the specified SignatureMethod.
*
* @return a KeySelectorResult containing the cert's public key if there
* is a match; otherwise null
*/
private KeySelectorResult certSelect(X509Certificate xcert,
SignatureMethod sm) throws KeyStoreException {
// skip non-signer certs
boolean[] keyUsage = xcert.getKeyUsage();
if (keyUsage[0] == false) {
return null;
}
String alias = ks.getCertificateAlias(xcert);
if (alias != null) {
PublicKey pk = ks.getCertificate(alias).getPublicKey();
// make sure algorithm is compatible with method
if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
return new SimpleKeySelectorResult(pk);
}
}
return null;
}
/**
* Returns an OID of a public-key algorithm compatible with the specified
* signature algorithm URI.
*/
private String getPKAlgorithmOID(String algURI) {
if (algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
return "1.2.840.10040.4.1";
} else if (algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
return "1.2.840.113549.1.1";
} else {
return null;
}
}
/**
* A simple KeySelectorResult containing a public key.
*/
private static class SimpleKeySelectorResult implements KeySelectorResult {
private final Key key;
SimpleKeySelectorResult(Key key) { this.key = key; }
public Key getKey() { return key; }
}
/**
* Checks if a JCA/JCE public key algorithm name is compatible with
* the specified signature algorithm URI.
*/
//@@@FIXME: this should also work for key types other than DSA/RSA
private boolean algEquals(String algURI, String algName) {
if (algName.equalsIgnoreCase("DSA") &&
algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
return true;
} else if (algName.equalsIgnoreCase("RSA") &&
algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
return true;
} else {
return false;
}
}
/**
* Searches the specified keystore for a certificate that matches an
* entry of the specified X509Data and contains a public key that is
* compatible with the specified SignatureMethod.
*
* @return a KeySelectorResult containing the cert's public key if there
* is a match; otherwise null
*/
private KeySelectorResult x509DataSelect(X509Data xd, SignatureMethod sm)
throws KeyStoreException, KeySelectorException {
// convert signature algorithm to compatible public-key alg OID
String algOID = getPKAlgorithmOID(sm.getAlgorithm());
KeySelectorResult ksr = null;
Iterator xi = xd.getContent().iterator();
while (xi.hasNext()) {
ksr = null;
Object o = xi.next();
// check X509Certificate
if (o instanceof X509Certificate) {
X509Certificate xcert = (X509Certificate) o;
ksr = certSelect(xcert, sm);
// check X509IssuerSerial
} else if (o instanceof X509IssuerSerial) {
X509IssuerSerial xis = (X509IssuerSerial) o;
X509CertSelector xcs = new X509CertSelector();
try {
xcs.setSubjectPublicKeyAlgID(algOID);
xcs.setSerialNumber(xis.getSerialNumber());
xcs.setIssuer(new X500Principal
(xis.getIssuerName()).getName());
} catch (IOException ioe) {
throw new KeySelectorException(ioe);
}
ksr = keyStoreSelect(xcs);
// check X509SubjectName
} else if (o instanceof String) {
String sn = (String) o;
X509CertSelector xcs = new X509CertSelector();
try {
xcs.setSubjectPublicKeyAlgID(algOID);
xcs.setSubject(new X500Principal(sn).getName());
} catch (IOException ioe) {
throw new KeySelectorException(ioe);
}
ksr = keyStoreSelect(xcs);
// check X509SKI
} else if (o instanceof byte[]) {
byte[] ski = (byte[]) o;
X509CertSelector xcs = new X509CertSelector();
try {
xcs.setSubjectPublicKeyAlgID(algOID);
} catch (IOException ioe) {
throw new KeySelectorException(ioe);
}
// DER-encode ski - required by X509CertSelector
byte[] encodedSki = new byte[ski.length+2];
encodedSki[0] = 0x04; // OCTET STRING tag value
encodedSki[1] = (byte) ski.length; // length
System.arraycopy(ski, 0, encodedSki, 2, ski.length);
xcs.setSubjectKeyIdentifier(encodedSki);
ksr = keyStoreSelect(xcs);
// check X509CRL
// not supported: should use CertPath API
} else {
// skip all other entries
continue;
}
if (ksr != null) {
return ksr;
}
}
return null;
}
}
--
Joao Luiz - Linux user #159951
my space : http://www.myspace.com/jluizsc
GRATIS eh POUCO: http://www.gratisepouco.com.br
This message was edited 1 time. Last update was at 13/07/2010 16:21:17
|
__________________
Joao Luiz
Gratis eh pouco:
Explicacoes detalhadas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/10/2008 16:55:18
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2008 10:10:01
|
rafaelbtz
Java Ninja
![[Avatar]](/images/avatar/c5f441cd5f43eb2f2c024e1f8b5d00cd.jpg)
Membro desde: 29/03/2005 10:53:56
Mensagens: 276
Offline
|
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:
É isso ai, assim eu consegui fazer funcionar.
Espero ter ajudado... qualquer coisa pode me mandar um email rafaelbtz@yahoo.com.br que eu ajudo, já que eu recebi muita ajuda aqui no GUJ também
Abraços,
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/10/2008 21:33:28
|
farzac
JavaGuru
![[Avatar]](/images/avatar/9a83eabfb7fa303a2d85dbc6f37483e5.jpg)
Membro desde: 17/04/2005 11:33:11
Mensagens: 233
Localização: catanduva
Offline
|
Amigo
Me envie um passo a passo, desde o inicio se possivel.
Sou leigo com webservice.
Eu utilizo o Netbeans.
Fico no aguardo.
|
|
|
 |
|
|
|
|