#java #security
#java #Безопасность
Вопрос:
Используя класс JarFile, я могу проверить, что файл jar был подписан. Но, основываясь на моем чтении документов API и документов jarsigner, я не вижу способа проверить подписывающего. Другими словами, я могу проверить, что jar не был изменен с момента его подписания, но, похоже, он мог быть подписан кем угодно, используя любой ключ.
Разве проверка не прошла бы, если бы злоумышленник модифицировал jar, а затем подписал его своим собственным ключом?
Это похоже на фундаментальный принцип, который следует исключить из документации, поэтому я подозреваю, что мне где-то не хватает некоторых базовых знаний. Чего я не понимаю?
Ответ №1:
То, что вы сделали, это подтвердили, что jar не был изменен, вы не видели, доверяете ли вы подписавшему. Этот шаг требует от вас проверки сертификата. Взгляните на раздел Проверка с использованием информации о сертификате на странице jarsigner.
jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar
Это должно проверить jar и проверить / валидировать цепочку сертификатов подписывающих в соответствии с вашими доверенными сертификатами в вашем хранилище ключей.
Веб-браузеры делают это автоматически, просматривая файл cacerts в папке lib / security, которая поставляется с JRE, в которой хранится список хорошо известных и доверенных центров сертификации.
Ответ №2:
В моем случае я хочу убедиться, что подписавший — это тот, кого я ожидаю.
Как насчет этого?
Учитывая, что я знаю открытый ключ ожидаемого подписывающего. Я придумал этот фрагмент кода:
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;
}