Pessoal,
Estou desenvolvendo um applet para assinatura e transmissão de NFe. A assinatura já está tudo ok, usando A3.
A transmissão é que está gerando problema. Testei o código em uma classe no eclipse direto, e deu certo. Só que se coloco em um applet dá o erro abaixo:
10/12/2012 16:20:13 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
AVISO: Required credentials not available for BASIC <any realm>@homologacao.nfe.sefazvirtual.rs.gov.br:443
10/12/2012 16:20:13 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
AVISO: Preemptive authentication requested but no default credentials available
Minha classe é:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.commons.httpclient.protocol.Protocol;
import br.com.javac.nfeapplet.util.GlobalVars;
import br.inf.portalfiscal.www.nfe.wsdl.nferecepcao2.NfeRecepcao2Stub;
import br.inf.portalfiscal.www.nfe.wsdl.nferetrecepcao2.NfeRetRecepcao2Stub;
public class TransmitirNFe {
private static final int SSL_PORT = 443;
private PrivateKey privateKey;
private KeyInfo keyInfo;
private KeyStore keyStore;
private String alias;
public TransmitirNFe(KeyStore keyStore, String alias) {
this.keyStore = keyStore;
this.alias = alias;
}
public String transmiteNFe(String xml) throws Exception {
String nrRec = "";
URL url = new URL("https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/Nferecepcao/NFeRecepcao2.asmx");//NfeRecepcao
XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
loadCertificates(signatureFactory);
String xmlEnvNFe = xml.toString();
OMElement ome = AXIOMUtil.stringToOM(xmlEnvNFe);
Iterator<?> children = ome.getChildrenWithLocalName("NFe");
while (children.hasNext()) {
OMElement omElement = (OMElement) children.next();
if ((omElement != null) && ("NFe".equals(omElement.getLocalName()))) {
omElement.addAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe", null);
}
}
NfeRecepcao2Stub.NfeDadosMsg dadosMsg = new NfeRecepcao2Stub.NfeDadosMsg();
dadosMsg.setExtraElement(ome);
NfeRecepcao2Stub.NfeCabecMsg nfeCabecMsg = new NfeRecepcao2Stub.NfeCabecMsg();
nfeCabecMsg.setCUF(GlobalVars.estado);
nfeCabecMsg.setVersaoDados("2.00");
NfeRecepcao2Stub.NfeCabecMsgE nfeCabecMsgE = new NfeRecepcao2Stub.NfeCabecMsgE();
nfeCabecMsgE.setNfeCabecMsg(nfeCabecMsg);
NfeRecepcao2Stub stub = new NfeRecepcao2Stub(url.toString());
NfeRecepcao2Stub.NfeRecepcaoLote2Result result = stub.nfeRecepcaoLote2(dadosMsg, nfeCabecMsgE);
Iterator<?> childrenr = result.getExtraElement().getChildrenWithLocalName("infRec");
while (childrenr.hasNext()) {
OMElement omElement = (OMElement) childrenr.next();
if (omElement.getLocalName().equals("infRec")){
OMElement omElementFilho = (OMElement) omElement.getChildren().next();
nrRec = omElementFilho.getText();
}
}
return "";
}
private void loadCertificates(XMLSignatureFactory signatureFactory) throws Exception {
if (keyStore != null) {
KeyStore.PrivateKeyEntry pkEntry = null;
if (keyStore.isKeyEntry(alias)) {
char[] pin = ("999999").toCharArray();
pkEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias,
new KeyStore.PasswordProtection(pin));
privateKey = pkEntry.getPrivateKey();
X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
List<X509Certificate> x509Content = new ArrayList<X509Certificate>();
x509Content.add(cert);
X509Data x509Data = keyInfoFactory.newX509Data(x509Content);
keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));
SocketFactoryDinamico socketFactoryDinamico = new SocketFactoryDinamico(cert, privateKey);
socketFactoryDinamico.setFileCacerts("NFeCacerts");
Protocol protocol = new Protocol("https", socketFactoryDinamico, SSL_PORT);
Protocol.registerProtocol("https", protocol);
}
else {
throw new Exception("Alias do certificado inválido.");
}
}
else {
throw new Exception("Informações do Certificado inválidas.");
}
}
}