Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problemas no Windows 11 / Java 17 #411

Open
icemagno opened this issue Jul 19, 2024 · 0 comments
Open

Problemas no Windows 11 / Java 17 #411

icemagno opened this issue Jul 19, 2024 · 0 comments

Comments

@icemagno
Copy link

icemagno commented Jul 19, 2024

Para todos que enfrentarem os mesmos problemas que eu:

Consegui acessar meu token "Giesecke & Devrient GmbH" com driver baixado do site da AC-Defesa em casa normalmente usando a versão Demoiselle 4.3.0 embora eu suspeite que o Demoseille não esteja realmente usando o driver do AC-DEFESA baixado do site, pois se eu der um config.addDriver( ... ) na DLL deles em C:\Users\FULANO\sdk-web\libs , eu recebo um erro.

Lá eu tenho o Windows 10 e Java 17.

Em outro PC, no trabalho, tenho o Windows 11 e Java 17. Neste, comecei a enfrentar dois problemas.

O primeiro, referente à liberação de módulos:

java.lang.IllegalAccessException: class br.com.j1scorpii.services.TestService cannot access class sun.security.pkcs11.SunPKCS11 (in module jdk.crypto.cryptoki) because module jdk.crypto.cryptoki does not export sun.security.pkcs11 to unnamed module @68267da0

A solução para esse problema é adicionar uma variável de ambiente antes de executar seu programa.

--add-opens=java.base/java.security=ALL-UNNAMED  --add-opens=jdk.crypto.mscapi/sun.security.mscapi=ALL-UNNAMED --add-opens=java.base/com.sun.crypto.provider=ALL-UNNAMED --add-opens=jdk.crypto.cryptoki/sun.security.pkcs11=ALL-UNNAMED

O segundo problema está relacionado à carga da DLL do driver, e vai lançar esse erro:

Caused by: org.demoiselle.signer.core.keystore.loader.DriverNotAvailableException: Nenhum drive foi encontrado.
	at org.demoiselle.signer.core.keystore.loader.implementation.DriverKeyStoreLoader.getKeyStoreFromDrivers(DriverKeyStoreLoader.java:201)
	at org.demoiselle.signer.core.keystore.loader.implementation.DriverKeyStoreLoader.getKeyStore(DriverKeyStoreLoader.java:91)
	at org.demoiselle.signer.core.keystore.loader.implementation.MSKeyStoreLoader.getKeyStore(MSKeyStoreLoader.java:89)

Desabilitando o MSCAPI ( config.setMSCAPI_ON(false); ) só piora o problema, pois mesmo informando o nome do driver encontrado, a biblioteca não é capaz de carregar ele, levantando o erro "Nenhum Drive foi Encontrado"

Este problema está relacionado com o erro relatado no StackOverflow e com o arquivo

core/src/main/java/org/demoiselle/signer/core/keystore/loader/implementation/DriverKeyStoreLoader.java

Mais especificamente nas linhas 130, 131 e 132:

Constructor<?> construtor = Class.forName("sun.security.pkcs11.SunPKCS11")
		.getConstructor(new Class[] { InputStream.class });
Provider pkcs11Provider = (Provider) construtor.newInstance(new Object[] { confStream });

O StackOverflow explica o problema. Para solucionar, eu criei um método pouco ortodoxo, mas que resolveu pra mim:
Simplesmente criei um arquivo de configuração temporário e passei como argumento normalmente.
Depois apaguei o arquivo.

As alterações são essas ( arquivo DriverKeyStoreLoader.java ):

public KeyStore getKeyStoreFromDriver(String driverName, String driverPath) {
	Configuration.getInstance().addDriver(driverName, driverPath);
	KeyStore keyStore = null;
	formatter = new Formatter();

	String pkcs11ConfigSettings = formatter.format(PKCS11_CONTENT_CONFIG_FILE, driverName, driverPath).toString();
	// byte[] pkcs11ConfigBytes = pkcs11ConfigSettings.getBytes();    <<<---- COMENTEI
	// ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11ConfigBytes); <<<---- COMENTEI

	try {
                // -------------    MINHA ADIÇÂO AO CÓDIGO ------------------ // 
                String configTempFolder = "/tmp";
                new File( configTempFolder ).mkdir();
                String configFileName = configTempFolder + "/config-provider.tmp";
                new File( configFileName ).delete();
		BufferedWriter writer = new BufferedWriter( new FileWriter( configFileName ) );
		writer.write( pkcs11ConfigSettings );
		writer.close();
                // ----------------------------------------------------------------- // 

		Provider pkcs11Provider = Security.getProvider("SunPKCS11");
		pkcs11Provider = pkcs11Provider.configure( configFileName );    <<<---- MODIFIQUEI

		Security.addProvider(pkcs11Provider);
                new File( configFileName ).delete();   <<<---- ADICIONEI
		// confStream.close();                         <<<---- COMENTEI
		Method login = Class.forName("sun.security.pkcs11.SunPKCS11").getMethod("login",
				new Class[] { Subject.class, CallbackHandler.class });
		login.invoke(Security.getProvider(pkcs11Provider.getName()), new Object[] { null, this.callback });
		keyStore = KeyStore.getInstance(PKCS11_KEYSTORE_TYPE, pkcs11Provider.getName());
		keyStore.load(null, null);

                ... segue normal daqui em diante ...

Esse método de usar arquivo externo não deve ser o mais indicado, mas contornou o problema. Agora driver passou a ser carregado corretamente.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants