使用JarFile类我可以验证jar文件是否已签名。但是,基于我阅读的API文档和jarsigner文档,我没有看到验证签名者的方法。换句话说,我可以验证jar自签名以来没有被修改过,但似乎任何使用任何密钥的人都可以签名。
如果攻击者修改了jar然后用自己的密钥签名,验证是否会通过?
这似乎是从文档中排除的基本原则 - 所以我怀疑我在某处遗漏了一些背景知识。我错过了什么?
答案 0 :(得分:2)
如果你信任签名者,你所做的就是验证罐子没有被改变你没见过。该步骤要求您检查证书。点击jarsigner page上的使用证书信息进行验证部分。
jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar
这应该验证jar并根据密钥库中的可信证书检查/验证签名者证书链。
Web浏览器通过查看JRE附带的lib / security文件夹中的cacerts文件自动执行此操作,该文件存储了众所周知且受信任的CA列表。
答案 1 :(得分:0)
在我的情况下,我想验证签名者是我期望的那样。
这个怎么样?
鉴于我知道预期签名者的公钥。我想出了这段代码:
public boolean isSignedBy(JarEntry entry, X509Certificate requiredSigner) {
PublicKey requiredPublicKey = requiredSigner.getPublicKey();
for (Certificate cert : entry.getCertificates()) {
if (requiredPublicKey.equals(cert.getPublicKey())) {
return true;
}
}
return false;
}