我有一个将 OSGI 捆绑包作为自签名 jar 文件提供服务的网络服务器。这些是在我的设备上使用 OSGI API 下载和安装的。我在 knopflerfish OSGI 中启用了安全性,并用我的公钥将其指向一个密钥库。我想验证我下载的代码不会被 MITM 攻击或其他方式篡改。
为了测试这一点,我尝试稍微更改并重新编译我之前签名和验证的一个捆绑包,使用 7zip 解压缩旧的签名 jar 和新编译的 jar,并复制 META-INF 文件夹的内容,覆盖仍然未签名的 MANIFEST.MF 并提供 .SF 和 .RSA 文件。当我尝试下载并安装这个 jar 文件时,我确实遇到了一个错误:
[stderr] org.osgi.framework.BundleException: Failed to install bundle: java.io.IOException: MANIFEST.MF must be first in archive when using signatures.
[stderr] at org.knopflerfish.framework.Bundles.install0(Bundles.java:178)
[stderr] at org.knopflerfish.framework.SecurePermissionOps$14.run(SecurePermissionOps.java:727)
[stderr] at org.knopflerfish.framework.SecurePermissionOps$14.run(SecurePermissionOps.java:723)
[stderr] at java.security.AccessController.doPrivileged(Native Method)
[stderr] at org.knopflerfish.framework.SecurePermissionOps.callInstall0(SecurePermissionOps.java:722)
[stderr] at org.knopflerfish.framework.Bundles.install(Bundles.java:118)
[stderr] at org.knopflerfish.framework.BundleContextImpl.installBundle(BundleContextImpl.java:109)
[stderr] at no.aventi.sam.Activator.handleEvent(Activator.java:190)
[stderr] at org.knopflerfish.bundle.event.TrackedEventHandler.handleEventSubjectToFilter(TrackedEventHandler.java:71)
[stderr] at org.knopflerfish.bundle.event.InternalAdminEvent.deliverToHandles(InternalAdminEvent.java:153)
[stderr] at org.knopflerfish.bundle.event.InternalAdminEvent.deliver(InternalAdminEvent.java:114)
[stderr] at org.knopflerfish.bundle.event.QueueHandler.run(QueueHandler.java:120)
[stderr] Caused by: java.io.IOException: MANIFEST.MF must be first in archive when using signatures.
[stderr] at org.knopflerfish.framework.bundlestorage.file.Archive.downloadArchive(Archive.java:271)
[stderr] at org.knopflerfish.framework.bundlestorage.file.BundleArchiveImpl.<init>(BundleArchiveImpl.java:133)
[stderr] at org.knopflerfish.framework.bundlestorage.file.BundleStorageImpl.insertBundleJar(BundleStorageImpl.java:219)
[stderr] at org.knopflerfish.framework.Bundles.install0(Bundles.java:161)
[stderr] ... 11 more
我还尝试了相反的方法,将新的 .class 文件复制到正确签名的 jar 中,并得到了同样的错误。
我不确定对安全方案的实际验证期望什么输出。我得到的错误是否意味着java检测到错误的签名并因此拒绝它?还是仅仅意味着当我手动写入 jar 文件时,7zip 并没有保持结构完整,比我更好的黑客仍然可以轻松篡改我的 jar 文件?
jarsigner -verify
在被篡改的 jar 文件上给了我
java.lang.SecurityException: SHA-256 digest error
更有意义的信息,如果我“正确”篡改了 jar,我可以期待吗?