безопасность osgi с подписанным военным файлом

Кто-нибудь может мне помочь?

Я хотел бы использовать безопасность osgi в своем приложении. Поэтому я написал пакет безопасности, который предоставляет все пакеты, подписанные моим хранилищем ключей. Один из моих пакетов — военный файл (Bundle10). Если я запускаю сервер (glassfish с felix), на котором я развернул военный пакет, я получаю исключение java.lang.SecurityException:

Exception while processing WEB-INF/classes/com/xy/SomeClass.class inside 
file:/tmp/osgiapp430591893594363740/WEB-INF/lib/Bundle10.jar of size 2.111

java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:221)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:176)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:288)
at java.util.jar.JarVerifier.update(JarVerifier.java:199)
at java.util.jar.JarFile.initializeVerifier(JarFile.java:327)
at java.util.jar.JarFile.getInputStream(JarFile.java:395)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive.getEntry(InputJarArchive.java:244)
at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:166)
at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:133)
at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:348)
at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:70)
at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:307)
at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:296)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)

Я подписал пакет с плагином maven jasigner.


person bg89    schedule 07.10.2013    source источник
comment
я получаю исключение для каждого класса в WEB-INF/classes/, но приложение работает без проблем.   -  person bg89    schedule 07.10.2013


Ответы (2)


Исключение сообщает вам, что дайджест в signers.sf для основного раздела манифеста неверен. Это раздел, содержащий метаданные OSGi. Получается, похоже, что эта ВОЙНА превратилась в пакет после того, как была подписана?

Подписать довольно сложно. Манифест содержит 2 раздела: раздел main и раздел для каждого ресурса в банке. Каждый из этих разделов ресурсов начинается с атрибута Name:, определяющего путь к ресурсу. Если вы хотите подписать JAR, вы сначала создаете манифест и раздел ресурсов для каждого атрибута, где раздел ресурсов содержит один или несколько дайджестов (SHA, MD5 и т. д.) ресурса.

У вас может быть несколько подписантов, поэтому вам нужно выбрать имя для каждого файла подписи. В этом файле подписи у вас снова есть основной раздел и несколько разделов ресурсов. В основном разделе у вас должен быть один или несколько

X-Digest-Manifest-Attributes: <X digest of manifest main section>

X снова может быть одним из используемых алгоритмов дайджеста. Разделы ресурсов в манифесте должны содержать дайджест соответствующего раздела ресурсов в манифесте (не самого ресурса!).

      MANIFEST.MF               <>.SF
      +--------------+  
 Main |Bundle-Sym .. |    <---  X-Digest-Manifest-Main-Attributes: 345678...
      |Bundle-Vers.. |   
      +--------------+ 
 Name |Name: a.class |    <---  Name: a.class
      |X-Digest: 56A5|          X-Digest:  4789...
      +--------------+
      |Name: b.class |    <---  Name: b.class
      |X-Digest: ACE |          X-Digest:   65123...
      +--------------+

Короче говоря, ваш основной раздел манифеста не подписан должным образом. Вам либо не хватает -Digest-Manifest-Main-Attributes в файле ‹>.SF, либо он (вероятно) был рассчитан до того, как вы вычислили заголовки OSGi.

Если вы используете bnd, вы можете подписать пакет непосредственно из bnd.

person Peter Kriens    schedule 07.10.2013
comment
Как мне подписать бандл с помощью maven-bundle-plugin (bnd) или как исправить проблему, если она была рассчитана до того, как я вычислил заголовки OSGi - person bg89; 07.10.2013
comment
Я создал военный файл с помощью maven и подписал его вручную с помощью jarsigner, но снова получаю исключение!? - person bg89; 08.10.2013
comment
что происходит, когда вы проверяете JAR? jarsigner -проверить file.war - person Peter Kriens; 10.10.2013
comment
Я получаю проверенную банку. - person bg89; 16.10.2013
comment
И если я разверну пакет в феликсе, я получу исключения из вопроса - person bg89; 16.10.2013

Проблема вызвана процессом установки GlassFish WAB. Если WAB содержит отдельные файлы классов в каталоге WEB-INF/classes, они упаковываются в новый файл JAR. Это ломает подпись.

На мой взгляд, это ошибка GlassFish. Я создал сообщение об ошибке GlassFish: https://java.net/jira/browse/GLASSFISH-20861

Обходной путь: упакуйте свободные файлы классов в файл JAR и поместите его в каталог WEB-INF/lib. Затем добавьте файл JAR в запись Bundle-ClassPath MANIFEST.MF.

person Jochen Kraushaar    schedule 18.10.2013