SmartCard - PKCS11 - GemSAFE - Problema na leitura de certificado

Pessoal

Estou tentando ler um certificado e a chave privada de um SmartCard através de um leitor GemPC Twin USB.
Consegui ler o certificado utilizando a implementação do PKCS#11 da OpenSC (opensc-pkcs11.dll) mas ele não me permite ler a chave privada.

Config:

name=SmartCard
library=C:/Arquivos de programas/Smart card bundle/opensc-pkcs11.dll

Código:

pkcs11Provider = new SunPKCS11(configFile);
Security.addProvider(pkcs11Provider);

KeyStore keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
keyStore.load(null, pin);

Enumeration<String> aliasesEnum = keyStore.aliases();

while (aliasesEnum.hasMoreElements()) {
	String alias = aliasesEnum.nextElement();

	Certificate certificate = keyStore.getCertificate(alias);
	PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, pin);

	System.out.println(privateKey.getEncoded()); <---------- retorna NULL
}
...

Quando tento obter a chave privada o método retorna NULL como mostrado acima.
Tentei então utilizar a implementação do PKCS#11 do fabricante do leitor (GemPlus). Baixei o GemSAFE 4.2 e alterei o config de inicialização do provider.

Config:

name=GemSafe
library=C:/Arquivos de programas/Gemplus/GemSafe Libraries Admin/BIN/gclib.dll

Obs: Tentei tanto com o name=GemSafe como com o name=SmartCard

Neste caso, o provider é adicionado sem problemas mas na hora de obter o KeyStorage ( KeyStore.getInstance(“PKCS11”, pkcs11Provider) ) ocorre a exceção:

java.security.KeyStoreException: PKCS11 not found
	at java.security.KeyStore.getInstance(KeyStore.java:645)
	at br.com.bradseg.pdfsign.certificate.CertificateReader.getCertificates(CertificateReader.java:37)
	at br.com.bradseg.pdfsign.MainClass.main(MainClass.java:26)

Alguém já passou por esse problema e conseguiu resolvê-lo?

Blz?

Estou tentando utilizar o certificado do pronova e apresenta o mesmo erro.

Caso alguém tenha idéia do que possa ser avise.

Se eu achar a solução coloco no forum

obrigado,

flw…

Por definição, não é possível “puxar” a chave privada de um smartcard, então getEncoded() sempre irá retornar NULL.
O que você pode fazer é solicitar que o smartcard assine ou criptografe algum dado.

Sim thingol

Foi o que fiz. Dei uma estudada sobre Smartcard. Ele possui um hardware que possibilita que ele próprio efetue a assinatura.
Também não permite extrair a PK porque esse procedimento possibilitaria a clonagem do certificado.

Para assinar utilizei o código abaixo:

final Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);
signature.update(contentArray);
final byte[] signatureData = signature.sign();

De qualquer forma thingol, agradeço a ajuda.

:S,
Conseguiu?

eu não…
Estou agora com um A3 em cartão.
e, advinha?

[quote]java.security.KeyStoreException: PKCS11 not found
at java.security.KeyStore.getInstance(KeyStore.java:645)
at br.com.bradseg.pdfsign.certificate.CertificateReader.getCertificates(CertificateReader.java:37)
at br.com.bradseg.pdfsign.MainClass.main(MainClass.java:26)[/quote]

isso na linha getInstance(“PKCS11”);

Se eu botar algum outro valor, como JKS ou PKCS12 não dá erro…
detalhe é que não funciona pq não acha chave alguma… rs**

Mas,
bem…
Alguem tem alguma dica?

A implementação do PKCS11 não vem com o Java. Você deve utilizar a implementação do fabricante do leitor do smartcard ou da OpenSC.
No meu caso usei o do fabricante.
Para isso tive que registrar um provider no Java dizendo qual DLL continha a implementação do algoritmo.

Arquivo de propriedades (configFile):

name=SmartCard  
library=C:/Arquivos de programas/Smart card bundle/opensc-pkcs11.dll

Registrando o provider:

pkcs11Provider = new SunPKCS11(configFile);  
Security.addProvider(pkcs11Provider); 

Após esse procedimento você conseguirá utilizar o PKCS11.

Obs: Eu coloquei o diretório que contém a DLL no path

Estou com o mesmo galho. Ja fiz as confs acima. Uso a dll do fabricante e nada.
To desconfiado que é o name que muda…
Quando implementei para um Token, coloquei “Token” e foi legal.
No caso de cartao, nao tem jeito…

Alguma dica nova, pessoal?

Qual é o erro que dá?

na linha ks.getInstance(“PKCS11”);

KeyStoreException -> KeyStore: PKCS11 not found;

Meu pkcs11.cfg:

name = SmartCard
library = c:\windows\system32\aetpkss1.dll (tentei com / tb)

Grato pela atencao.

Alencar

Tente colocar o diretório onde está a DLL no path

O diretorio c:\windows\system32 ja esta no path do windows XP por default.

Grato

Alencar

Pessoal, vou postar a solucao encontrada para ficar registrado a m… que é isso.

Como ja havia desenvolvido para token, ja havia instalado um software do token
no micro.
Instalei o sw do SmartCard sem desinstalar o anterior o que estava conflitando.
Apos desinstalar tudo e só instalar o do cartao, funcionou normal.
Espero que seja só isso!!! :lol:

Fica a dica.

Obrigado a todos pela atencao dispensada.

Alencar