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
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?
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.
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();
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**
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…
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: