Java.security.NoSuchAlgorithmException (WS NF-e) (RESOLVIDO)

Olá pessoal, bom dia!

Alguns assuntos deste tipo já foram abordados, porém apesar de ler vários tópicos ainda não consegui solucionar o meu caso…
Já tenho a NF-e rodando com certificados A1, agora porém estou implementando com A3, utilizando o eToken ProAlladin, ele é da Safesign, com o seguinte arquivo de configuração i[/i]:

name = Safesign
library = C:/WINDOWS/system32/eTpkcs11.dll

Abaixo como eu seto as propriedades do certificado…

System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");  
System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
Provider p = new sun.security.pkcs11.SunPKCS11("c:\\eclipse\\token.cfg"); // Precisa passar o caminho do token do certificado
Security.addProvider(p);

System.setProperty("javax.net.ssl.keyStore", "c:/certificado/nfe_a3der.cer");
System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-Safesign"); 
System.setProperty("javax.net.ssl.keyStorePassword", "minhaSenha");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
System.setProperty("javax.net.ssl.trustStore", "C:/certificado/nfe_a3.keystore");

Eu consigo assinar a NF-e, porém ao instanciar o objeto NfeRecepcao, ocorre o erro…

NfeRecepcao nfe = new NfeRecepcao();

Alguém sabe o pq disso? Existe algum macete, algo que eu deva fazer…qq dica, sugestão é benvinda…

Grato.

Pelo que sei toda vez que você acessa uma uma url https é necessário que a mesma esteja escpecificada no
arquivo jsserts??

Você está carregando este arquivo em algum lugar??

[quote=Daniel.F]Vc teria que carregar o arquivo jsserts para acessar um conexão https??

Vc está carregado ele em agum lugar??
[/quote]

Olá bom dia!

Então não estou não, como devo fazer isso?

Obrigado.

package rj.nfe.engine.webservice;
import java.io.*;
import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

public class InstallCert {   
  
    public static void main(String[] args) throws Exception 
    {   
        System.out.println("Aqui: "+args[0]);   
        String host;   
        int port;   
        char[] passphrase;   
        if ((args.length == 1) || (args.length == 2)) 
        {   
            String[] c = args[0].split(":");   
            host = c[0];   
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);   
            String p = (args.length == 1) ? "changeit" : args[1];   
            passphrase = p.toCharArray();   
        } 
        else 
        {   
            System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");   
            return;   
        }   
  
        File file = new File("jssecacerts");   
        if (file.isFile() == false) 
        {   
            char SEP = File.separatorChar;   
            File dir = new File(System.getProperty("java.home") + SEP + "'lib" + SEP + "security");   
            file = new File(dir, "jssecacerts");   
            if (file.isFile() == false)             
            {   
                file = new File(dir, "cacerts");   
            }   
        }   
        System.out.println("Loading KeyStore " + file + "...");   
        InputStream in = new FileInputStream(file);   
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());   
        ks.load(in, passphrase);   
        in.close();   
  
        SSLContext context = SSLContext.getInstance("TLS");   
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());   
        tmf.init(ks);   
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];   
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);   
        context.init(null, new TrustManager[] { tm }, null);   
        SSLSocketFactory factory = context.getSocketFactory();   
  
        System.out.println("Opening connection to " + host + ":" + port + "...");   
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);  
        socket.setSoTimeout(10000);   
        try 
        {   
            System.out.println("Starting SSL handshake...");   
            socket.startHandshake();   
            System.out.println();   
            System.out.println("No errors, certificate is already trusted");   
        } 
        catch (SSLException e) 
        {   
            System.out.println();   
            e.printStackTrace(System.out);   
        }   
  
        X509Certificate[] chain = tm.chain;   
        if (chain == null) 
        {   
            System.out.println("Could not obtain server certificate chain");   
            return;   
        }   
  
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));   
  
        System.out.println();   
        System.out.println("Server sent " + chain.length + " certificate(s):");   
        System.out.println();   
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");   
        MessageDigest md5  = MessageDigest.getInstance("MD5");   
        for (int i = 0; i < chain.length; i++) 
        {   
            X509Certificate cert = chain[i];   
            System.out.println(" " + (i + 1) + " Subject " + cert.getSubjectDN());   
            System.out.println("   Issuer  " + cert.getIssuerDN());   
            sha1.update(cert.getEncoded());   
            System.out.println("   sha1    " + toHexString(sha1.digest()));   
            md5.update(cert.getEncoded());   
            System.out.println();   
        }   
        System.out.println("   md5     " + toHexString(md5.digest()));   
  
        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");   
        String line = reader.readLine().trim();   
        int k;   
        try 
        {   
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;   
        } 
        catch (NumberFormatException e) 
        {   
            System.out.println("KeyStore not changed");   
            return;   
        }   
  
        X509Certificate cert = chain[k];   
        String alias = host + "-" + (k + 1);   
        ks.setCertificateEntry(alias, cert);   
  
        OutputStream out = new FileOutputStream("jssecacerts");   
        ks.store(out, passphrase);   
        out.close();   
  
        System.out.println();   
        System.out.println(cert);   
        System.out.println();   
        System.out.println("Added certificate to keystore 'jssecacerts' using alias '" + alias + "'");   
    }   
  
    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();   
  
    private static String toHexString(byte[] bytes) 
    {   
        StringBuilder sb = new StringBuilder(bytes.length * 3);   
        for (int b : bytes) 
        {   
            b &= 0xff;   
            sb.append(HEXDIGITS[b >> 4]);   
            sb.append(HEXDIGITS[b & 15]);   
            sb.append(' ');   
        }   
        return sb.toString();   
    }   
  
    private static class SavingTrustManager implements X509TrustManager 
    {   
  
        private final X509TrustManager tm;   
        private X509Certificate[] chain;   
  
        SavingTrustManager(X509TrustManager tm)
        {   
            this.tm = tm;   
        }   
  
        public X509Certificate[] getAcceptedIssuers() 
        {   
            throw new UnsupportedOperationException();   
        }   
  
        public void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException
        {   
            throw new UnsupportedOperationException();   
        }   
  
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException 
        {   
            this.chain = chain;   
            tm.checkServerTrusted(chain, authType);   
        }   
    }   
  
}  

//Aqui está a chamada para o código acima
InstallCert.main(new String[] {new String("homologacao.nfe.sefaz.rs.gov.br") });

Ao rodar esta classe será criado no seu projeto o arquivo jssecacerts, após isto você deve carrega-lo da seguinte maneira:
System.setProperty("javax.net.ssl.trustStore", Caminho do arquivo jssecacerts + "jssecacerts");
Eu peguei esta classe do seguinte tópico:
http://www.guj.com.br/posts/list/240/72325.java#765893

Tá certo…vou fazer os testes logo mais…
Muito obrigado pela atenção e pelas dicas…

Precisava agardecer não, se não resolver poste ai.
Ou caso resolva dê este post como solucionado.

[quote=Daniel.F]Precisava agardecer não, se não resolver poste ai.
Ou caso resolva dê este post como solucionado.[/quote]

Olá Daniel, sou eu novamente…

Então, eu rodei a classe aqui, porém estou totalmente lost neste caso ae…rsrs
Olha o erro que me apresentou ao executar…

Tem alguma idéia ou dica do que pode ser?

Obrigado.

Então, eu até pesquisei sobre o caso…e vi uma dica do Vitor Pamplona…

http://www.jroller.com/vfpamp/entry/suportando_ssl_nos_clientes_java

Coloquei ela na aplicação mas mesmo assim, o erro continua, preciso colocar algo no meu classpath?

Grato.

[quote=lbvitoriano]Então, eu até pesquisei sobre o caso…e vi uma dica do Vitor Pamplona…

http://www.jroller.com/vfpamp/entry/suportando_ssl_nos_clientes_java

Coloquei ela na aplicação mas mesmo assim, o erro continua, preciso colocar algo no meu classpath?

Grato.
[/quote]

Olá pessoal, boa tarde!

Bem, meu problema persiste…olhem a mensagem…

E o meu código está desta forma…

	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");  
        System.setProperty("javax.net.ssl.keyStoreType", "PKCS11" );

       	Provider p = new sun.security.pkcs11.SunPKCS11("c:\\eclipse\\token.cfg"); // Precisa passar o caminho do token do certificado
       	Security.addProvider(p);

        System.setProperty("javax.net.ssl.keyStore", "NONE");
        System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-Safesign"); 
       	System.setProperty("javax.net.ssl.keyStorePassword", "minhaSenha");
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
        System.setProperty("javax.net.ssl.trustStore", "C:/certificado/jssecacerts");

Alguém tem alguma dica, idéia, macete?

Grato.

eu não sei se você já resolveu o problema, mas
System.setProperty(“javax.net.ssl.keyStoreProvider”, ks.getType());//“SunPKCS11-SmartCard”);
me ajudou

Mas eu estou com uma dúvida sobre a classe postada InstallCert
pois funciona até entrar no
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
nesta parte ele dá time out na comunicaçaõ

tanto para o host mostrado na classe homologacao.nfe.sefaz.rs.gov.br
quanto para o host que eu quero homologacao.cte.sefaz.rs.gov.br (única diferença é que ao invés de nfe é cte )

e eu acho que eu parei por não gerar esta jssecacerts de forma correta
se alguém puder me ajudar eu ficaria muito grato

Então olha como ficou no fim das contas…

[code]Provider p = new sun.security.pkcs11.SunPKCS11(“c:\token.cfg”); // Precisa passar o caminho do token do certificado
Security.addProvider§;

String p11ProviderName = p.getName();

System.setProperty(“javax.net.ssl.keyStore”, “NONE”);
System.setProperty(“javax.net.ssl.keyStoreProvider”, “SunPKCS11-eToken”); // Tem q saber qual o provider dele (SmartCard, Safesig, etc).
System.setProperty(“javax.net.ssl.keyStorePassword”, “suaSenha”);

System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
System.setProperty(“javax.net.ssl.trustStore”, “C:/nfe.keystore”);//Aqui vem o arquivo criado através do comando keytool
System.setProperty(“javax.net.ssl.trustStorePassword”, “suaSenha”);[/code]

Meu arquivo token.cfg ficou assim…

name = eToken library = C:/WINDOWS/system32/eTpkcs11.dll

Espero q possa ajudar…
Eu nem usei mais a InstallCert.java…

Abraços…

Opa valeu

eu coloco tudo o que você coloca
mas acho que o problema ainda está no meu truststore

System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);

System.setProperty(“javax.net.ssl.trustStore”, endereco);

no endereco eu to passando o jks dos certificados Raiz que eu baixei da certsign

e o erro que dá quando eu tento me conectar com o WS é java.security.NoSuchAlgorithmException

e eu to conseguindo assinar o XML já
mas estou empacado nesta parte de comunicaçaõ com o WS

se você puder ajudar eu ficaria muito grato
se quiser me adicionar no msn também: bru_no_e_ne_as@hotmail.com

muito obrigado até mais!

[quote=lbvitoriano]Então olha como ficou no fim das contas…

[code]Provider p = new sun.security.pkcs11.SunPKCS11(“c:\token.cfg”); // Precisa passar o caminho do token do certificado
Security.addProvider§;

String p11ProviderName = p.getName();

System.setProperty(“javax.net.ssl.keyStore”, “NONE”);
System.setProperty(“javax.net.ssl.keyStoreProvider”, “SunPKCS11-eToken”); // Tem q saber qual o provider dele (SmartCard, Safesig, etc).
System.setProperty(“javax.net.ssl.keyStorePassword”, “suaSenha”);

System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
System.setProperty(“javax.net.ssl.trustStore”, “C:/nfe.keystore”);//Aqui vem o arquivo criado através do comando keytool
System.setProperty(“javax.net.ssl.trustStorePassword”, “suaSenha”);[/code]

Meu arquivo token.cfg ficou assim…

name = eToken library = C:/WINDOWS/system32/eTpkcs11.dll

Espero q possa ajudar…
Eu nem usei mais a InstallCert.java…

Abraços…[/quote]

a minha dúvida é com relaçaõ ao javax.net.ssl.trustStore.
pois é preciso gerar com a keytool não é
contudo eu não sei qual certificado, exatamente, devo usar para gerar esta keytool.
por exemplo, eu usei o Raiz BR 1.cer
que eu puxei do site de SC, e que dizia ser necessário mais outros dois

contudo eu também não sei como colocar mais de um .cer em um keystore

=/
e eu acho que é bem ai que está dando o problema e gera o
"java.security.NoSuchAlgorithmException"
quando ele tenta se conectar com o webservice

E eu pesquisar uma classe InstalCert que deveria ir à um endereço e, provavelmente, pegar todos os certificados e gerar um jks
contudo eu não sei qual endereço colocar
para todos os hosts que eu tento, inclusive o que foi informado na classe “homologacao.nfe.sefaz.rs.gov.br”, tá time out na conexão.

Então,
eu fiz aqui em casa o instalcert e deu certo !
acho que antes, quando não dava certo, eu estava fazendo na empresa que eu trabalho, e por algum motivo dava timeout

mas agora só vou poder testar o truststore quando eu estiver na empresa

em todo caso muito obrigado pelas dicas!

prezado bruno291289,

Você consegui resolver este problema?

Estou rodando aqui no Jboss e estou com o seguinte erro: