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?