2009-03-03 5 views
4

J'ai besoin d'une applet pour ouvrir une socket et communiquer avec un serveur en écoutant l'hôte local sur lequel l'applet a été téléchargé (la machine de l'utilisateur final).Les applets signées peuvent-elles se connecter avec un hôte différent d'où elles proviennent?

contrairement à ce que j'ai lu sur la sécurité de l'applet, il semble que même signé applets ne peuvent pas ouvrir une socket à un autre hôte à partir duquel ils ont été téléchargés (sur la même machine, il fonctionne parfaitement)

Je certifié l'applet en utilisant -selfcert, signé en utilisant jarsigner, et encore, chaque fois il tente d'ouvrir un socket à un autre hôte, je reçois:

Java.lang.Exception: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:9999 connect,resolve)

J'ai même essayé de changer le fichier de stratégie Java, bien qu'avec applets signées il n'est pas tenu de le faire:

grant codeBase "http://applethost:8080/socket" { permission java.security.AllPermission; permission java.lang.RuntimePermission "usePolicy"; };

Quel est le problème avec les applets sigend, peuvent-ils connet à un hôte différent ou non?

Répondre

1

Oui, lorsque vous chargez votre applet, si vous choisissez d'accepter son certificat et que vous lui faites confiance, il reçoit AllPermission, qui inclut SocketPermission. J'ai écrit une applet signée avant de se connecter à un hôte autre que celui à partir duquel il a été chargé. Vous pouvez essayer de modifier temporairement votre fichier de stratégie java pour avoir juste

grant { 
    permission java.security.AllPermission; 
}; 
  • Regardez dans votre fichier de stratégie pour voir si elle définit tout autre endroit de policy.url, peut-être qu'ils ingèrent.
  • Vérifiez les paramètres de votre navigateur pour javascript peut-être.
  • Assurez-vous que vous avez accepté le certificat de l'applet et qu'il est installé sur votre liste de certificats de site.
  • Assurez-vous que la ligne grantBase que vous avez est la même que la base de code dans le manifeste de votre applet.
  • Vous pouvez essayer d'imprimer la liste des autorisations de votre applet avant d'essayer la connexion.
  • Vous pouvez essayer d'accorder AllPermission par programme à partir de l'applet.
+0

@John, il semble que l'octroi de l'autorisation java.security.AllPermission; fonctionne mais c'est toujours la seule façon de le faire fonctionner. J'ai fait imprimer l'applet de son codeBase et ça me semble bien. Très frustrant, mais au moins merci à vous, je sais que c'est lié à la sécurité et pas un problème étrange. – adilei

+0

@John, je vais accepter cette réponse car c'est vrai - il est possible pour une applet d'ouvrir une socket à un hôte différent. Je vais poser une question de suivi si vous êtes intéressés à me suivre là-bas. À la vôtre, Adi. – adilei

+0

Comment pouvez-vous "accorder par programme AllPermission"? Quel est le point d'avoir un gestionnaire de sécurité pour empêcher l'exécution de code malveillant si le code peut simplement s'accorder des autorisations pour faire ce qu'il veut? C'est même possible, ça ne devrait pas être! @John, si vous lisez ceci, pourriez-vous s'il vous plaît supprimer cette dernière puce pour empêcher d'autres personnes de suivre la mauvaise piste en essayant d'implémenter quelque chose que le standard Java empêche explicitement. Soit ça ou expliquer pourquoi je me trompe. Merci! –

Questions connexes