ТЛ; др
Несуществующие механизмы проверки в Maven и отсутствующие языковые конструкции в DSL POM представляют серьезную угрозу безопасности. Пока MNG-6026 не будет адресовано, используйте что-то вроде Gradle Witness .
Введение
Ни один из предоставленных ответов, похоже, не решил проблему. Подписание артефактов - это только первый шаг в правильном направлении. Но условие, когда ключ, используемый для подписи артефакта, считается доверенным / действительным, очень непрозрачно. Например: Как pgpverify-maven-plugin или Nexus Professional действительно проверяет, что подпись действительна для артефакта? Недостаточно просто извлечь ключ из сервера ключей и проверить артефакт.
Sonatype кратко упоминает об этом в своем блоге :
Подписи PGP: еще один уровень
Что касается потребления, вы можете использовать Закупки в Nexus Professional.
проверить на наличие подписи и на издательской стороне
подписание ваших выпусков с подписью PGP и создание подписей PGP
доступны на сервере открытых ключей поможет людям перепроверить, что
Артефакты и контрольные суммы согласованы. Примечание: я думаю, что есть больше
работа над созданием инструментов, поощряющих использование ключей PGP
и, что более важно, дать администраторам хранилища некоторый контроль
по каким ключам доверять.
(акцент мой)
Расширение объектной модели проекта (POM) информацией доверия
Нам нужна возможность смоделировать доверительные отношения от вашего проекта или артефакта к заявленным зависимостям. Таким образом, если все участвующие стороны заявляют о таком отношении, мы можем создать «цепочку доверия» от корня (например, проекта) по его зависимостям вплоть до самой последней переходной зависимости. Проектная объектная модель (POM) должна быть расширена элементом для зависимостей.
Текущая ситуация
Прямо сейчас у нас есть что-то вроде
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
</dependency>
Жесткие зависимости
Для жестких зависимостей может включать сумму артефакта sha256 и его файл POM:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<verification>
<checksum hash='sha-256'>
<pom>[sha256 of junit pom file]</pom>
<artifact>[sha256sum of artifact (junit.jar)]</artifact>
</checksum>
</verification>
</dependency>
Мягкие зависимости
Если используются мягкие или ранжированные зависимости, то мы могли бы указать открытый ключ (или несколько) пары ключей, используемой для подписи артефактов
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[4.0,4.5)</version>
<verification>
<openpgp>[secure fingerprint of OpenPGP key]</openpgp>
<!-- possible further 'openpgp' elements in case the artifacts in the
specified version range where signed by multiple keys -->
</verification>
</dependency>
А сейчас?
Благодаря peter , который вызвал меня, я поднял запрос на добавление функций для Apache Maven: MNG-6026 . Посмотрим, что будет дальше.
Другие подходы
Gradle Witness делает нечто подобное для Gradle. Но у него есть некоторые недостатки:
- Он построен на вершине gradle (и встроен в POM)
- Он допускает только жесткие зависимости, поскольку использует хэши.
То же самое относится и к плагину Maven Enforcer .
pgpverify-maven-plugin , по-видимому, также следует этому подходу. Хотя документация отсутствует, существует тест для так называемого свойства keysMap
, который также отображается в файле конфигурации как keysMapLocation
.