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?
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.