前情提要
在上篇文章中,我们详细的介绍了Maven配置文件settings.xml各个标签的含义以及配置方法(乾坤挪移大法——转移!),在讲解servers
标签时,需要配置服务器的用户名和密码,有的同学就不想让自己的密码以明文形式暴露在settings文件中,怎么办呢?其实我们可以将加密后的密码写到settings配置文件中。
<servers> <server> <id>my-server</id> <username>my-username</username> <password>{加密后的密码}</password> </server> </servers>
这时候就会有同学提问了:加密之后服务器岂不是还要解密?而且这有啥用?密码不就是换了个皮囊??
哎呦还真不是这样的,听我慢慢道来。
双密码策略
在Maven中采用了双密码策略,有一个主密码以及一个服务器密码,这两个密码都是进行加密的,Maven会使用主密码去解密服务器密码,然后才能下载依赖包。主密码可以存储到其他文件中,当然也可以存储到U盘等移动介质中,这样只有得到U盘等移动介质的人才能访问私服。
第一步:生成主密码
- 在以管理员身份启动的cmd等终端中执行命令:
mvn --encrypt-master-password <password>
,其中<password>
是你的主密码,从Maven 3.2.1开始,不应使用<password>
参数,这样会使密码明文暴露在历史命令中,可以直接使用mvn --encrypt-master-password
命令,然后敲下回车,会提示你输入主密码,加密完成后会返回加密后的密码,类似这样:{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}
- 这个密码应该存储在
${user.home}/.m2/settings-security.xml
中,或者是其他目录,存储形式如下,注意密码要加大括号,以便于Maven识别这是一个加密密码:<settingsSecurity> <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master> </settingsSecurity>
也可以使用下面的形式在${user.home}/.m2/settings-security.xml
文件中指定主密码文件的位置:
<settingsSecurity> <relocation>/Volumes/mySecureUsb/secure/settings-security.xml</relocation> </settingsSecurity>
其中:/Volumes/mySecureUsb/secure/settings-security.xml
是存有主密码的文件settings-security.xml
的位置,这样就可以将存有主密码的文件settings-security.xml
放到移动介质中,而settings文件完全可以分发给其他人,只有得到了移动介质的人才可以解密服务器密码从而访问私服。
第二步:加密服务器密码
- 使用以管理员身份启动的终端执行命令:
mvn --encrypt-password <password>
,同样的,可以直接使用mvn --encrypt-password
命令,然后敲下回车,会提示你输入服务器密码,加密完成后会返回加密后的密码,类似这样:{COQLCE6DU6GtcS5P=}
- 将加密后的密码写入到settings配置文件中,注意密码要加大括号,以便于Maven识别这是一个加密密码:
<settings> ... <servers> ... <server> <id>my.server</id> <username>foo</username> <password>{COQLCE6DU6GtcS5P=}</password> </server> ... </servers> ... </settings>
小知识
如果加密后的密码存在{
或者}
,如:jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+{EF1iFQyJQ=
,这时候就需要对{
和}
进行转义,转义后存入settings文件时是这样子的:{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+\{EF1iFQyJQ=}
servers
标签下也可以使用privateKey
和passphrase
标签指定私钥进行验证:
<servers> <server> <id>my-ssh-server</id> <username>your_username</username> <privateKey>/path/to/your/private_key</privateKey> <passphrase>{mvn-encrypted}YourEncryptedPassphrase</passphrase> </server> </servers>
<id>
元素指定了服务器的唯一标识符。<username>
元素指定了连接到服务器时使用的用户名。<privateKey>
元素指定了私钥文件的路径。这可以是绝对路径或相对于用户主目录的路径。<passphrase>
元素(可选)指定了加密的私钥密码,如果你的私钥有密码保护的话。