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:
[code]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");
}
}[/code]
Este arquivo foi compilado utilizando o Java 1.5.0_09 em Linux, utilizando
o mandriva powerpack+ 2006:
[code]$ 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® Pentium® 4 CPU 3.40GHz unknown GNU/Linux
#[/code]
No eclipse, pego o projeto que contem o código acima e gero o arquivo teste.jar
Seguindo a orientação do site: http://java.sun.com/products/javawebstart/1.2/docs/developersguide.html
gerei os arquivos de chaves para testes da seguinte forma:
[code]$ 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
(RETURN if same as keystore password):
$[/code]
E depois:
$ keytool -selfcert -alias teste -keystore testeKeystore
Enter keystore password: testeteste
$
Para verificar:
[code]$ 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
$[/code]
Assinando o teste.jar:
[code]$ 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.
$[/code]
Verificação da assinatura no jar:
[code]$ 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.
$[/code]
Agora a parte “web”…
Aqui está o arquivo jnlp utilizado:
[code]<?xml version="1.0" encoding="utf-8"?>
TESTE TESTE Teste Teste Teste Teste <jar href="teste.jar"/>
</resources>
<application-desc main-class="br.com.teste.MainFrame" />
</application-desc>
<security>
<all-permissions/>
</security>
[/code]
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:
[code]
TESTE JAVA WEB START
TESTE DE ASSINATURA
Executar aplicativo
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