{"id":530,"date":"2024-12-04T09:37:51","date_gmt":"2024-12-04T08:37:51","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=530"},"modified":"2025-01-03T09:38:29","modified_gmt":"2025-01-03T08:38:29","slug":"signieren-von-java-jars-und-die-ausfuehrung-mit-signaturchecks","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=530","title":{"rendered":"Signieren von Java-JARs und die Ausf\u00fchrung mit Signaturchecks"},"content":{"rendered":"\n<p>Das Signieren von Java-JAR-Dateien ist ein wichtiger Sicherheitsmechanismus, der sicherstellt, dass der Code von einer vertrauensw\u00fcrdigen Quelle stammt und w\u00e4hrend der \u00dcbertragung nicht manipuliert wurde. Diese Technik ist essenziell, wenn Java-Anwendungen in sicherheitskritischen Umgebungen ausgef\u00fchrt werden sollen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Grundlagen des Signierens<\/h4>\n\n\n\n<p>Eine JAR-Datei (\u201eJava Archive\u201c) ist ein komprimiertes Archiv, das Java-Klassen, Metadaten und andere Ressourcen wie Konfigurationsdateien oder Bilder enthalten kann. Durch das Signieren einer JAR-Datei wird eine digitale Signatur hinzugef\u00fcgt, die von einer vertrauensw\u00fcrdigen Zertifizierungsstelle (Certificate Authority, CA) oder einer lokalen Entwicklungsumgebung erstellt wird. Diese Signatur stellt sicher, dass die JAR-Datei unver\u00e4ndert ist und von der angegebenen Quelle stammt.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Notwendige Werkzeuge<\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Keytool:<\/strong> Wird verwendet, um ein Sch\u00fcsselpaar zu generieren und Zertifikate zu verwalten.<\/li>\n\n\n\n<li><strong>Jarsigner:<\/strong> Ein Kommandozeilenwerkzeug, das von Java bereitgestellt wird, um JAR-Dateien zu signieren.<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\">Schritte zur Signierung einer JAR-Datei<\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Sch\u00fcsselpaar generieren:<\/strong> Ein Sch\u00fcsselpaar bestehend aus einem privaten und einem \u00f6ffentlichen Schl\u00fcssel wird mit dem Befehl <code>keytool<\/code> erzeugt: <code>keytool -genkeypair -alias meinSchluessel -keyalg RSA -keysize 2048 -keystore meinKeystore.jks -validity 365<\/code> Dabei:\n<ul class=\"wp-block-list\">\n<li><code>-alias<\/code>: Der Name des Schl\u00fcssels im Keystore.<\/li>\n\n\n\n<li><code>-keyalg<\/code>: Der Algorithmus, z. B. RSA.<\/li>\n\n\n\n<li><code>-validity<\/code>: Die G\u00fcltigkeitsdauer des Schl\u00fcssels in Tagen.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>JAR-Datei signieren:<\/strong> Mit dem Werkzeug <code>jarsigner<\/code> wird die JAR-Datei signiert: <code>jarsigner -keystore meinKeystore.jks -signedjar signierteApp.jar originalApp.jar meinSchluessel<\/code> Hierbei wird die Datei <code>originalApp.jar<\/code> mit dem privaten Schl\u00fcssel signiert und die signierte Datei als <code>signierteApp.jar<\/code> ausgegeben.<\/li>\n\n\n\n<li><strong>Optional: Zertifikat von einer CA beziehen:<\/strong> Um die Signatur vertrauensw\u00fcrdiger zu machen, kann das Zertifikat bei einer anerkannten CA angefordert und eingebunden werden.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Validierung der Signatur<\/h4>\n\n\n\n<p>Bei der Ausf\u00fchrung einer signierten JAR-Datei pr\u00fcft die JVM (Java Virtual Machine), ob die Signatur g\u00fcltig ist. Dies geschieht, indem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>die Integrit\u00e4t der JAR-Datei \u00fcberpr\u00fcft wird (d. h., ob sie seit der Signierung unver\u00e4ndert blieb),<\/li>\n\n\n\n<li>das Zertifikat auf G\u00fcltigkeit und Vertrauen untersucht wird.<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Beispiel f\u00fcr die Ausf\u00fchrung mit Signaturchecks<\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Starten der Anwendung mit aktivierten Sicherheitspr\u00fcfungen: <code>java -jar signierteApp.jar<\/code><\/li>\n\n\n\n<li>Fehler bei ung\u00fcltiger Signatur:\n<ul class=\"wp-block-list\">\n<li>Ist die Signatur ung\u00fcltig oder wurde die Datei manipuliert, gibt die JVM eine Ausnahme aus: <code>java.security.SignatureException: Jar file has been tampered with or is not signed by a trusted source.<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Vertrauensw\u00fcrdigkeit pr\u00fcfen: Wenn die Signatur nicht mit einer bekannten CA erstellt wurde, muss der Benutzer explizit zustimmen, die Quelle als vertrauensw\u00fcrdig einzustufen. Alternativ k\u00f6nnen Zertifikate in den lokalen Keystore der JVM importiert werden: <code>keytool -import -trustcacerts -file meinZertifikat.cer -alias meineCA -keystore cacerts<\/code><\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Limitationen des Ansatzes<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Manipulation nach Signierung:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Wenn die JAR-Datei nachtr\u00e4glich modifiziert wird (z. B. durch Hinzuf\u00fcgen oder Entfernen von Dateien), wird die Signatur ung\u00fcltig. Dies bietet jedoch keinen Schutz gegen \u00e4hnliche, aber andere Angriffsvektoren, wie Schwachstellen im Code selbst.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abh\u00e4ngigkeit von Zertifizierungsstellen:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Selbst signierte Zertifikate sind weniger vertrauensw\u00fcrdig, da sie nicht von einer CA beglaubigt wurden. Der Bezug eines Zertifikats von einer anerkannten CA kann teuer und zeitaufw\u00e4ndig sein.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Zertifikatsablauf:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Ein Zertifikat hat eine begrenzte G\u00fcltigkeitsdauer. Nach Ablauf muss die Anwendung erneut signiert oder das Zertifikat verl\u00e4ngert werden.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Fehlende Verschl\u00fcsselung:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Die Signatur stellt sicher, dass die Datei nicht manipuliert wurde, bietet aber keinen Schutz gegen das Auslesen der JAR-Inhalte. Um Vertraulichkeit zu gew\u00e4hrleisten, ist zus\u00e4tzliche Verschl\u00fcsselung erforderlich.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abh\u00e4ngigkeit von der JVM:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Der Signaturcheck wird ausschlie\u00dflich von der JVM durchgef\u00fchrt. Nutzer, die andere Tools verwenden oder die Sicherheitspr\u00fcfungen umgehen, k\u00f6nnen die Integrit\u00e4t nicht sicherstellen.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Das Signieren von JAR-Dateien ist eine bew\u00e4hrte Methode, um die Integrit\u00e4t und Authentizit\u00e4t von Java-Anwendungen sicherzustellen. Dennoch ist es kein Allheilmittel und sollte in Kombination mit anderen Sicherheitsma\u00dfnahmen wie Code-Reviews, Verschl\u00fcsselung und Laufzeitschutzmechanismen eingesetzt werden. Entwickler sollten sich der Limitationen bewusst sein und pr\u00fcfen, ob der Ansatz den Sicherheitsanforderungen ihres Projekts entspricht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Signieren von Java-JAR-Dateien ist ein wichtiger Sicherheitsmechanismus, der sicherstellt, dass der Code von einer vertrauensw\u00fcrdigen Quelle stammt und w\u00e4hrend der \u00dcbertragung nicht manipuliert wurde. Diese Technik ist essenziell, wenn Java-Anwendungen in sicherheitskritischen Umgebungen ausgef\u00fchrt werden sollen. Grundlagen des Signierens Eine JAR-Datei (\u201eJava Archive\u201c) ist ein komprimiertes Archiv, das Java-Klassen, Metadaten und andere Ressourcen wie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-530","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=530"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/530\/revisions"}],"predecessor-version":[{"id":531,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/530\/revisions\/531"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}