背景说明
按照DevOps三级要求,Maven工具发布Nexus帐号不能使用明文密码,需要对settings.xml
文件中的password
密码进行加密存储。下面就说一下具体的加密过程及配置方法。
环境说明
Maven:Apache Maven 3.6.3
Nexus:OSS 3.29.2-02(免费版)
解决方法
1. 获取加密盐值
输入mvn --encrypt-master-password
回车然后输入给密码加盐的盐值
Microsoft Windows [版本 10.0.19044.2965]
(c) Microsoft Corporation。保留所有权利。
C:\Users\Administrator>mvn --encrypt-master-password
Master password: (这里输入你指定的master明文密码)
{XMoA0lJCA4kH6fS7L94mriQnQH5UlNianaSEFMG4HFI=} (这是根据明文MasterPassword计算的密码)
2. 将加密盐值放到指定文件
将步骤1️⃣获取到的加密盐值放到当前登录用户名\.m2\settings-security.xml
的这个文件的master标签内,没有这个文件就新建,以下是这个文件的完整内容:
<?xml version="1.0" encoding="UTF-8"?>
<!--
maven安全配置文件(如果没有就手动创建), 内容如下
linux下路径: ~/.m2/settings-security.xml
window下路径: %USERPROFILE%\.m2\settings-security.xml
window下路径: 当前登录用户名\.m2\settings-security.xml
%USERPROFILE% 指当前登录windows的用户, 比如我当前登录的账号是admin
完整示例: C:\Users\admin\.m2
-->
<settingsSecurity>
<!-- master的值为 mvn encrypt-master-password 生成的密文-->
<master>{XMoA0lJCA4kH6fS7L94mriQnQH5UlNianaSEFMG4HFI=}</master>
</settingsSecurity>
注意:只能放在该目录下,且配置文件名必须为settings-security.xml
。
3. 给私服密码进行加密
输入mvn --encrypt-password
命令回车,然后输入要加密的仓库密码,比如我的就输入esunny123
,得到的密码就是加密后的密码:
Microsoft Windows [版本 10.0.19044.2965]
(c) Microsoft Corporation。保留所有权利。
C:\Users\Administrator>mvn --encrypt-password
Password: (输入你nexus私服对应Repository的密码)
{bX/oRMMjQAcHIkQ7R5RYrvhQliT3KRQVykhXD4q2t58=} (这是根据明文Password计算的密码)
注意:必须先按照步骤2执行,否则会报错,报错信息如下:
4. 替换明文密码
修改本地${maven.home}\conf\settings.xml文件:
<server>
<id>gleam-repo</id>
<username>admin</username>
<password>{7l9KDIMMpfsHbKcxpOd5Q6ynbyxby2Y0TXkcppp/SDI=}</password>
</server>
到此,就可以安全地链接Nexus对应的Repository进行发布或下载依赖库了。
该种方式的加密是完全基于本地Maven工具操作,安全性其实并不完美,但是针对于Nexus Repository OSS (免费版) 版本也暂时只能做到这个程度。
商业版Nexus做法
如果公司使用的是收费版Nexus Repository Pro
版本,可以用更安全的方式,本地settings.xml
直接写nexus提供的密文。
详见Nexus官方文档: http://books.sonatype.com/nexus-book/reference3/security.html#user-token
部分截图如下: