it-swarm.com.de

Signieren einer JAR-Datei mit einem vertrauenswürdigen Zertifikat für die JWS-Bereitstellung

Ich habe ein Open Source-Programm entwickelt, WPCleaner, das über Java Web Start verteilt wird. Aktuelle Version ist verfügbar unter http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

Mit den jüngsten Updates in Java wird es immer schwieriger, Java-Anwendungen über Java Web Start bereitzustellen, wenn die Anwendung über einige Berechtigungen verfügt (Schreiben in die Voreinstellungen, Zugriff auf andere Websites, ...).

Meine Anwendung war selbstsigniert, was zuvor in Ordnung war, aber neue Updates erfordern, dass die Anwendung bei jeder Ausführung der Anwendung akzeptiert wird, nicht nur ein für alle Mal, wenn sie dies wünschen. Also entschied ich mich, ein vertrauenswürdiges Zertifikat zum Signieren meiner Anwendung zu verwenden.

Ich habe eines von Certum erhalten (anscheinend ist es für Open Source-Entwickler frei). Im Anschluss an diese Diskussion: Code-Signaturzertifikat für Open Source-Projekte?

Ich habe eine neue JAR-Datei generiert, die mit diesem Zertifikat signiert ist (JAR-Datei unter http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar ), aber ich habe immer noch Probleme: Wenn ich anfange Die Anwendung über JWS und Java zeigt immer noch ein Warnfenster an, das mich nicht ein für allemal der Anwendung vertrauen lässt. Der Editor wird immer noch als UNBEKANNT angezeigt, aber wenn ich in den Details der Nachricht nachschaue, wird mein neues Zertifikat von Centrum verwendet.

Hat jemand eine Idee, was ich falsch mache? Ich dachte, ein Zertifikat einer vertrauenswürdigen Zertifizierungsstelle (Centrum scheint in Java-Zertifikaten zu sein) würde es den Benutzern ermöglichen, das Zertifikat ein für alle Mal zu akzeptieren.

Vielen Dank

PS: Wenn ich jarsigner -verify starte, erhalte ich die folgende Warnung "Diese Dose enthält Einträge, deren Zertifikatkette nicht validiert ist."

17
NicoV

Ich glaube, ich habe es nach diesem Verfahren endlich geschafft:

  • Das von Certum in Chrome bereitgestellte Zertifikat über die Website-Schnittstelle installiert
  • Export des privaten Schlüssels als .pfx aus Chrome (Einstellungen, Zertifikate verwalten, Exportieren, Privater Schlüssel exportieren, PKCS # 12, ...)
  • Verwenden Sie die KeyTool-GUI (Java-Fronted GUI für Keytools), um ein vollständiges p12 zu erstellen: importiertes Certum-Stammzertifikat als vertrauenswürdiges Zertifikat, importierte Zwischenzertifikate als vertrauenswürdige Zertifikate, importierte meine .pfx-Datei als Schlüsselpaar
  • Unterzeichnete das Glas mit diesem p12

Scheint für mich zu arbeiten, ich warte auf das Feedback anderer Benutzer, um sicher zu sein, dass es auch für sie funktioniert.

Bearbeiten: Ich habe erneut versucht, das Zertifikat aus Chrome zu exportieren, und ich habe gesehen, dass es eine Option gibt, die Zertifikatkette in den Export aufzunehmen. Ich brauche danach nicht einmal die GUI von KeyTool. Ich habe die mit diesem neuen p12 signierte Testversion erneut implementiert:

  • Das von Certum in Chrome bereitgestellte Zertifikat über die Website-Schnittstelle installiert
  • Export des privaten Schlüssels als .pfx aus Chrome (Einstellungen, Zertifikate verwalten, Exportieren, Privater Schlüssel exportieren, PKCS # 12 + Zertifikatkette einschließen, ...)
  • Unterzeichnete das Glas mit diesem p12
6
NicoV

[Update 2017] Open Source Code Signing von Certum verwendet jetzt eine kryptografische Flash-Karte als privaten Schlüssel und muss für die Aktivierung und Installation des Zertifikats sowie für die Signatur des Codes angeschlossen sein. Der Schlüssel kostet 125 $ (+ Versandkosten) und das 1-Jahres-Zertifikat allein 40 $. Sie können einen Rabatt verlangen.


Gehen Sie wie folgt vor, um Ihre JAR-Datei von Grund auf zu signieren.

Anweisungen

Anweisungen in englischer Sprache sind schwer zu finden und nicht auf dem neuesten Stand. Das folgende Verfahren basiert auf diesen beiden Dokumenten:

Zertifikat erstellen, aktivieren und installieren:

  1. Gehen Sie auf die Website "Certum Certification" im Bereich "OpenSource Code Signing" und bestellen Sie Ihr Zertifikat.
  2. Sobald die kryptografische Flash-Karte empfangen wurde (es dauerte 15 Tage für mich), stecken Sie sie ein, installieren Sie den Treiber und die Software proCertum CardManager von der Karte.
  3. Gehen Sie zu Ihrem Certum-Konto und verfolgen Sie den Aktivierungsprozess Ihres neu bestellten Zertifikats.

Tipp: Die CryptoAgent Java Web Start-Anwendung kann nur mit einem JDK (nicht JRE) <9 (also JDK 7 oder 8) ausgeführt werden.

  1. Sie erhalten eine E-Mail mit der Bitte um offizielle Dokumente (Personalausweis, Mietrechnung usw.) und ein E-Mail-Überprüfungsverfahren.
  2. Senden Sie die für die Aktivierung erforderlichen Dokumente und Informationen. Sie erhalten eine weitere E-Mail, in der Sie zur Installation des Zertifikats aufgefordert werden (die Überprüfung wurde innerhalb einer Stunde durchgeführt).
  3. Installieren Sie das Zertifikat gemäß der Prozedur Speichern des Zertifikats auf der Karte auf der Verschlüsselungskarte (siehe Anweisungen in Englisch, Teil 4).

Erhalte die Datei "bundle.pem"

Diese Datei ist obligatorisch, um eine gültige Zertifikatskette zu erhalten, wenn Sie Ihre Bewerbung unterschreiben (siehe Abschnitt 7.1.2 in den Anweisungen auf Polnisch).

Im Wesentlichen besteht die Verkettung in einem Nur-Text-Format aus 1) Ihrem Zertifikat und 2) dem öffentlichen Schlüssel Certum Code Signing CA SHA2.

  1. Öffnen Sie proCertum CardManager >> Karte lesen >> Registerkarte Allgemein >> Wählen Sie Ihr Zertifikat aus und klicken Sie auf "Details anzeigen".
  2. Exportieren Sie Ihr Zertifikat: x509 - base-64
  3. Laden Sie die Certum-Codesignatur CA SHA2 im PEM-Format (aus der Liste der Stammzertifikate von Certum) herunter.
  4. Erstellen Sie die Textdatei "bundle.pem", indem Sie diese beiden Zertifikate verketten (zuerst Ihr Zertifikat und dann das Certum-Zertifikat).

Signiere deine JAR-Datei mit Jarsigner

  1. Erstellen Sie die Datei "provider.cfg", wie in Abschnitt 7.2 der Anweisungen auf Englisch beschrieben.
  2. Sie benötigen das Alias ​​Ihres Zertifikats (und nicht den Besitzername ), um Ihr Glas zu signieren. Um es zu erhalten, führen Sie den folgenden Befehl aus:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
  1. Sobald Sie die Alias, die provider.cfg und bundle.pem -Dateien erstellt haben, unterschreiben Sie einfach Ihr jar mit dem folgenden Befehl:
jarsigner -keystore NONE -certchain "bundle.pem" -tsa "http://time.certum.pl" -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]" "[your_code].jar" "[your_alias]"

Ich persönlich benutze ein Ant-Skript, um meine Anwendungs-JAR-Dateien zu signieren. Siehe signjar task aus dem ANT-Projekt.

10
Eric David

Ich warte auf das Feedback anderer Benutzer, um sicherzustellen, dass es auch für sie funktioniert.

Basierend auf JaNeLA für die dateigültige JNLP. Am wichtigsten ist bekannter Herausgeber für WikiCleanerTest .. 

enter image description here

Es gibt also ein Ergebnis von "scheint hier zu arbeiten, um den Herausgeber zu identifizieren". Tolle Arbeit und danke für die Beschreibung des Prozesses.

Funktioniert so viel besser als die, die ich zuvor angeschaut habe. : P


Jarsigner -verifizieren

s     292828 Sun Oct 20 17:57:58 EST 2013 META-INF/MANIFEST.MF
      292645 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.SF
        2017 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.RSA
           0 Sun Oct 20 17:57:52 EST 2013 META-INF/
           0 Wed Feb 11 15:04:50 EST 2009 META-INF/maven/
           ..
           0 Sun Oct 20 17:57:32 EST 2013 org/xnap/commons/i18n/
sm      2837 Thu Sep 09 16:00:54 EST 2004 META-INF/info.xml
..
sm       214 Wed Feb 11 00:57:02 EST 2009 org/xnap/commons/i18n/LocaleChangeListener.class

  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning: 
This jar contains entries whose certificate chain is not validated.

Re-run with the -verbose and -certs options for more details.

Ich verstehe die Warnung:

Diese Dose enthält Einträge, deren Zertifikatkette nicht validiert ist.

..kann ignoriert werden.

JaNeLA-Bericht

JaNeLA zeigt einen Fehler.

JaNeLA Report - version 11.05.17

Report for http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected.
cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected.

XML encoding not known, but declared as utf-8
Codebase + href 'http://site4145.mutu.sivit.org/WikiCleaner.jnlp' is not equal to actual location of 'http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp'.
Desktop icons were subject to bug nnnn in earlier J2SE versions
Optimize this application for off-line use by adding the <offline-allowed /> flag.
'short' description is longer than 'default' description.
Downloads can be optimized by specifying a resource size for 'WikipediaCleaner.jar'.
The resource download at WikipediaCleaner.jar can be optimized by removing the (default) value of download='eager'.
Lazy downloads might not work as expected for WikipediaCleaner.jar unless the download 'part' is specified. 
Resource type png of resource commons-nuvola-web-broom.png is not one of the allowable types of gif, jpg, jpeg.
Downloads can be optimized by specifying a resource size for 'commons-nuvola-web-broom.png'.
Icon loading & use can be optimized by specifying the width and height for commons-nuvola-web-broom.png

Siehe die JNLP-validierte Version und eine korrigierte Version mit Tweak weiter unten.

Starten

Aber hier sind die wirklich schlechten Nachrichten:

UNKNOWN publisherUNKNOWN publisher - More Info.

Hier sind einige Details des Zertifikats:

  • Nicolas Vervelle (Nicolas Vervelle)

    • Thema: CN = Nicolas Vervelle, OU = WikipediaCleaner, O = WikipediaCleaner, L = Paris, ST = Frankreich, C = FR

Veraltetes Java

Hier ist eine seltsame Warnung, die ich nicht verstehe ..

Out Of Date Java

Die App. fordert 1.5.0+ an, daher sollte jede Version 1.7+ ohne Frage akzeptiert werden.
Es wird behauptet, 1.6 zu beantragen (wahrscheinlich, weil ich keine 1.5-Laufzeit installiert habe). Das einzige, was ich denken kann, ist das Auslösen einer Warnung, die Aufnahme einer Mikroversion, die überflüssig ist.

JNLP

Hier ist das JNLP oben validiert:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.5.0+" Java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>

Hier ist ein empfohlener Ersatz. Es gilt gemäß JaNeLA (Warnhinweise, die wir ignorieren können). Es enthält auch ein weiteres Tweak für das Mindestversionsattribut.

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <!-- Should be here.. -->
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <!-- the micro-version request might be triggering the 
    Out-Of-Date Java version warning -->
    <j2se version="1.5+" Java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>
3
Andrew Thompson

Unter Linux funktionierte das folgende Verfahren für mich. Es basiert auf der Antwort von Eric David.

Holen Sie sich Ihr Zertifikat

Besuchen Sie die Website "Certum Certification" im Abschnitt "OpenSource Code Signing". Kaufen Sie ein Zertifikat und folgen Sie den Anweisungen zum Erstellen.

Liefert den öffentlichen Schlüssel für die Code-Signatur

Holen Sie sich den Public Key der Zertifizierungscode-Signatur CA , wahrscheinlich den CA SHA2-Schlüssel cscasha2.cer .

Konvertiere das Zertifikat in das pkcs12-Format

  • Importieren Sie Ihr eigenes Zertifikat (das Sie von Certum erhalten haben) in Firefox: 
    Menüelementeinstellungen - Erweitert - Zertifikate - Zertifikate anzeigen.
  • Importieren Sie den öffentlichen CA SHA2-Schlüssel (wird von Certum zum Signieren Ihres Zertifikats verwendet): 
    tab cert. Behörden - Import.
  • Überprüfen. Es sollte sagen, dass es verifiziert wurde: 
    Reiter eigene Zertifikate - anzeigen.
  • Zertifikat exportieren: 
    Registerkarte Eigene Zertifikate - Speichern - als pkcs12 (z. B. mycert.p12)

Konvertiert das Format pkcs12 in das Format jks

Suchen Sie nach dem Alias, der in Ihrer pkcs12-Datei verwendet wird. Es wird ähnlich sein wie "unizeto technologies s.a. id von Open Source Entwickler, IHR NAME".

keytool -list -v -storetype pkcs12 -keystore mycert.p12 > out.txt
grep Aliasname out.txt

Konvertieren Sie dann die pkcs12-Datei in das jks-Format von Java. Dieser Schritt könnte weggelassen werden, aber sobald er fertig ist, ist das bequem.

keytool -importkeystore -srckeystore mycert.p12 -srcstoretype pkcs12 -srcalias "ALIASNAME" -destkeystore mycert.jks -deststoretype jks -deststorepass PASSWORD -destalias SHORTALIAS

JAR-Datei signieren

Um Warnungen an den Webstart-Benutzer zu vermeiden, sollte die JAR-Manifestdatei die folgenden Attribute enthalten:

  • Anwendungsname: APPNAME
  • Berechtigungen: alle Berechtigungen
  • Codebase: URL
  • Application-Library-Allowable-Codebase: URL

Signieren Sie Ihre JAR-Datei mit dem folgenden Befehl:

jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
2
qwert2003

Ich habe das gleiche Problem heute bei mir gelöst:

Manifest-Version: 1.0
Trusted-Library: true
Application-Library-Allowable-Codebase: *
Trusted-Only: false
Application-Name: My app
Permissions: all-permissions
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Caller-Allowable-Codebase: *
Codebase: *
0
Pignic

Wie bereits erwähnt - hier können Sie zum Entfernen der UNKNOWN PUBLISHER-Warnung das Zertifikat, das Sie zum Signieren des Jars verwendet haben, zur Signer-Jar der Java-Systemsteuerung hinzufügen: Java konfigurieren -> Sicherheit -> Zertifikate verwalten -> Signer Jar-Option - > Importieren.

0
FHeNuS