JNLP: Зареждане на неподписан код в рамките на подписания код

Имаме затруднения да преодолеем грешката със смесен код за Java webstart. В обобщение, имаме нашия основен JNLP файл, подписали сме целия си код, който той зарежда директно. Добавихме опцията за всички разрешения към основния JNLP. Основният клас, който зарежда, също идва от подписан буркан.

Когато основният клас стартира малко по-надолу по пътя, той задейства някои неща, които трябва да заредят някои неподписани ресурси, които са изтеглени от JNLP B. Никой от ресурсите на JNLP B не е подписан и не се нуждаят от специални разрешения.

Целият подписан код е настроен въз основа на документацията за смесен код от Oracle и jar файловете са зададени с манифести на „Trusted-Library: true“ преди подписване.

Когато неподписаният код се опита да бъде зареден от подписания код, получаваме грешка, че класът не е намерен, както следва:

java.lang.reflect.InvocationTargetException
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.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

    Caused by: java.lang.NoClassDefFoundError: org/some/external/package/that/is/not/signed
at org.our.signed.package.main(Main.java:87)
... 9 more

    Caused by: java.lang.ClassNotFoundException: org.some.external.package.that.is.not.signed
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 10 more

Ето сценария в JNLP:

JNLP A: (обобщено)

<jnlp spec="1.5+" codebase="...." href="/bg......">
  <information>
   ...etc
  </information>
   <security>
     <all-permissions/>
   </security>
   <resources>
      <j2se version="1.6+" initial-heap-size="80m" max-heap-size="256m" href="http://java.sun.com/products/autodl/j2se"/>
      <jar href="/bgsignedJar_1.jar" download="eager" main="true"/>
      <jar href="/bgsignedJar_2.jar" download="eager" main="false"/>
      <extension name="unsigned_ext" href="/bgunsigned.jnlp"/>
  </resources>
  <application-desc main-class="(FROM SIGNED CLASS in signedJar_1.jar)"/>
</jnlp>

JNLP B (зареждащото устройство unsigned.jnlp)

<jnlp spec="1.5+" codebase="....." href="/bg......">
  <information>
   ...etc
  </information>
  <resources>
    <jar href="/bgunsigned.jar"/>
  </resources>
  <component-desc/>
</jnlp>

Отбелязахме, че изключенията за защита работят правилно, защото ако преместим неподписания буркан в JNLP, който има всички разрешения и подписани буркани, получаваме очакваните изключения за сигурност, с които Java няма да ни позволи да смесваме подписания код Trusted-Library: истински и неподписан код без манифестни атрибути.

Идеи? Има ли причина зареждането на класове да не може да намери java файловете от неподписания код? Има ли нещо специално, което пропускаме, за да позволим на подписания код да изпълнява неподписан код? Виждал съм само случаите, в които хората имат проблеми с получаването на неподписан код, за да изпълняват подписан код, което мога да разбера.


person rmmeans    schedule 19.04.2012    source източник


Отговори (1)


Зареждащото устройство за класове на надеждна библиотека е родител (в смисъл на делегиране на зареждащото средство за класове) на (евентуално ненадеждното) зареждащо средство за класове на аплети. Мислете за него така, сякаш е зареждащият клас за зареждане. Така че ненадеждните класове могат да се свързват с класовете на надеждната библиотека, но не и обратното. Без да си правите труда да променяте манифестите и да използвате WebStart, можете да изпробвате тези неща, като добавите вашия доверен клас с -Xbootclasspath/a: и вашите ненадеждни класове с -classpath (по този начин функцията беше изпробвана, преди да бъде внедрена).

JNLPAppletLauncher е пример за това как надеждните библиотеки да извикват код на аплет. Зареждащият клас аплет може да бъде получен с Thread.currentThread().getContextClassLoader() и това е просто отражение от там. Писането на код за безопасна надеждна библиотека е трудно. Не забравяйте, че не можете да се доверите на ненадежден код.

person Tom Hawtin - tackline    schedule 19.04.2012
comment
Значи казвате, че надеждният код изобщо не може да изпълнява ненадежден код? Например, нашето приложение е вътрешен CRM, който се зарежда чрез уеб стартиране (без аплети). Нашият CRM понякога се нуждае от достъп до локалната файлова система (причината за подписване / пълно разрешение). Нашият CRM също се нуждае от някои други буркани, но за други неща - като swingx.jar за потребителския интерфейс, комплекти за помощ като jhall.jar и т.н. Така че тогава нашият доверен код не може да получи достъп до тези други буркани? Ще трябва ли да изтеглим нашите доверени функции в техните собствени буркани и да подпишем само тези и да оставим основното ни ядро ​​да бъде ненадеждно, за да можем да използваме и ненадеждни буркани? - person rmmeans; 20.04.2012
comment
(Аплетът и приложението/аплетът JNLPWebStart са по същество взаимозаменяеми.) Не можете да имате доверен код, разчитащ на поведението на ненадежден код. Можете да имате надежден код като библиотека, но трябва да сте много внимателни, че всяка операция, извършена върху него, е безопасна. Не можете просто да имате метод, който, да речем, записва някои данни в определено име на файл (и остава защитен). - person Tom Hawtin - tackline; 20.04.2012
comment
@TomHawtin-tackline Ако кодът в разширението в пясъчна кутия беше цифрово подписан, щеше ли да създаде проблем? - person Andrew Thompson; 20.04.2012
comment
@AndrewThompson Имате предвид дали имате доверена библиотека с доверен аплет/приложение? От гледна точка на зареждане на клас, това ще се държи по същия начин като доверена библиотека с ненадеждни аплет/приложение. Също така, ако има доверие, но не е имал <all-permissions/>. / Забележете, наистина се нуждаете от отражение само за достъп до първия конструктор/метод/поле. Ако това дава обект от клас, който разширява тип в доверената библиотека (или Java библиотека), тогава по-нататъшното взаимодействие може да се извърши чрез това. - person Tom Hawtin - tackline; 20.04.2012
comment
@TomHawtin-tackline Опитах се да преместя нашия основен зареждащ модул към неподписан код, премахнах всички perms от основния jnlp и преместих целия доверен код в неговите собствени буркани, с техните собствени jnlp и ги подписах. Все още получаваме грешки, които казват, че нашият подписан код, който се изпълнява от jnlp с all-perms, не е упълномощен. За да разрешим нашия проблем, ние се върнахме към последното предложение на уебсайта на Oracle за подписване на всичко, след което нашите jar, които са на трети страни, са в jnlp, които нямат модела за защита на всички разрешения. Сега се зарежда без грешка, но вероятно не е идеален. - person rmmeans; 20.04.2012
comment
Искате да кажете, че ако имате доверена библиотека.. Аах! trusted-library напълно ми беше излязло от ума. - person Andrew Thompson; 21.04.2012