Bom pessoal, o certificado A3 pra assinar a nota funciona tranquilamente, dps caso alguem realmente tenha interesse em continuar podemos sentar e desenvolver. Entretanto, em experiencias passadas, o grande problema consiste em estar usando o certificado para autenticar a conexao.
O JDK6 ( da ultima versao q utilizei, acho q release 14) tinha um bug que ele nao conseguia autenticar conexao SSL usando certificado do tipo A3 (esta até na lista de bugs para correcao). O que o pessoal de SP fez foi desenvolver um provider (que nao eh opensource) para conseguir autenticar a conexao. Visto que o certificado A3 vc nao exporta a privatekey.
Se alguem quiser testar com alguma nova versao do java. Abaixo segue o codigo que utilizei na época pra testar conexao com a sefaz, basta substituir as informacoes do server e da porta.
[code]import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import javax.net.ssl.SSLSocketFactory;
public class SunMSCAPITest {
// Website to access
public static final String TARGET_HTTPS_SERVER = "localhost";
public static final int TARGET_HTTPS_PORT = 8443;
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.ssl.keyStoreProvider","SunMSCAPI");
System.setProperty("javax.net.ssl.keyStoreType","Windows-MY");
System.setProperty("javax.net.ssl.trustStoreProvider","SunMSCAPI");
System.setProperty("javax.net.ssl.trustStoreType","Windows-ROOT");
Socket socket = SSLSocketFactory.getDefault().createSocket(TARGET_HTTPS_SERVER,
TARGET_HTTPS_PORT);
try {
Writer out = new OutputStreamWriter(socket.getOutputStream(),
"UTF-8");
out.write("Host: " + TARGET_HTTPS_SERVER + ":" + TARGET_HTTPS_PORT
+ "\r\n");
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream(), "UTF-8"));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} finally {
socket.close();
}
}
}[/code]
Att.
Fernando