Encripta las contraseñas de tu setting.xml con Maven

1
5747

En este artículo se hará uso mediante una demostración de la opción para encriptar contraseña de nos facilita Maven.

Índice de contenidos

1. Introducción

La motivación de este tutorial surgió por la necesidad de compartir mi fichero settings.xml con un compañero. En este fichero settings aparecían mis credenciales, con las que accedía a ciertos servidores. La solución más sencilla hubiera sido borrarlas.

	<servers>
		<server>
			<id>nexus</id>
			<!--Pon tus credenciales -->
			<username></username>
			<password></password>
		</server>
	</servers>

Pero pensé que habría alguna forma de encriptar mis contraseñas para poder compartir mi fichero settings.xml sin problemas y que encima me siguiera funcionando en mi repositorio local. Os intentaré explicar esta opción de Maven con una demostración provocando una situación similar a la que me hizo descubrirla.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil Pro 15′ (2,5 GHz Intel Core i7, 8 GB DDR3).
  • Sistema Operativo: Mac OS El Capitán 10.11
  • Entorno de desarrollo: Neon.2 Release (4.6.2)
  • Apache Maven 3.3.9
  • Docker Engine 1.12.5, build 7392c3b
  • Docker Machine version 0.8.2, build e18a919
  • Docker Kitematic 0.12.0

3. Preparando el entorno para la demo

Para el ejemplo vamos a utilizar la aplicación que describe Natalia Roales en su tutorial con algunas modificaciones. En nuestra aplicación no tendremos capa de persistencia y en vez de saludar, validaremos NIFs.

Para la validación de NIFs vamos a hacer uso de una librería alojada en un repositorio Nexus local que dockerizaremos y configuraremos en nuestro settings.xml.

El código de la aplicación lo podéis encontrar en mi github .

!!! Empecemos !!!.

3.1. Aplicación Spring Boot para validar NIF

Nuestra aplicación tiene que validar si un DNI o NIE pasado en la url es correcto o no.

Si es correcto, mostrará el siguiente mensaje

Y si no lo es


Si queréis generar NIEs o DNIs correctos para vuestras pruebas podéis hacer uso de la siguiente página. Para provocar casos incorrectos, bastará con cambiar la letra .

Para que el código aplicación de Natalia cumpla con esta nueva funcionalidad,el servicio tiene que hacer uso de una librería para validar NIF. Como podemos ver en la siguiente imagen, nuestro proyecto no dispone de esta librería.

Usaremos docker para crear un repositorio local al que conectarnos y poder bajarnos la dependencia.

3.2. Dockerizando Nexus

Para dockerizar el Nexus sólo tenemos que ejecutar el siguiente comando:

 $> docker run -d -p 8081:8081 --name nexus sonatype/nexus:oss

Esto nos bajará la imagen sonatype/nexus:oss y nos levantará nuestro Nexus en el puerto 8081. Si accedes a la siguiente url deberías ver lo que aparece en la siguiente imagen:

Si no estás muy familiarizado con Docker, te recomiendo que le eches un vistazo al tutorial de Jorge Pacheco.

3.3. Configurando nuestro Nexus en el settings.xml

Una vez levantado nuestro Nexus, debemos configurar nuestro setttings.xml (alojado en la ruta ${user.home}/.m2 de nuestro repositorio local). El settting apuntando a nuestro Nexus debería quedar de la siguiente forma:

<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 https://maven.apache.org/xsd/settings-1.0.0.xsd">

	<mirrors>
	 <mirror>
	  <id>nexus</id>
	  <mirrorOf>*</mirrorOf>
	  <url>http://192.168.99.100:8081/nexus/content/groups/public</url>
	 </mirror>
    </mirrors>

	<profiles>
     <profile>
	  <id>nexus</id>
	  <repositories>
	   <repository>
	    <id>central</id>
	    <url>http://192.168.99.100:8081/nexus/content/repositories/central</url>
	    <releases>
		 <enabled>true</enabled>
	    </releases>
		<snapshots>
		 <enabled>true</enabled>
	    </snapshots>
	   </repository>
      </repositories>
	  <pluginRepositories>
	   <pluginRepository>
	    <id>central</id>
	    <url>http://192.168.99.100:8081/nexus/content/repositories/centrall</url>
	    <releases>
		 <enabled>true</enabled>
	    </releases>
		<snapshots>
		 <enabled>true</enabled>
	    </snapshots>
	   </pluginRepository>
      </pluginRepositories>
     </profile>
	</profiles>
	<activeProfiles>
	 <activeProfile>nexus</activeProfile>
	</activeProfiles>
	<servers>
	 <server>
	  <id>nexus</id>
	  <username>admin</username>
	  <password>admin123</password>
   	 </server>
	</servers>
   </settings>


3.4. Subiendo la dependencia al Nexus

Para subir la dependencia del validador de NIF a nuestro repositorio, nos bajamos los ficheros valnif-2.0.1.jar y valnif-2.0.1.pom de la siguiente url. Abrimos la terminal, nos posicionaremos en la ruta donde tengamos los ficheros descargados y ejecutamos el siguiente comando:

$> mvn deploy:deploy-file \
-DgroupId=com.aeat.valida \
-DartifactId=valnif \
-Dversion=2.0.1 \
-DgeneratePom=false \
-Dpackaging=jar \
-DrepositoryId=nexus \
-Durl=http://192.168.99.100:8081/nexus/content/repositories/releases/ \
-DpomFile=./valnif-2.01.pom \
-Dfile=./valnif-2.01.jar

Si todo ha ido bien, la salida esperada debería ser la siguiente:

3.5. Comprobando la conectividad con el nuestro repositorio

Para comprobar que tenemos conectividad con nuestro repositorio, sólo tenemos que actualizar  nuestro proyecto y ver que se descarga la dependencia.

 $> mvn -U clean install

Al actualizar el proyecto, se debería haber descargado la dependencia de nuestro Nexus y haber desaparecido los errores.

Con este último paso, estamos listo para empezar a encriptar nuestras contraseñas.

4. Encriptando nuestras contraseñas

En este apartado explicaremos todos los pasos necesarios para encriptar con Maven y comprobaremos que seguimos teniendo conectividad con la password encriptada.

4.1. Generar una clave maestra encriptada

El primer paso es generar una password maestra. La password maestra se utiliza como entrada en la función de encriptación / desencriptación de las password que encriptamos en nuestros servidores, de este modo, sólo una persona con la password maestra podrá realizar el proceso de desencriptado con éxito.

Para generar esta password maestra tenemos que ejecutar el siguiente comando:

$> mvn --encrypt-master-password <password> 

Si tienes la versión de Maven 3.2.1 o superior,no deberías pasarle tu password como argumento en el comando. A partir de la version 3.2.1 o superiores el parámetro password es opcional y si no lo pones, se solicitará al ejecutar, de la siguiente forma:

Se aconseja ejecutar el comando sin pasarle la password como parámetro,ya que si no, esta quedará registrada “en claro” en el historial, como podemos ver en esta imagen:

La salida tras ejecutar el comando para generar la password maestra es la siguiente:

Creamos un fichero llamado settings-security.xml dentro de nuestro repositorio local (${user.home}/.m2) con la password maestra anteriormente generada:

<settingsSecurity>
  <master>{jlgYBiSDIdsHs3N8neqZoEwN0+4WfwUzch2JDzm18fg=}</master>
</settingsSecurity>

El fichero settings-security.xml también lo podemos guardar dentro de una memoria USB y hacer referencia  a él desde nuestro settings-security.xml de nuestro repositorio local la siguiente manera:

<settingsSecurity>
  <master>/Volumes/{Nombre Unidad}/settings-security.xml</master>
</settingsSecurity>

4.2. Encriptar la password de nuestro Nexus

Ya solamente tenemos que encriptar la contraseña de nuestro Nexus (admin123), ejecutando el siguiente comando:

$> mvn --encrypt-password admin123

Generando la siguiente salida:

Ya sólo tenemos que cambiar nuestra contraseña «en claro» de nuestro server dentro del settings.xml por nuestra contraseña encriptada

	<servers>
		<server>
			<id>nexus</id>
			<username>admin</username>
			<password>{e8Lcy5Mt1xUHQPNpoaWrqmz33lpE74ewBLzqDr/AGPQ=}</password>
		</server>
	</servers>

4.3. Configurando nuestro Nexus en el settings.xml

Como último paso, vamos a comprobar la conectividad con nuestro Nexus con la password encriptada. Para ello, borraremos la dependencia de validador de nuestro repositorio local y volvemos a actualizar el proyecto, obteniendo la siguiente salida:

Vemos que sigue descargándose la dependencia igual que antes pero con la password encriptada.

5. Conclusiones

Hemos podido comprobar que podemos encriptar nuestras contraseñas de manera fácil y sencilla.Y si lo hace Whatsapp con los mensajes, nosotros no vamos a ser menos con nuestras contraseñas.

6. Referencias

1 COMENTARIO

  1. This is a very interesting web page and I have enjoyed reading many of the articles and posts contained on the website, keep up the good work and hope to read some more interesting content in the future. Absolutely this article is incredible. And it is so beautiful.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad