tl;博士:
Maven 中不存在的验证机制和 POM 的 DSL 中缺少语言结构是严重的安全威胁。在解决MNG-6026之前,请使用Gradle Witness之类的东西。
介绍
到目前为止提供的答案似乎都没有解决问题。签署工件只是朝着正确方向迈出的第一步。但是,用于签署工件的密钥被认为是可信/有效的条件是非常不透明的。例如:pgpverify-maven-plugin或Nexus Professional如何真正验证签名对工件有效?仅从密钥服务器检索密钥并验证工件是不够的。
Sonatype 在他们的博客文章中简要提到了这一点:
PGP 签名:另一个层次
在消费方面,您可以使用 Nexus Professional 中的采购来检查是否存在签名,而在发布方面,使用 PGP 签名对您的发布进行签名并在公钥服务器上提供 PGP 签名将帮助人们仔细检查工件并且校验和是一致的。注意:我认为创建鼓励使用 PGP 密钥的工具还有更多工作要做,更重要的是,让存储库管理员可以控制哪些密钥是可信的。
(强调我的)
使用信任信息扩展项目对象模型 (POM)
我们需要的是建模从您的项目或工件到声明的依赖关系的信任关系的可能性。因此,如果所有相关方都声明了这种关系,我们就能够创建一个“信任链”,从根(例如项目)开始,一直到其依赖关系,直至最后一个传递依赖关系。项目对象模型 (POM)需要通过 <verification/> 元素来扩展依赖项。
现在的情况
现在我们有类似的东西
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
</dependency>
硬依赖
对于硬依赖,<verfication/> 可以包含 artifact 的 sha256sum 及其 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 Plugin似乎也是如此。
pgpverify-maven-plugin 显然也遵循这种方法。尽管缺少文档,但对所谓的keysMap
属性进行了测试,该属性在配置文件中keysMapLocation
也显示为.