Problema com arquivo token.cfg (PKCS#11)

1 resposta
T

Pessoal,

eu tenho um Token USB Epass2000 adquirido em uma empresa. Quero utilizá-lo para assinar XML's, mas estou com dúvida na hora de montar o arquivo token.cfg.

Esse é um exemplo que vi na internet:
name=SmartCard
library=C:/Arquivos de programas/Smart card bundle/opensc-pkcs11.dll
Quero saber para que serve a 'variável' name e a 'variável' library. Fui fazendo um teste e fiz o arquivo:
name=Pronova
library=C:/WINDOWS/system32/FT12Cin.dll
Só que fui rodar o teste e o esse erro foi retornado:
Exception in thread "main" java.security.ProviderException: Initialization failed
        at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:340)
        at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:86)
        at projetonfe.AppMain.main(AppMain.java:30)
Caused by: java.io.IOException: Não foi possível encontrar o procedimento especificado.

        at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
        at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:141)
        at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:154)
        at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:281)
        ... 2 more
Java Result: 1

Talvez não seja o arquivo, mas independente o que poderia ter causado esse erro?

vlw

1 Resposta

J

Olá, eu também estou utilizando um A3 (assumo que é um A3 porque você está usando PKCS11).

É o seguinte quando você pega seu token a empresa que te vendeu deve ter te passado algum programa para instalar na máquina para você gerenciar eToken.

Nesse programa você pode alterar o nome do eToken, esse é o nome que vai no name (isso porque você ter vários eTokens com nomes diferentes, ex: eToken-MATRIZ).

Esse programa de gerenciamento do eToken instala também uma .dll (assumindo que é windows) em C:/WINDOWS/system32/, você precisa saber o nome desse arquivo para informar no:
library = C:/WINDOWS/system32/NOME_DLL_DO_TOKEN.dll

Agora sim você cria o arquivo .cfg para ser referenciado dentro da aplicação, segue um exemplo:
Provider p = new sun.security.pkcs11.SunPKCS11(NFe.CAMINHO_ARQUIVO_CONFIG);
        Security.addProvider(p);

        KeyStore ks = KeyStore.getInstance(NFe.TIPO_KEYSTORE_A3); // PKCS11
        ks.load(null, NFe.SENHA_CERTIFICADO_CLIENTE.toCharArray());

        // para resolver: HelloRequest followed by an unexpected  handshake message
        System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");

        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        System.setProperty("javax.net.ssl.keyStore", "NONE");
        System.setProperty("javax.net.ssl.keyStoreType", NFe.TIPO_KEYSTORE_A3); // PKCS11
        System.setProperty("javax.net.ssl.keyStorePassword", NFe.SENHA_CERTIFICADO_CLIENTE);

        System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-[COLOQUE AQUI O QUE FOI EM name no .cfg]");


        // as 3 linhas abaixo sao referentes ao certificado do SEFAZ, NÃO É DO CERTIFICADO DO CLIENTE
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", NFe.ARQUIVO_KS_SEFAZ_HOMOLOGACAO); // keystore criado com o Keytool
        System.setProperty("javax.net.ssl.trustStorePassword", NFe.SENHA_KS_SEFAZ_HOMOLOGACAO);
Tomara que te ajude porque "apanhei" tanto para acertar isso.
Criado 23 de setembro de 2010
Ultima resposta 23 de set. de 2010
Respostas 1
Participantes 2