Java:验证jar是否已签名

Java:验证jar是否已签名,java,code-signing,jarsigner,Java,Code Signing,Jarsigner,我和Jarsigner一起工作。我想检查给定的jar是否已签名。如果用户上传一个jar文件,我想知道jar文件是否经过签名。我尝试了以下代码,() 但即使我提供了一个未签名的jar,man对象也不是空的,并且不会抛出这个异常。如何检查给定的jar是否刚刚签名?请帮帮我。提前感谢。假设您只想知道jar是否已签名(无需验证签名本身),此代码段应该可以工作: boolean isJarSigned(JarFile jarFile) { try { final Manifest

我和Jarsigner一起工作。我想检查给定的jar是否已签名。如果用户上传一个jar文件,我想知道jar文件是否经过签名。我尝试了以下代码,()


但即使我提供了一个未签名的jar,
man
对象也不是空的,并且不会抛出这个异常。如何检查给定的jar是否刚刚签名?请帮帮我。提前感谢。

假设您只想知道jar是否已签名(无需验证签名本身),此代码段应该可以工作:

  boolean isJarSigned(JarFile jarFile) {
    try {
      final Manifest man = jarFile.getManifest();
      if (man == null)
        return false;

      // getEntries will contain all signed files
      return !man.getEntries().isEmpty();
    } catch (Throwable t) {
      t.printStackTrace();

      return false;
    } finally {
      // Make sure the jarFile gets always closed
      try {
        if (jarFile != null)
          jarFile.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

顺便说一句,我知道我的答案已经晚了3年,但我自己也在拼命寻找答案,所以我想我还是发布我的解决方案吧。

你在引用的页面的一半就停了下来。您错过了。

签名JAR通常在META-INF/目录中还有一个.sf文件和一个.dsa文件。是一个类,用于验证JAR文件上的签名。除了清单文件之外,您还需要检查其他一些内容。请看一看该类以获取参考。@Henrik您能告诉我们如何使用JarVerifier吗?@Mihir它的接口相对简单。最简单的例子是
JarFile JarFile=newjarfile(applet);JarVerifier.verify(jarfile,trustedCertificates)。请注意,我省略了许多异常处理和其他内容
trustedCertificates
是X509证书的
列表。希望有帮助。非空清单并不意味着有签名的JAR文件。省略签名验证步骤没有多大意义。@EJP
Manifest.getEntries()
不包含由
等创建的
等主属性。从Java 8开始,它只返回您无法从
Manifest.getMainAttributes()
获取的条目。我建议您检查这些方法的Javadocs,并且
Manifest.getAttributes(String)
OP没有要求验证签名。问题很简单,就是如何确定jar是否有签名。如果它有一个验证它通常是有意义的。但是,如果您想检查一个jar是否被签名,因为您在代码中的某个其他点验证了该签名,那么您当然不需要迭代jar的内容。@brainsone无效的签名实际上根本不是签名。返回误报的技术对任何人都没有任何用处。
  boolean isJarSigned(JarFile jarFile) {
    try {
      final Manifest man = jarFile.getManifest();
      if (man == null)
        return false;

      // getEntries will contain all signed files
      return !man.getEntries().isEmpty();
    } catch (Throwable t) {
      t.printStackTrace();

      return false;
    } finally {
      // Make sure the jarFile gets always closed
      try {
        if (jarFile != null)
          jarFile.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }