Maven 密码加密

一、简介

Maven支持服务器密码加密。该解决方案解决的主要用例是:

  • 多个用户共享同一台生成计算机(服务器、CI 框)
  • 有些用户有权将 Maven 工件部署到存储库,有些则没有。
    • 这适用于任何需要授权的服务器操作,而不仅仅是部署
  • settings.xml在用户之间共享

实施的解决方案添加了以下功能:

  • 授权用户在其目录中有一个附加文件settings-security.xml``${user.home}/.m2
    • 此文件包含加密的主密码,用于加密其他密码
    • 或者它可以包含重定位 - 引用另一个文件,可能在可移动存储上
    • 此密码目前首先通过 CLI 创建
  • 中的服务器条目已加密密码和/或密钥库密码settings.xml
    • 目前 - 这是在创建主密码并将其存储在适当位置后通过 CLI 完成的

二、 如何创建主密码

使用以下命令行:

mvn --encrypt-master-password <password>

*注意:*从 Maven 3.2.1 开始,不应再使用密码参数。Maven 将提示输入密码。早期版本的 Maven 不会提示输入密码,因此必须在命令行上以明文形式键入密码。

此命令将生成密码的加密版本,类似于:

{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}

将该密码存储在${user.home}/.m2/settings-security.xml中;它应该看起来像:

<settingsSecurity>
  <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>

完成此操作后,可以开始加密现有服务器密码。

三、如何加密服务器密码

您必须使用以下命令行:

mvn --encrypt-password <password>

注意:就像--encrypt master password一样,自Maven 3.2.1以来,不应再使用密码参数(有关详细信息,请参阅下面的提示。)。

该命令生成它的加密版本,类似于:

{COQLCE6DU6GtcS5P=}

将其复制并粘贴到settings.xml文件的servers部分。这将类似于:

<settings>
...
  <servers>
...
    <server>
      <id>my.server</id>
      <username>foo</username>
      <password>{COQLCE6DU6GtcS5P=}</password>
    </server>
...
  </servers>
...
</settings>

请注意,密码可以包含大括号以外的任何信息,以便以下内容仍然有效:

<settings>
...
  <servers>
...
    <server>
      <id>my.server</id>
      <username>foo</username>
      <password>Oleg reset this password on 2009-03-11, expires on 2009-04-11 {COQLCE6DU6GtcS5P=}</password>
    </server>
...
  </servers>
...
</settings>

然后你可以使用,比如说,部署插件,写入这个服务器:

mvn deploy:deploy-file -Durl=https://maven.corp.com/repo \
                       -DrepositoryId=my.server \
                       -Dfile=your-artifact-1.0.jar \

四、如何在可移动驱动器上保留主密码

完全如上所述创建主密码,并将其存储在可移动驱动器上,例如在OSX上,我的USB驱动器装载为/Volumes/mySecureUsb,因此我存储:

<settingsSecurity>
  <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>

在文件/Volumes/mySecureUsb/secure/settings-security.xml中

然后创建${user.home}/.m2/settings-security.xml,内容如下:

<settingsSecurity>
  <relocation>/Volumes/mySecureUsb/secure/settings-security.xml</relocation>
</settingsSecurity>

这确保加密仅在操作系统装载USB驱动器时工作。这解决了一个用例,其中只有某些人被授权部署并获得这些设备。

五、在密码中转义花括号文本(自:Maven 2.2.0)

有时,您可能会发现密码(或其加密形式)包含"{"或"}"作为文本值。如果将这样的密码添加到settings.xml文件中,您会发现Maven对它做了一些奇怪的事情。具体来说,Maven将"{"文本之前的所有字符以及"}"文本之后的所有字符作为注释。显然,这不是你想要的行为。您真正需要的是一种逃避密码中花括号文本的方法。

您可以使用广泛使用的"\"转义符来实现这一点。如果您的密码如下所示:

jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+{EF1iFQyJQ=

然后,要添加到settings.xml的值如下所示:

{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+\{EF1iFQyJQ=}

六、密码安全性

编辑settings.xml并运行上述命令仍然可以将密码以明文形式存储在本地。您可能需要检查以下位置:

  • Shell历史记录(例如,通过运行历史记录)。加密以上密码后,您可能希望清除历史记录
  • 编辑器缓存(例如~/.viminfo)

还要注意,具有主密码和设置安全文件的人可以解密加密的密码。如果预期可能会检索settings.xml文件,请确保此文件的安全性(或单独存储)。

七、不同平台上的密码转义

在某些平台上,如果密码包含特殊字符,如%、!、$、,等。例如,在Windows上,您必须注意以下事项:
以下示例在Windows上不起作用:

mvn --encrypt-master-password a!$%^b

而以下内容将在Windows上工作:

mvn --encrypt-master-password "a!$%^b"

如果您使用的是 linux/unix 平台,则应使用单引号作为上述主密码。否则,主密码将不起作用(由美元符号和感叹号引起)。

相关推荐
懒洋洋大魔王几秒前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神37 分钟前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF2 小时前
m个数 生成n个数的所有组合 详解
java·递归
代码小鑫2 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖3 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶3 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
周全全3 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php