maven仓库密码加密方案原理

前言

有一个要求就是说不能使用明文密码,需要对 settings.xml 文件中的password密码进行加密

原始配置是没有对密码进行加密的

<server>
   <id>gleam-repo</id>
   <username>admin</username>
   <password>admin123</password>
 </server>

加密

这是接下来需要用到的两个命令

mvn --encrypt-master-password "加盐值"
mvn --encrypt-password "需要加密的密码"

获取加密盐值

输入 mvn --encrypt-master-password 回车然后输入给密码加盐的盐值

将加密盐值放到指定文件

然后将上面获取到的加密盐值放到 当前登录用户名.m2\settings-security.xml 的这个文件的 master 标签内,没有这个文件就新建,以下是这个文件的完整内容

<!-- 
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>{2yB41Sc3/uUHseN39zLQB+14crvBhxsQRaXWgOTjdy8=}</master>
</settingsSecurity>

给密码进行加密

输入 mvn --encrypt-password 回车然后输入要加密的仓库密码,比如我的就输入 admin123,然后回车得到的密码就是加密后的密码

替换明文密码

替换 settings.xml 中的password即可

<server>
	<id>gleam-repo</id>
	<username>admin</username>
	<password>{TVKDNf7AL24H6+DZZwlMsc7DCGp+98I0Fa/ZSYTQ4v8=}</password>
</server>

maven配置文件

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!--依赖存放在你本地的仓库地址-->
  <localRepository>C:\environment\apache-maven-3.6.3\maven-repo</localRepository>

  <pluginGroups>
  </pluginGroups>

  <proxies>
  </proxies>

  <!-- servers
   | This is a list of authentication profiles, keyed by the server-id used within the system.
   | Authentication profiles can be used whenever maven must make a connection to a remote server.
   |-->
  <servers>
    <!--仓库用户名和密码, 可配置多个-->
    <server>
      <id>gleam-repo</id>
      <username>admin</username>
      <password>{TVKDNf7AL24H6+DZZwlMsc7DCGp+98I0Fa/ZSYTQ4v8=}</password>
    </server>
  </servers>

  <mirrors>
    <!-- 私库镜像
    如果私库要使用账号密码那么这里 mirror中 的id就要跟 server 中的id保持一致
    因为 Maven 是通过 id 来对比变量和匹配的
    mirrorOf 替代方式, 
      *: 匹配所有,所有内容都从这个镜像拉取
      external:*: 除了本地缓存的所有从镜像仓库拉取;
      repo,repo1: repo或者repo1从这个镜像进行拉取,这里的repo指的profile的ID
      *,!repo1: 除了repo1的所有仓库;
    -->
    <mirror>
      <id>gleam-repo</id>
      <!-- dev 的从这个镜像拉取, 这里的名称跟下面对应的 profile 的id保持一致 -->
      <mirrorOf>dev</mirrorOf>
      <name>公司私库</name>
      <url>http://192.10.10.70:8081/repository/maven-public/</url>
    </mirror>

    <!-- 阿里云镜像 -->
    <mirror>
      <id>aliyunmaven</id>
      <!-- aliyun 的从这个镜像拉取, 这里的名称跟下面对应的 profile 的id保持一致 -->
      <mirrorOf>aliyun</mirrorOf>
      <name>阿里云公共仓库</name>
      <!-- <url>https://maven.aliyun.com/repository/public</url> -->
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>


  <profiles>
    <!-- 阿里云仓库配置 -->
    <profile>
      <!-- 这里的id名称跟上面对应的 mirror 镜像的 mirrorOf 名称保持一致 -->
      <id>aliyun</id> 
      <repositories>
        <repository>
          <id>aliyun</id>
          <!-- <url>https://maven.aliyun.com/repository/public</url> -->
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>

    <!-- 私库仓库配置 -->
    <profile>
    	<!-- 这里的id名称跟上面对应的 mirror 镜像的 mirrorOf 名称保持一致 -->
		<id>dev</id>
		<repositories>
		 <repository>
          <!-- 如果要使用用户名密码的话 repository 的id就要和mirror的id保持一致 -->
          <id>gleam-repo</id>
          <url>http://192.10.10.70:8081/repository/maven-public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
		 </repository>
		</repositories>
			<!-- <pluginRepositories>
				<pluginRepository>
					<id>pds-repo</id>
					<name>deployment</name>
					<url>http://192.10.10.70:8081/repository/maven-public/</url>
				</pluginRepository>
			</pluginRepositories> -->
		</profile>
  </profiles>

  <!-- 要激活的配置 -->
  <activeProfiles>
    <activeProfile>aliyun</activeProfile>
    <activeProfile>dev</activeProfile>
  </activeProfiles>
</settings>

探索maven运行原理

看起来这里有一些混淆。Maven 使用的配置文件是 settings.xml,而不是 settingsSecurity.xml。.settingsSecurity 文件(注意它没有 .xml 扩展名)是用来存储密钥环的,而这些密钥环用于加密和解密 settings.xml 中的敏感信息(如用户名和密码)。

让我们澄清一下这些文件是如何工作的:

  1. settings.xml:
    这是 Maven 的主要配置文件,其中包含了各种设置,比如仓库的位置、镜像服务器等。
    敏感信息(如用户名和密码)可以被加密后存放在 settings.xml 文件中。
  2. settingsSecurity:
    这是一个二进制文件,用于存储加密和解密 settings.xml 中敏感数据所需的密钥。
    该文件通常位于用户的主目录下的 .m2 目录中。
    当 Maven 需要读取 settings.xml 中的敏感信息时,它会执行以下步骤:

查找 .settingsSecurity 文件:

Maven 会查找 .settingsSecurity 文件,通常是位于用户的主目录下的 .m2 目录中。

如果找不到 .settingsSecurity 文件,Maven 将无法解密 settings.xml 中的密码。
使用密钥解密密码:

Maven 会使用 .settingsSecurity 文件中的密钥来解密 settings.xml 中加密的密码。

如果密码被加密了,且没有 .settingsSecurity 文件,那么 Maven 无法正确地解密密码,这可能导致认证失败。

然后 Maven 会创建 .settingsSecurity 文件,并提示你如何使用它来加密 settings.xml 中的密码。

一旦你有了 .settingsSecurity 文件并且设置了加密的密码,Maven 就能够在需要时找到该文件并使用它来解密密码。

如果你没有创建 .settingsSecurity 文件或没有加密密码,那么 Maven 会直接使用 settings.xml 文件中的明文密码(如果有配置的话)。如果你希望使用加密功能,确保先创建并配置好 .settingsSecurity 文件。

相关推荐
老王笔记9 小时前
Maven下载安装
maven
litGrey13 小时前
Maven国内镜像(四种)
java·数据库·maven
尘浮生17 小时前
Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·mysql·maven
尘浮生17 小时前
Java项目实战II基于Java+Spring Boot+MySQL的保密信息学科平台系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·mysql·maven
codelife32118 小时前
Maven 项目无法下载某个依赖
java·maven
飞翔的佩奇18 小时前
Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)
java·数据库·spring boot·毕业设计·maven·mybatis·医院管理系统
知识的宝藏20 小时前
maven pom文件中的变量定义
java·maven
程似锦吖21 小时前
使用Maven创建一个Java项目并在repository中使用
java·maven
尘浮生1 天前
Java项目实战II基于Spring Boot的宠物商城网站设计与实现
java·开发语言·spring boot·后端·spring·maven·intellij-idea
自身就是太阳1 天前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven