Почему JarFile не проверяет подписавшего?

#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;
}