Одним из требований (подписанных) JAR-файлов является то, что манифест является первой записью в ZIP-файле.Причина в том, что манифест содержит дайджесты для ресурсов в JAR в разделе «Имя» манифеста.
Name: foo/bar/Xyz.class
Digest-SHA-1: 2A345C6D7890F2A345C6D7890F2A345C6D7890F
Digest-MD5: 7890F2A345C6D789
Эти дайджесты необходимы для загрузки других ресурсов и их проверки.Файл подписавшего (.SF) содержит дайджест для этого Раздела имени также в формате манифеста.Файл .DSA или .RSA затем содержит подпись для этого файла .SF.
Если бы манифест был не первым, вы не могли бы передать JAR-файл, вам всегда нужно было бы скопировать его на диск и затем открыть его.из файла, так что у вас есть произвольный доступ.сначала запустив Manifest, JarInputStream может загрузить ресурсы, когда они прибудут, и немедленно проверить их.К сожалению, инструмент Jar Signer не основан на стандартной библиотеке криптографии JDK и в некотором роде странен.Причина, по которой вы получаете другую ошибку, заключается в том, что он, вероятно, открывает JAR как файл и, следовательно, может произвольно обращаться к манифесту, поэтому ему все равно, что манифест не первый.
Модель очень гибкая, но сложная для понимания.Это позволяет использовать несколько подписчиков, каждый из которых может частично подписать пакет.OSGi добавил дополнительное требование, чтобы частичная подпись не использовалась.Без этого требования возникла некоторая проблема с безопасностью, которую я помню.
Обратите внимание, что любой может добавить ресурсы в ваш пакет, и это не будет обнаружено, если они также не добавлены в раздел Имя в манифесте.Однако любой ресурс, указанный в манифесте, должен соответствовать указанным дайджестам.