[Resolvido] SunMSCAPI X SunPKCS11 - Identificar e carregar Token Certificado A3

Duvida Pessoal .

APÓS varias tentativas eu CONSEGUI efetuar a assinatura do xml com o meu certificado.
mas para eu conseguir assinar meu xml eu precisei localizar a .DLL e criar um arquivo .CFG e dai
funcionou beleza !!!

A duvida é a seguinte :

como farei pra localizar as DLLs utilizadas pelo meus clientes ?

Pelo que eu li ate agora existe uma maneira diferente de fazer essa assinatura que seria pelo repositório do windows
como seria para fazer desse jeito ?? pois até agora não achei exemplos

Obrigado Galera

Cara…

Algo parecido com isso :

				
// Obtém um keystore com os certificados pessoais do usuário logado no windows
KeyStore keyStore = KeyStore.getInstance("Windows-MY", providerName);			
		
// Carrega o keystore
keyStore.load(null, null);

[quote=pedruhenrik][quote]
O que essa linha faz?
KeyStore ks = KeyStore.getInstance(“Windows-MY”, “SunMSCAPI”);
[/quote]

até onde eu entendi ela q vai criar a instancia keystore p/ poder acessar os certificados disponiveis no windows.

o primeiro parametro é o tipo de keystore,
nesse caso o keystore do windows,

tb tem o Windows-ROOT mas oq deu certo p/ mim foi o Windows-My msm.

outra maneira tb de acessar o token:

Provider p = new
sun.security.pkcs11.SunPKCS11("C:\\NFE\\token.cfg");
Security.addProvider(p);

KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, senha.toCharArray());

o arquivo token.cfg:

name = eToken //o name do token no meu caso 1 token Aladin
library =  C:\WINDOWS\system32\eTpkcs11.dll //passa a dll utilizada pelo token

e ai o processo de assinatura é quase o mesmo do token A1(se não o mesmo…rsrs)

att,[/quote]

no meu pc so tenho a dll opensc-pkcs11.dll
gostaria de saber como faço para conseguir essa dll que vc mencionou. porque a que eu estou utilizando aqui dá o seguinte ero:


java.security.KeyStoreException: PKCS11 not found
	at java.security.KeyStore.getInstance(KeyStore.java:705)
	at org.opensc.util.Test.main(Test.java:20)
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11-eToken
	at sun.security.jca.GetInstance.getService(GetInstance.java:100)
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:218)
	at java.security.Security.getImpl(Security.java:724)
	at java.security.KeyStore.getInstance(KeyStore.java:702)
	... 1 more

eu consegui resolver . No computador que eu desenvolvi não tinha os drivers do Aladdin PRO.
resumidamente, pra eu ter essa dll só faltava todos os drivers fornecido por mim pela propria certificadora:

meu certificado é da CERTISIGN e la na pagina deles tem o driver especifico:
https://www.certisign.com.br/atendimento-suporte/downloads/tokens/windows

funcionou!

[quote=josemdvdf]Pessoal, já consegui fazer a leitura do Token a3 e assinar um arquivo. Mas estou com o seguinte problema: o sistema que estou trabalhando gera um certificado que pode ser usado somente nele. No entanto quando o usuário instala o certificado e digita a senha, ela nunca mais é solicitada no mesmo computador.

Alguém sabe dizer se isso é configurável no navegador ou se isso é alguma configuração de leitura ? existe a possibilidade de sempre forçar o usuário a digitar a senha ?

Obrigado.[/quote]

Bom dia a todos.

cara tem como postar teu código que tu assina o xml ?

E me passar o teu xml ?

porque eu estou tentando fazer de uma forma aqui, mas ele não está assinando…

mas também não da erro nenhum…

eu faço isso

  Provider provider = new sun.security.pkcs11.SunPKCS11("C:/SmartCard.cfg");  
	        Security.addProvider(provider);   
	  
	        KeyStore ks = KeyStore.getInstance("pkcs11", provider);  
	        try {  
	            ks.load(null, senha.toCharArray());  
	        } catch (IOException e) {  
	            throw new Exception("Senha do Certificado Digital incorreta ou Certificado inválido.");  
	        }  
	  
	        KeyStore.PrivateKeyEntry pkEntry = null;  
	        Enumeration<String> aliasesEnum = ks.aliases();  
	        while (aliasesEnum.hasMoreElements()) {  
	            String alias = (String) aliasesEnum.nextElement();  
	            if (ks.isKeyEntry(alias)) {  
	                pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,  
	                        new KeyStore.PasswordProtection(senha.toCharArray()));  
	                privateKey = pkEntry.getPrivateKey();  
	                break;  
	            }  
	        }  
	  
	        X509Certificate cert = (X509Certificate) pkEntry.getCertificate();  
	        info("SubjectDN: " + cert.getSubjectDN().toString());  
	  
	        KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();  
	        List<X509Certificate> x509Content = new ArrayList<X509Certificate>();  
	  
	        x509Content.add(cert);  
	        X509Data x509Data = keyInfoFactory.newX509Data(x509Content);  
	        keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));