当前位置: 首页 > 知识库问答 >
问题:

我们如何知道可以信任Maven中央存储库?

方鸿羲
2023-03-14

很抱歉,如果这个问题不适合StackOverflow,它不是一个编码问题。

我是Maven的新手,我很好奇为什么会有一个Maven中央存储库看起来可以免费访问。据我所知,它是由一家名为SonaType的公司维护的。他们在资助吗?为什么?它是否在其剩余业务中充当潜在客户开发工具?我想如果我了解他们的理由,我就会知道是否或如何/何时信任他们。

共有3个答案

苍兴怀
2023-03-14

请阅读条款/服务:https://repo1.maven.org/terms.html. 如果你没有一个温暖和模糊之后,那么你可以自由地不使用它。还有其他maven回购协议,但我在开发领域认识的大多数人都使用中央回购协议,从来没有出现过问题。坦率地说,如果你不信任任何回购协议,你完全可以放弃你自己的回购协议(比如Artifactory)。

关于Sonatype。他们是一家具有附加值的服务公司,中央回购或多或少是善意的。很多公司都有这种商业模式。说鱼饵为钩。

罗俭
2023-03-14

Jason提到了Sonatype条款和条件。其中包含有关如何提交内容的链接:

  • http://central.sonatype.org/pages/ossrh-guide.html

需求部分特别有趣。简言之,所有提交人应提供以下内容:

  • Javadoc和源代码
  • 对提交的文件进行数字签名
  • 正确的项目元数据
    • GAV标识符(组,工件,版本)
    • 名称和描述字段和项目URL
    • 项目开发人员
    • 许可证信息
    • 源代码存储库的位置

    这些信息发布了您和我需要了解的关于代码、代码是如何构建的以及更重要的是谁构建的所有信息。GPG的使用使我们能够验证二进制文件是由项目POM文件中所述的开发人员构建的。此外,Maven Central自动生成SHA校验和,使您能够验证生成过程下载的文件的完整性。

    那么Sonatype从中得到了什么?

    • 当销售他们的存储库托管软件的专业版时,这是一个很好的宣传工具。
    • 这些提供了与公司软件使用的第三方库相关的安全漏洞的详细报告。令人印象深刻的是,这些工具可以直接集成到软件开发和构建过程中。

    希望这有帮助。最后,我要指出,Sonatype所做的与其他开源软件打包计划没有太大区别。Redhat、Debian和Canonical花费大量精力将软件打包,以便在操作系统中安全地分发。Maven Central可能对开发人员更加友好。

孔俊爽
2023-03-14

这是一个很好的问题,特别是因为使用不安全的第三方库现在已进入OWASP前10名。不幸的是,大多数人认为对Maven Central的信任是理所当然的。我认为他们过于乐观了。

很多人认为,因为你必须签署提交给Maven的文件,该软件可以被信任。不幸的是,他们忽略的是,如果你不能确定签名库的密钥属于提供给Maven的原始源,签名是毫无意义的。马文似乎就是这种情况。

为了简化解释,请考虑下面的类比。当你去机场飞往某地时,你需要提供身份证来证明你是你所说的那个人。对于当地旅行,驾驶执照就足够了。检查您身份证的人有几件事要检查:

  • 同一来源:驾照上的名字和车票上的名字匹配吗?这阻止了奥萨马·本·拉登以巴拉克·奥巴马的名义预订机票

现在进行同样的类比来验证来自Maven的对象。Maven文档声称,在上传到中央存储库的库上需要PGP签名(参考:将工件上传到中央存储库的指南)(尽管Sonatype声称许多较旧的包没有签名)。想象驾驶执照类似于钥匙,车票类似于Maven工件,并问同样的问题:

  1. 同一来源:签署库的密钥是否与签署库的同一原始来源的人关联?

为了检查同一源,只需从密钥服务器下载与工件关联的公钥,并验证它是否来自与原始源关联的电子邮件地址。例如,这可以通过MIT PGP密钥服务器完成。有关如何执行此操作的具体详细信息,请参阅使用PGP验证依赖项。

第三种方法实际上是最容易做到的,因为它可以完全自动化(请参阅《GPG快速启动指南》,关于验证分离的签名的部分)。此部分不需要手动干预。

第二部分是差距所在。即使签名被签出并且MIT密钥服务器声称密钥与原始源关联,我们如何知道它确实是由原始源创建的,而不是由其他人创建的?事实上,为了演示,我在麻省理工学院的密钥服务器上为米老鼠创建了一个密钥。我本可以轻松创建一个似乎与oracle.com、spring.io或whitehouse.gov相关联的密钥。

在一个人们发送包含可执行恶意软件的电子邮件,而NSA正在破坏SSL的世界里,如果认为这些黑帽子不是针对捆绑在世界各地众多应用程序中的软件存储库,那就太天真了。事实上,至少有三个严重的例子被抓住了。

所以说得很清楚,如果我是一顶黑帽子,下面就是我要做的事情(记录在案:我不是一顶黑帽子!!!)。我会选择一个广泛使用的开源软件包。然后,我会偷偷地从后门进入包的源代码,并在本地构建它。下一步是创建与原始源的电子邮件地址关联的密钥对。我将该密钥上传到MIT密钥服务器(该服务器接受电子邮件地址,无需任何验证),然后对我的恶意软件包进行签名。最后,我将我的恶意软件包连同签名一起上传到Maven和snicker,因为我的恶意软件在世界各地的产品中逐渐被采用。我声称这次袭击不太可能很快被抓获。

不幸的是,对此没有简单的答案。你越信任你正在使用的软件,你就越没有效率。你需要做出现实的权衡,平衡安全性和生产率。

简单地说(因为我已经气得喘不过气来了),我将只引用两个来源,它们可以帮助您更好地选择第三方库。第一个是遵循构建文件第5节中的建议,特别是包括安全审查过程。

第二个建议是Sonatype有一个叫做CLM的产品,它可以帮助你的公司html" target="_blank">分析你正在使用的软件,包括提供关于已知缺陷和有多少其他组织正在使用同一产品的信息。

除了Sonatype可以销售的Nexus和CLM产品之外,本文也值得一读。Sonatype在软件开发效率和开源解决方案的信任之间起着平衡作用。他们还没有完全解决所有问题(不会透露我与他们交换的私人电子邮件),但他们正朝着正确的方向前进。

 类似资料:
  • 问题内容: 我公司的政策不支持自动下载的工件(必须经过批准),因此,要使用Maven,我需要禁用对Maven中央存储库的访问。 换句话说,我不希望Maven尝试从Central下载任何内容。 我知道如何配置本地存储库(是否联网),我的想法是使用“受祝福的”计算机来更新本地存储库。 PS:我可以在代理/网络级别阻止请求,但是我在问如何使用Maven的配置来完成请求。 UPDATE 我终于想出了怎么做

  • 由于“需要HTTPS”错误,我最近在构建项目时遇到了问题。这个问题通过如下所述修改我的pom.xml得到了解决,添加了以下内容: 然而,为我的每个项目更新每个pom.xml是一件麻烦的事。 我尝试将相同的代码片段添加到我的settings.xml,但没有成功。 我知道更新版本的Maven解决了这个问题。然而,由于工作限制,我无法更新我的环境。 我目前已经安装了Java8和Maven,由Netbea

  • 问题内容: 我可以做些什么来将自己的开放源代码内容放入Maven的Central存储库中? 我想知道如何将自己的项目放入Maven的Central存储库。我自己问这个问题,尤其是当我看到一些著名的项目托管自己的存储库时,要求用户添加依赖项 和 存储库。同时,其他项目越来越难以依赖那些项目。由于我既不想别人添加一个额外的存储库,也不希望自己托管一个,我正在寻找其他方式。 为什么有些项目不使用该选项部

  • Maven只是看不到这些存储库,直到我从中删除。我还尝试将其他存储库镜像到Nexus,但没有成功:Maven仍然只使用中央存储库。 我做错了什么?

  • 谷歌(遗憾地)计划破坏存储权限,使应用程序无法使用标准文件API(和文件路径)访问文件系统。许多人反对它,因为它改变了应用程序访问存储的方式,在很多方面,它是一个受限的API。 因此,如果我们希望处理各种存储卷并访问其中的所有文件,我们将需要在未来的Android版本上完全使用SAF(存储访问框架)(在Android Q上,我们至少可以暂时使用一个标志来使用正常的存储权限)。 例如,假设您想创建一

  • 问题内容: 每次我运行使用Flask-SQLAlchemy的应用程序时,都会收到以下警告,提示该SQLALCHEMY_TRACK_MODIFICATIONS选项将被禁用。 我试图找出此选项的作用,但是Flask-SQLAlchemy文档尚不清楚该跟踪的用途。 · 如果设置为True(默认值),Flask-SQLAlchemy将跟踪对象的修改并发出信号。这需要额外的内存,如果不需要,可以将其禁用。