“de java.de sécurité.AccessControlException: accès refusé” l'exécution d'une Applet Java signée
J'ai un petit Applet Java et j'ai un problème ennuyeux. J'ai signé mon POT avec mon propre fichier de clés à l'aide de jarsigner outil (à la suite de ces instructions).
L'Applet Java de téléchargement d'un signé POT et essaie de le lancer avec une classe étendue de URLClassLoader. Ce POT essaie d'exécuter cette ligne de code:
ClassLoader.getSystemClassLoader().getResource("aResource");
Il échoue avec une grande trace de la pile fini par:
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1476)
at test.SecondJAR.main(SecondJAR.java:8)
(Ligne 8 de test.SecondJAR correspond à getResource(...)
méthode
Lorsque l'Applet Java est lancé, l'utilisateur est invité à accepter le certificat, si il/elle fait confiance à l'éditeur:
Même si je l'accepte, l'exception s'est produite. Même si j'ai installer le certificat, et le message est automatiquement acceptée, l'exception s'est produite.
J'ai essayé ceci:
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
ClassLoader.getSystemClassLoader().getResource("aResource");
return null;
}
});
Et il ne fonctionne pas avec la même exception.
Toute aide serait appréciée!
getSystemClassLoader
ou getResource
mais la trace de la pile, dit getContextClassLoader
(l'utilisation de ce qui est rarement une bonne idée). Peut-être un peu plus de trace de pile serait utile.Si l'exception est levée par le code téléchargé. Par défaut
URLClassLoader
sera autorisations d'utilisation (par ProtectionDomain
) en fonction de l'endroit où le code a été téléchargé (Même Origine). Il est très difficile de faire ce genre de truc. Avez-vous vraiment besoin de faire cela? Apparemment une raison commune pour essayer ce genre de chose est d'éviter d'avoir à garder la signature de code. Mobile, le code doit être signé pour être digne de confiance pour une bonne raison!J'ai un Downloader Applet qui obtient un JAR généré. ce POT est à chaque fois différent et différent pour chaque utilisateur. Je dois le télécharger à chaque fois et de l'exécuter. le second BOCAL est signé! il doit exister un moyen de le faire ;-(
J'ai édité la question. maintenant il y a la trace de la pile complète. l'exception est lancée par le second BOCAL dans le
getResource(...)
ligne.
OriginalL'auteur logoff | 2012-07-03
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé la réponse!
J'ai suivi les directives de Andrew Thomson et j'ai créé un custom SecurityManager. Mon petit gestionnaire de sécurité ressemble à ceci:
C'est un oubli de gestionnaire de sécurité qui accepte toutes les autorisations. Elle devrait être améliorée en permettant seulement un système de chargeur de classe dans l'exécution.
À utiliser mon laid SecurityManager j'ai ajouté ces lignes au début de l'Applet Java
start()
méthode:Avec cette solution de contournement, tout le processus a fonctionné comme prévu!
Peut-être qu'il existe d'autres (mieux) des solutions, mais il a travaillé pour moi.
Merci à vous tous!
...en tant que "pour l'exemple". Imaginez le code en cours de lancement, crée un
JFrame
que les appelssetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
- apparemment innocente, mais elle met fin à la JVM qui exécute le cadre, ou probablement aussi l'applet. Typique de confiance applet Gestionnaire de Sécurité (SM) ne permettrait pas à l'appel deSystem.exit(n)
. Cette applet peut-être en cours d'exécution dans une page web où plusieurs applets partager le JVM. C'est un "invité" dans la JVM, mais il est effectivement "gravure de la guest house down" pour la fin de la JVM!Je suis d'accord à 100%, mais de toute façon, comme je l'ai mentionné, il est possible de créer un SecurityManager permettant seulement à des autorisations spécifiques. Je comprends les inconvénients de l'ajout de ces types de privilèges, mais c'est la seule façon que j'ai trouvée. J'attends quelqu'un d'autre me montrer une bonne, mieux et de manière standard pour atteindre mon objectif: exécuter signé ressources chargées au moment de l'exécution.
Avec ce gestionnaire de la sécurité de toute applet (s'exécutant dans le même processus) sera en mesure de faire quoi que ce soit. C'est vraiment très mauvais. En Java, les autorisations de code sont généralement basées sur
CodeSource
livré parProtectionDomain
(il y a aussi le non-publicAppContext
mécanisme qui est vraiment bizarre).OK. 1) vérifiez le code de base des classes pour demander la permission. Est-ce code vous attendez-vous? 2) Quelles autorisations faut-il avoir? Si vous attendez que le système de fichiers local et l'accès à l'imprimante, pourquoi est-il tente d'accéder à un site étranger, ou à base de code..?
OriginalL'auteur logoff
Le problème est que le JRE ne considère que le code dans le original à base de code pour être digne de confiance. Deux solutions possibles sont:
PrivilegedAction
& appel deAccessController.doPrivileged(..)
méthode (tout m'est apparu comme une possibilité, pas sûr si je comprends la portée de elle, complètement non testé).AccessController.doPrivileged(...)
, mais j'ai réalisé qu'elle ne réussit pas trop. Comment puis-je configurer un gestionnaire de sécurité personnalisé?Réglage d'un responsable de la sécurité dans une applet peut définir pour les autres applets.
le second BOCAL n'est pas une applet. mais de toute façon, comment puis-je configurer un gestionnaire de sécurité pour éviter cette exception?
Mais il s'exécutant dans le même processus, à droite?
pour sûr. l'applet lance une méthode main de l'autre POT.
OriginalL'auteur Andrew Thompson