Meer met Maven – Password encryption

In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.

Voor een aantal taken is Apache Maven afhankelijk van externe servers. Dat begint al wanneer je voor het eerst gebruikt maakt van Maven, waarbij ogenschijnlijk “het internet gedownload wordt”. Je kunt Maven Central anoniem benaderen, maar er zijn ook systemen te bedenken waarbij je je credentials mee moet geven.

De settings.xml biedt ruimte om dit soort gegevens vast te leggen met behulp van <server> entries. De meest gebruikte elementen van zo’n entry zijn <username/> en <password/>. Het wachtwoord mag als plain-tekst ingevuld worden, maar kan ook zeker encrypted opgeslagen worden. Om een wachtwoord te encrypten, moet je de volgende stappen uitvoeren.

 

1. Aanmaken van een master-password

Via de commandline voer je het volgende uit: ‘mvn –emp’ of ‘mvn –encrypt-master-password’ gevolgd door een wachtwoord. In de console zie je vervolgens het encrypted wachtwoord, dat er ongeveer zo uit kan zien:


{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}

 

Maak het volgende bestand aan: ${user.home}/.m2/settings-security.xml. Neem het encrypte wachtwoord op in dit bestand, zodat de inhoud er als volgt uit ziet:


<settingsSecurity>
  <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>

 

2. Encrypt password

Aan de hand van dit master password worden de overige wachtwoorden versleuteld. De werkwijze is vergelijkbaar met het encrypten van het master password, maar nu gebruik je het volgende command: ‘mvn -ep’ of ‘mvn encrypt-password’ gevolgd door het wachtwoord. Ook dit levert één regel op in je console met het encrypted wachtwoord. Deze waarde kun je overnemen tussen je password tags. Je kunt het eventueel uitbreiden met commentaar:


<server>
  <id>my.server</id>
  <username>foo</username>
  <password>Expires on 2015-11-13 {COQLCE6DU6GtcS5P=}</password>
</server>

 

Behalve voor servers kun je ook voor proxies (tevens in de settings.xml) op deze manier een encrypted password opnemen.

Er kleeft één klein nadeel aan het gebruik van het encrypten op deze manier. Je kunt je wachtwoord via je history nog zien als plain-tekst. Pas met Maven 3.2.1 (toen JDK6 als minimum runtime werd vereist) konden we dit probleem oplossen door gebruik te maken van  de java.io.Console#readPassword(). Voortaan hoef je alleen nog maar ‘mvn -emp’ of ‘mvn -ep’ te gebruiken. Vervolgens zal er om het wachtwoord gevraagd worden, maar deze zal dan niet in het scherm getoond worden. Op deze manier zal niemand meer via de history achter de gebruikte wachtwoorden kunnen komen.