Java:验证jar是否已签名
我和Jarsigner一起工作。我想检查给定的jar是否已签名。如果用户上传一个jar文件,我想知道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
但即使我提供了一个未签名的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文件。省略签名验证步骤没有多大意义。@EJPManifest.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();
}
}
}