Problema com arquivo token.cfg (PKCS#11)

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:

[code]Exception in thread “main” java.security.ProviderException: Initialization failed
at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:340)
at sun.security.pkcs11.SunPKCS11.(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[/code]

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

vlw

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:

[code] Provider p = new sun.security.pkcs11.SunPKCS11(NFe.CAMINHO_ARQUIVO_CONFIG);
Security.addProvider§;

    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);

[/code]
Tomara que te ajude porque “apanhei” tanto para acertar isso.