preciso desenvolver uma aplicação para acessar dispositivos de segurança (token, smartcard) e vi que nesta ultima versao do Java 5 a Sun incluiu um provider que trata destes dispostivos através do padrão PKCS#11.
Já lí o JavaTM PKCS#11 Reference Guide, entendi como funciona e como configura, mas não consegui saber o que realmente é preciso pra poder acessar um hardware criptográfico (bibliotecas, .DLLs, .SOs, policy files, etc).
Em suma, alguém que já usou ou sabe algo a mais sobre o SunPKCS11 poderia me dar uma luz?
O provider SunPKCS11 precisa de uma API (DLL) que vem com o dispositivo a ser utilizado (token ou smartcard) para acessar o certificado digital. Você deve configurar o provider para utilizar esta API para conseguir ter acesso.
Estou precisando do JavaDoc da classe SunPKCS11, vc tem?
Att,
Guilherme
V
vieciliPJ
O javadoc eu não sei onde tem, mas o code-completion já me ajudou bastante!
Fiz essa classe teste ai embaixo, usando o SunPKCS11 e o BouncyCastle (CMS) para acessar um e-Token (Aladdin) e assinar dados, mas está ocorrendo um org.bouncycastle.cms.CMSException: key inappropriate for signature quando vou assinar os dados.
Alguém sabe como eu posso fazer pra obter uma chave apropriada?
publicclassAssinadorPKCS11{publicstaticfinalStringETOKEN_CONFIG="config/eToken.properties";privatestaticString_msgSolicitaPIN="PorfavorinformeseuPIN(NúmerodeIdentificaçãoPessoal)"+"paraacessarseuscertificadosnoToken";privatestaticString_titSolicitaPIN="Login-eToken";privatestaticString_msgSelecionaAlias="Selecioneumaidentidadeabaixo";privatestaticString_titSelecionaAlias="Identidades";protectedProviderprovider;protectedKeyStorekeyStore;protectedStringalias;/** Creates a new instance of AssinadorPKCS11 */publicAssinadorPKCS11()throwsPKCS11Exception{Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());provider=newsun.security.pkcs11.SunPKCS11(ETOKEN_CONFIG);Security.addProvider(provider);login();}publicbyte[]sign(byte[]dados)throwsPKCS11Exception{byte[]saida=newbyte[0];setAlias();try{Certificatecert=keyStore.getCertificate(alias);PrivateKeykey=(PrivateKey)keyStore.getKey(alias,null);Certificate[]chain=keyStore.getCertificateChain(alias);CertStorecertStore=CertStore.getInstance("Collection",newCollectionCertStoreParameters(Arrays.asList(chain)));CMSSignedDataGeneratorsdatagen=newCMSSignedDataGenerator();sdatagen.addSigner(key,(X509Certificate)cert,CMSSignedDataGenerator.DIGEST_SHA1);sdatagen.addCertificatesAndCRLs(certStore);CMSProcessablecontent=newCMSProcessableByteArray(dados);CMSSignedDatasdata=sdatagen.generate(content,true,"BC");// <<< exception lançada aqui !!!saida=sdata.getEncoded();}catch(Exceptione){e.printStackTrace();thrownewPKCS11Exception("Erroassinandodados",e);}returnsaida;}protectedvoidsetAlias()throwsPKCS11Exception{try{Enumeration<String>aliases=keyStore.aliases();String[]selection=Collections.list(aliases).toArray(newString[0]);if(selection!=null){if(selection.length>1){JOptionPanepane=newJOptionPane();pane.setSelectionValues(selection);pane.setOptionType(JOptionPane.OK_OPTION);do{alias=pane.showInputDialog(null,_msgSelecionaAlias,_titSelecionaAlias,JOptionPane.QUESTION_MESSAGE);}while(alias==null);}else{alias=selection[0];}}else{thrownewPKCS11Exception("Nãoexistemaliasdisponíveisnorepositório");}}catch(Exceptione){e.printStackTrace();thrownewPKCS11Exception("Nãofoipossívelobteralias",e);}}privatevoidlogin()throwsPKCS11Exception{char[]pin=getPIN();try{keyStore=KeyStore.getInstance("PKCS11");keyStore.load(null,pin);}catch(Exceptione){e.printStackTrace();thrownewPKCS11Exception("Nãofoipossívellogar",e);}}privatechar[]getPIN(){char[]saida={' '};// modo graficoJOptionPanepane=newJOptionPane();pane.setOptionType(JOptionPane.OK_OPTION);Stringpin;do{pin=pane.showInputDialog(null,_msgSolicitaPIN,_titSolicitaPIN,JOptionPane.QUESTION_MESSAGE);}while(pin==null);saida=pin.toCharArray();returnsaida;}}
PS.: também estou discutindo este tópico no Fórum da SUN