© Excellent backgrounds/Shutterstock.com
Security mit Maven und dem Jarsigner-Plug-in

Der Autogrammjäger


Um in sicherheitskritischen Anwendungen die notwendige Kontrolle über die eingebrachten Artefakte zu behalten, lassen sich mit dem Build-Werkzeug Maven erstellte Bibliotheken kryptografisch signieren. Dieser Artikel zeigt, wie Zertifikate zu erstellen sind und wie mit diesen Zertifikaten anschließend Java-Archive im Build-Prozess signiert werden können.

Die Beweggründe, eigens erstellte Artefakte zu signieren, können zwar unterschiedlich motiviert sein, jedoch lassen sie sich üblicherweise auf die beiden Aspekte der Autorisierung und Authentifizierung reduzieren. Gerade für Unternehmen, die hohe Sicherheitsanforderungen an ihre Applikationen stellen müssen, ist der im Folgenden beschriebene Prozess eine einfache Möglichkeit, den geforderten Bestimmungen gerecht zu werden.

Für unsere Betrachtungen ist ein bereits mit Maven [1] realisierter Build Voraussetzung. Das Ausliefern der Artefakte übernimmt ein Repository-Server. Für die hier gezeigten Beispiele wurde auf die frei verfügbare Communityversion von Sonatype Nexus [2] zurückgegriffen, die auch als Docker Image bereitsteht. Mit einigen Anpassungen lässt sich der hier beschriebene Workflow auch auf andere Technologien wie Gradle und Artifactory adaptieren.

Beginnen wir mit den technischen Vorbereitungen und erzeugen zuerst mit dem Keytool aus dem Java SDK einen kryptografischen Schlüssel. Unter Linux ist dazu auf der Kommandozeile folgende Anweisung einzugeben: /usr/bin/keytool -keystore keystore.iks -genkey -alias together.

Für Windows ist lediglich der Pfad auf die Java-Installation anzupassen, in der das Keytool residiert. Das Keytool findet sich übrigens in der JRE- und SDK-Installation. Der Parameter keystore erzeugt den Dateinamen der erstellten Signatur. In unserem Fall lautet er key­store.jks und wird im Nutzerverzeichnis des angemeldeten Benutzers abgelegt. Als Alias geben wir together an. Für den Alias eignet sich üblicherweise der Projektname. Es besteht aber auch die Möglichkeit, alle Artefakte eines Unternehmens mit dem gleichen Schlüssel zu signieren. In diesem Fall ist der Unternehmensname eine gute Wahl für den Alias. Nach der Ausführung des beschriebenen Kommandos erwartet Key­tool zusätzliche Eingaben mit weiteren Informationen zum Aussteller. Abbildung 1 zeigt die gesamten Schritte in der Bash.

schulz_maven_1.tif_fmt1.jpgAbb. 1: Keystore braucht nach der Installation noch weitere Angaben

Nach der erfolgreichen Generierung des kryptografischen Schlüssels ist dieser in unserem Maven-Projekt abzulegen. Hierzu bietet sich das Verzeichnis /src/site/resources/ an. Es steht natürlich frei, einen anderen Ablageort innerhalb des Projekts zu bestimmen. Der Vorteil, die Signatur im site-Verzeichnis und nicht unter /src/main/resources/ zu speichern ist, dass die Konfiguration von Maven übersichtlicher gehalten wird. Im resources-Verzeichnis würde Maven den Schlüssel mit in das signierte Artefakt einbringen. Da dies nicht notwendig ist, besteht auch kein Grund, den Schlüssel mit auszuliefern. Um eine Auslieferung zu unterbinden, müssten sonst zusätzlich Filter für resources konfiguriert werden. Das können wir uns dank der Vorüberlegungen sparen.

Auch wenn es im ersten Moment etwas pedantisch erscheint, lohnt es sich, die einzelnen Schritte des Build Scripts im Auge zu behalten. Gerade Unternehmen, die sowohl den Build-Prozess als auch ihre Applikationen monolithisch aufgebaut haben, kämpfen nicht selten mit langen Build-Zeiten. Das begünstigt den Arbeitsfluss der Entwickler nicht gerade. Ein Grund dafür sind umfangreiche Dateioperationen und das kontinuierliche Ausführen nicht notwendiger Schritte. Das bringt uns auch gleich direkt zum nächsten Punkt, der Konfiguration von Maven.

Zeit für die Bastelstunde

Herzstück aller Anstrengungen ist das Maven-Jarsigner-Plug-in [3], das mit folgenden Zeilen in die POM im Abschnitt build als plugin unter <PluginManagement> einzutragen ist (Listing 1).

Listing 1: Plug-in integrieren

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jarsigner-plugin</artifactId> <version>1.4</version> <executions> <execution> <goals> <goal>sign</goal> <goal>verify</goal> </goals> </execution> </executions> <configuration> <keystore>${basedir}/src/site/resources/keystore.iks</keystore> <alias>together</alias> <storepass>geheim</storepass> <keypass>geheim</keypass> <verbose>true</verbose> <certs>true</certs> </configuration> </plugin>

Wie leicht zu sehen ist, wurden die beiden Goals sign und verify zur Ausführung gebunden. Die Konfiguration zeigt auf den kryptografischen Schlüssel und definiert den verwendeten Alias, der bereits bei der Erzeugung des Keystores festgelegt wurde. Um das Plug-in auch zur Arbeit bewegen zu können, müssen noch die Passwörter eingetragen werden. Im Moment sind sie noch im Klartext zu lesen. Diesem w...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang