2009-03-03 3 views
4

Мне нужен апплет, чтобы открыть сокет и общаться с сервером, прослушивающим локальный хост, к которому загружен апплет (машина конечного пользователя).Может ли подписанные апплеты подключаться к другому хосту, из которого они происходят?

вопреки тому, что я читал о безопасности апплета, кажется, что даже подписанные апплеты не может открыть сокет к другому хосту, с которого они были загружены (на той же машине, он прекрасно работает)

Я заверенной апплет с помощью -selfcert, подписал его с помощью Jarsigner, и до сих пор, когда он пытается открыть сокет к другому хозяину, я получаю:

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

Я даже попытался изменить файл политики Java, хотя и с подписанные апплеты Не требуется, чтобы сделать это:

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

Что такое сделка с sigend апплетов, они могут Connet на другой хост или нет?

ответ

1

Да, когда вы загружаете свой апплет, если вы решите принять его сертификат и доверять ему, ему предоставляется AllPermission, который включает SocketPermission. Я написал подписанный апплет перед тем, как он соединяется с хостом, отличным от того, с которого он был загружен. Вы можете попробовать временно изменить свой файл политики Java, чтобы просто

grant { 
    permission java.security.AllPermission; 
}; 
  • Посмотрите в файле политики, чтобы увидеть, если он определяет любые другие места policy.url, возможно, они мешают.
  • Возможно, проверьте настройки браузера для javascript.
  • Убедитесь, что вы приняли сертификат для апплета и установили его в свой список сертификатов сайта.
  • Убедитесь, что у вас есть линия кода grantBase, такая же, как и в кодовой базе манифеста апплета.
  • Вы можете попробовать распечатать список разрешений, которые ваш апплет имеет перед попыткой подключения.
  • Вы можете попробовать программно предоставить AllPermission из апплета.
+0

@John, кажется, что только предоставление разрешения java.security.AllPermission; но это все еще единственный способ заставить его работать. Я сделал апплет для печати своего кода, и это кажется прекрасным. Очень расстраивающе, но, по крайней мере, благодаря вам, я знаю, что это действительно связанная с безопасностью связь, а не какая-то странная проблема. – adilei

+0

@John, я собираюсь принять этот ответ, так как это правда - апплет может открыть сокет другому хосту. Я собираюсь задать следующий вопрос, хотя, если вы заинтересованы в том, чтобы следовать за мной там. Привет, Ади. – adilei

+0

Как вы можете «программно предоставить AllPermission»? В чем смысл того, чтобы менеджер безопасности предотвратил выполнение вредоносного кода, если код может просто предоставить себе разрешения на выполнение того, что он хочет? Это даже возможно, этого не должно быть !. @ Джон, если вы прочтете это, не могли бы вы удалить эту последнюю пулю, чтобы другие люди не пошли по неправильному пути, пытаясь реализовать то, что явно запрещает Java-стандарт. Либо это, либо объясните, почему я ошибаюсь. Благодаря! –