Reconhecimento de assinatura utilizando JWS

2 respostas
rmlang

Gente, estou tendo problemas no reconhecimento de assinatura de
um aplicativo.
Preciso liberar o acesso ao disco e a outros itens de segurança
e não estou conseguindo.
Abaixo descreverei todos os passos efetuados:

Código fonte do MainFrame.java, bem simples:
package br.com.teste;
import java.io.File;
import javax.swing.JFrame;

public class MainFrame extends JFrame {
	public static void main(String args[]) {
		try {
			MainFrame frame = new MainFrame();
			frame.setVisible(true);
			frame.securityTest();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public MainFrame() {
		super("Teste de Assinatura");
		setBounds(100, 100, 400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	public void securityTest() {
		File file = new File("teste.ini"); // ** aqui está problema de acesso **
		if (file.isDirectory()) System.out.print("É um diretório");
		else System.out.println("Não é um diretório");
		if (file.isFile()) System.out.print("É um arquivo");
		else System.out.println("Não é um arquivo");
		if (file.exists()) System.out.print("EXISTE");
		else System.out.println("NÃO EXISTE");
	}
}
Este arquivo foi compilado utilizando o Java 1.5.0_09 em Linux, utilizando o mandriva powerpack+ 2006:
$ javac -version
javac 1.5.0_09
$
# uname -a
Linux beyond 2.6.12-12mdksmp #1 SMP Fri Sep 9 17:43:23 CEST 2005 i686 Intel(R) Pentium(R) 4 CPU 3.40GHz unknown GNU/Linux
#

No eclipse, pego o projeto que contem o código acima e gero o arquivo teste.jar

Seguindo a orientação do site: [url]http://java.sun.com/products/javawebstart/1.2/docs/developersguide.html[/url]
gerei os arquivos de chaves para testes da seguinte forma:

$ keytool -genkey -keystore testeKeystore -alias teste
Enter keystore password:  testeteste
What is your first and last name?
  [Unknown]:  teste
What is the name of your organizational unit?
  [Unknown]:  teste
What is the name of your organization?
  [Unknown]:  teste
What is the name of your City or Locality?
  [Unknown]:  teste
What is the name of your State or Province?
  [Unknown]:  SC
What is the two-letter country code for this unit?
  [Unknown]:  BR
Is CN=teste, OU=teste, O=teste, L=teste, ST=SC, C=BR correct?
  [no]:  yes

Enter key password for <teste>
        (RETURN if same as keystore password):
$
E depois:
$ keytool -selfcert -alias teste -keystore testeKeystore
Enter keystore password:  testeteste
$
Para verificar:
$ keytool -list -keystore testeKeystore
Enter keystore password:  testeteste

Keystore type: jks
Keystore provider: SUN

Your keystore contains 1 entry

teste, 31/10/2006, keyEntry,
Certificate fingerprint (MD5): B9:CA:5E:8A:7B:C2:2F:F2:A5:3D:40:1D:81:05:57:32
$
Assinando o teste.jar:
$ jarsigner -keystore testeKeystore /home/robert/workspace/Web/web/app/teste.jar teste
Enter Passphrase for keystore: testeteste

Warning: The signer certificate will expire within six months.
$
Verificação da assinatura no jar:
$ jarsigner -verify teste.jar
jar verified.

Warning: This jar contains entries whose signer certificate will expire within six months. Re-run with the -verbose and -certs options for more details.
$
Agora a parte "web"... Aqui está o arquivo jnlp utilizado:
<?xml version="1.0" encoding="utf-8"?>

<jnlp codebase="http://192.168.0.10/web/app/" href="teste.jnlp">
	<information>
		<title>TESTE</title>
		<vendor>TESTE</vendor>
		<homepage href="http://www.teste.com.br"/>
		<description>Teste</description>
		<description kind="one-line">Teste</description>
		<description kind="tooltip">Teste</description>
		<description kind="short">Teste</description>
		<shortcut online="true">
			<desktop/>
			<menu submenu="Teste"/>
		</shortcut>
		<offline-allowed/>
	</information>
	<resources>
		<j2se version="1.5" initial-heap-size="64m" max-heap-size="64m"/>

		<jar href="teste.jar"/>
	</resources>
	<application-desc main-class="br.com.teste.MainFrame" />
	</application-desc>
	<security>
		<all-permissions/>
	</security>
</jnlp>
versão do apache:
# httpd -version
Server version: Apache/2.0.54
Server built:   Sep 12 2005 13:03:32
#
O que foi incluido no arquivo /etc//httpd/conf/mime.types:
application/x-java-jnlp-file	JNLP jnlp
O arquivo index.html utilizado:
<HTML>
	<HEAD>
		<TITLE>TESTE JAVA WEB START</TITLE>
	</HEAD>
	<BODY>
		TESTE DE ASSINATURA
		<BR>
		<BR>
		<BR>
		<A HREF="app/teste.jnlp">Executar aplicativo</A>
	</BODY>
</HTML>

Bom, e no cliente, acessando via Internet Explorer versão 6.0.2600.0000
e utilizando o Java Versão 1.5.0 (build 1.5.0_06-b05)
Que é uma versão *inferior* a utilizada na compilação em linux, mas
certamente não está aí o problema, pois já compilei até na 1.4.2
e também não funcionou.

Continuando...

Então acessando o endereço web do tal arquivo index.html e clicando sobre o link que leva ao teste.jnlp, inicia-se normalmente o carregamento do JWS. O JWS pede para criar os atalhos tradicionais que após confirmados, inicia-se o aplicativo, mas com o seguinte detalhe no Java Console ativado do JWS:
java.security.AccessControlException: access denied (java.io.FilePermission teste.ini read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkRead(Unknown Source)
	at java.io.File.isDirectory(Unknown Source)
	at br.com.teste.MainFrame.securityTest(MainFrame.java:30)
	at br.com.teste.MainFrame.main(MainFrame.java:14)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.javaws.Launcher.executeApplication(Unknown Source)
	at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
	at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
	at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
	at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
	at com.sun.javaws.Launcher.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Ou seja, o aplicativo JWS não está tendo acesso ao disco local por problemas de permissão, como se não existisse uma assinatura. Um fato muito estranho é que não é apresentado nenhuma informação referente a assinatura nem ao fornecedor do aplicativo.

Alguém saberia me dizer o que poderia estar errado em todo esse processo?

Agradeço antecipadamente qualquer comentário ou sugestão!

[]'s

Robert Mauro Lang

2 Respostas

O

Tente limpar o cache da JVM da maquina que roda o browser. É só ir em “Java Control Panel” e dar “Delete Files…”.

Quando você carrega o JNLP ele apresenta alguma mensagem informando que o certificado não é válido e pedindo para confirmar se quer realmente rodar o programa? Como o certificado é auto-assinado, deveria dar esta mensagem.

Bem, se nada disso funcionar, aumente o nivel de log para ver se pega algum erro: “Java Console Panel” -> pasta “Advanced” -> “Debugging” e click em todas as opções.

rmlang

Oyama,

Obrigado por responder.
Sobre o cache do javaws, java control panel e delete files, eu já havia feito isso várias vezes e não resolveu.

Sobre alguma mensagem sobre certificado, não é mostrada nenhuma mensagem, o que é bem estranho.

E finalmente, no debbugging, já está tudo habilitado e se for olhar nos arquivos de log em
C:\Documents and Settings\Robert\Dados de aplicativos\Sun\Java\Deployment\log
o arquivo javaws7250.trace possui o mesmo conteúdo do console que citei anteriormente.
É uma situação bem estranha, pois já havia feito isso várias vezes sem problema
em outro computador com configurações semelhantes, mudando o hardware e a versão do java que era 1.4.2.
O agravante é que realmente preciso muito disso.

Se tiveres mais alguma sugestão, por favor poste.

Obrigado!

Criado 31 de outubro de 2006
Ultima resposta 31 de out. de 2006
Respostas 2
Participantes 2