Marco Schulz Selbstständig

Bei der Umsetzung eigener Prozesse ist es ratsam, sich stets an etablierten Standards zu orientieren.

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 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 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 keystore.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 Keytool zusätzliche Eingaben mit weiteren Informationen zum Aussteller. Abbildung 1 zeigt die gesamten Schritte in der Bash.

Abb. 1: Keystore braucht nach der Installation noch weitere Angaben

Abb. 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 kontinuierlich Ausführen nicht notwendiger Schritte. Das bringt uns auch gleich direkt zum nächsten Punkt, der Konfiguration von Maven.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 11.17 - "Per Anhalter durch das Cloud-Universum"

Alle Infos zum Heft
579813086Security mit Maven und dem Jarsigner-Plug-in
X
- Gib Deinen Standort ein -
- or -