此系列文章,作为我在Maven官网学习的记录,每阅读学习完一份即会更新。
介绍
Maven 2.1.0+现在支持服务器密码加密。此解决方案解决的主要用例是:
多个用户共享同一个构建计算机(服务器,CI框)
一些用户有权将Maven工件部署到存储库,有些则没有。
这适用于任何服务器操作,需要授权,而不仅仅是部署
settings.xml在用户之间共享
实施的解决方案增加了以下功能:
授权用户在$ /.m2文件夹中 有一个额外的settings-security.xml文件
此文件包含加密的主密码,用于加密其他密码
或者它可以包含重定位 - 对另一个文件的引用,可能在可移动存储上
此密码首先通过CLI创建
settings.xml中的服务器条目具有加密的密码和/或密钥库密码
现在 - 这是在创建主密码并存储在适当位置后通过CLI完成的
如何创建主密码
使用以下命令行:
mvn --encrypt-master-password
注意:由于Maven 3.2.1不再使用密码参数(有关详细信息,请参阅下面的提示)。Maven会提示输入密码。早期版本的Maven不会提示输入密码,因此必须在明文的命令行中输入密码。
此命令将生成密码的加密版本,例如
{ jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u + 9EF1iFQyJQ =}
将此密码存储在$ /.m2 / settings-security.xml中 ; 它应该看起来像
完成此操作后,您可以开始加密现有服务器密码。
如何加密服务器密码
您将必须使用以下命令行:
mvn --encrypt-password
注意:就像--encrypt-master-password一样,自Maven 3.2.1起不再使用密码参数(有关详细信息,请参阅下面的提示)。
这个命令会产生一个加密版本,比如说
将其剪切粘贴到服务器部分的settings.xml文件中。这看起来像:
...
...
my.server
foo
...
...
请注意,密码可以包含大括号之外的任何信息,以便以下内容仍然有效:
...
...
my.server
foo
Oleg reset this password on 2009-03-11, expires on 2009-04-11
...
...
然后你可以使用,例如,部署插件,写入这个服务器:
mvn deploy:deploy-file -Durl=https://maven.corp.com/repo \
-DrepositoryId=my.server \
-Dfile=your-artifact-1.0.jar \
如何在可移动驱动器上保留主密码
完全按照上述说明创建主密码,并将其存储在可移动驱动器上,例如在OSX上,我的USB驱动器安装为/ Volumes / mySecureUsb,所以我存储
在文件/Volumes/mySecureUsb/secure/settings-security.xml中
然后我用以下内容创建$ /。m2 / settings-security.xml:
/Volumes/mySecureUsb/secure/settings-security.xml
这可确保加密仅在OS安装USB驱动器时有效。这解决了仅授权某些人部署并发布这些设备的用例。
提示
在密码中转义花括号文字(自:Maven 2.2.0)
有时,您可能会发现您的密码(或其加密形式)实际上可能包含“{”或“}”作为字面值。如果您将这样的密码添加到settings.xml文件中,您会发现Maven对它做了一些奇怪的事情。具体来说,Maven会将'{'文字前面的所有字符和'}'文字后面的所有字符视为注释。显然,这不是您在这种情况下想要的行为。你真正需要的是一种在密码中转义花括号文字的方法。
从Maven 2.2.0开始,你可以使用广泛使用的'\'转义字符来做到这一点。如果您的密码如下所示:
jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+
密码安全
编辑settings.xml并运行上述命令仍然可以将您的密码以明文形式存储在本地。您可能需要检查以下位置:
Shell历史(例如通过运行历史记录)。您可能希望在加密上述密码后清除历史记录
编辑器缓存(例如〜/ .viminfo)
另请注意,加密密码可由具有主密码和设置安全文件的人解密。如果您希望可能检索settings.xml文件,请保持此文件的安全(或单独存储)。
在一些平台上需要用引号包括一些内容,特别是具有特殊字符,如内容引用您的密码%,!,$等在那里。例如,在Windows上,您必须小心以下内容:
以下示例在Windows上不起作用:
mvn --encrypt-master-password a!$%^b
而以下将适用于Windows:
mvn --encrypt-master-password "a!$%^b"
如果您使用的是linux / unix平台,则应使用单引号作为上述主密码,否则您会惊讶于主密码的使用不起作用(由美元符号和感叹号引起)。
提示输入密码
在版本3.2.1之前的Maven中,您必须在命令行上输入密码作为参数,这意味着您可能需要转义密码。此外,shell通常会存储您输入的命令的完整历史记录,因此任何有权访问您计算机的人都可以从shell的历史记录中恢复密码。
从Maven 3.2.1开始,密码是一个可选参数,这意味着如果省略密码,系统将提示您输入密码,这将阻止上述所有问题。
因此,我们强烈建议使用Maven 3.2.1及更高版本来防止转义特殊字符的问题,当然还有与bash历史相关的安全问题或与密码相关的环境问题。
下次见
领取专属 10元无门槛券
私享最新 技术干货