webentwicklung-frage-antwort-db.com.de

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

Ich versuche, eine JAR-Datei zu signieren und verwende JDK 1.7u1. Wir haben ein GoDaddy-Code-Signing-Zertifikat erworben, und ich habe die Anweisungen (Ansatz 1) hier befolgt: http://help.godaddy.com/article/4780

Die JAR-Zeichen sind in Ordnung, aber wenn ich versuche, den Befehl: jarsigner -verify auf meinem signierten JAR mit JDK 1.7u1 auszuführen, erhalte ich folgende Ausgabe: 

s        180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]

         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
      [CertPath not validated: null]


  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.

Ich habe auch den jarsigner -verify-Befehl unter Verwendung des gleichen JAR wie oben auf JDK 1.6u26 und 1.6u14 ausprobiert, und es kam wieder in Ordnung. (Ausgabe unterhalb von 1.6u26).

         180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF
         342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
        6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
           0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm      2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class

      [entry was signed on 12/5/11 10:24 AM]
      X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
      [certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
      X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
      [certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
      [KeyUsage extension does not support code signing]
      X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
      [certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]


  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.

Verpasse ich einen zusätzlichen Schritt, den ich machen muss, um das JAR richtig für JDK 1.7 zu signieren?

44
Seth

Sie sind nicht etwas vermissen und Sie sind definitiv nicht alleine mit diesem Problem. Nach fast 12 Stunden Kampf fand ich heraus, dass der Grund des Problems darin liegt, Binaries aus JDK 1.7 mit einer älteren Java-Version wie JRE-1.6 zu mischen. Genauer gesagt, keytool wird mit JRE geliefert, während JDK sowohl keytool als auch jarsigner enthält.

Um das Problem zu beheben, habe ich JDK-1.7 vollständig von meinem System deinstalliert und JDK-1.6 Update 30 installiert. Wenn ich jarsigner -verify -verbose -certs blah.jar machen würde, würde er jar verified ohne eine Warnung erzeugen, von der ich glaube, dass sie das ist, was Sie erwarten.

48
gsbabil

Ich habe das gleiche Problem und wenn es anderen helfen kann, liegt das Problem darin, wie jarsigner den Schlüsselspeicher findet.

Um das Problem zu beheben, gehen Sie wie folgt vor: 

jarsigner -verify -keystore xxxx.jks mysignedjar.jar
76
Alain P

Es ist nur eine Warnung, die Sie ignorieren können.

Wenn Sie es wirklich nicht ignorieren möchten, teilen Sie jarsigner mit, wo sich Ihr Keystore befindet, wenn Sie dies überprüfen.

jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOUR_JAR_FILE}

Dies ist nur eine Neuerung in JDK 7.

18
Daniele Segato

Ich hatte ein ähnliches Problem mit der "DigiCert SHA2 Assured ID Code Signing CA". Alle Oracle Java-Versionen sowie OpenJDK verhalten sich gleich. Der Digicert-Support hat mich auf diese Seite weitergeleitet, aber nichts, was hier angegeben wurde, hatte mir auch beim Verifizierungsprozess geholfen.

Ich versuche, ein Applet zu signieren, daher muss es auch im Browser überprüfbar sein. Daher ist der Trick, den Keystore-Pfad für jarsigner -verify anzugeben, nicht anwendbar.

Das Hauptproblem scheint ein Fehler in keytool zu sein, wenn mit Zertifikaten gearbeitet wird, die SHA2 anstelle von SHA1 verwenden, da dieselbe Liste von Schritten, die auf SHA1-Zertifikaten angewendet werden, immer funktioniert und für SHA2 für mich nie funktioniert hat. Es scheint mir, dass keytool nicht in der Lage ist, die "Kettenfähigkeit" von in jks importierten Zertifikaten zu erkennen, und daher bettet jarsigner keine richtige certs-Kette in das signierte Glas, sondern nur das endgültige Zertifikat, das in den META-INF/myalias gespeichert ist. RSA-Datei stattdessen (überprüfbar durch openssl pkcs7 -in myalias.RSA -print_certs -inform DER -out certs.crt).

Digicert schlug vor, " ... manchmal sehen wir Probleme mit dem Stamm, der beim ersten Mal nicht richtig oder vollständig importiert wird. Wenn Sie jedoch einen Importbefehl ausführen, der erneut auf den Stamm verweist, kann dies behoben werden ", auch wenn dies nicht geholfen hat mein Fall.

Da es keine Möglichkeit gibt, explizit zu keytool zu sagen, welche Zertifikate sich in einer Kette befinden, habe ich mich entschieden, eine Kette mit openssl zu erstellen und sie folgendermaßen zu importieren:

cat TrustedRoot.pem DigiCertCA2.pem my.crt  >chain
openssl pkcs12 -nodes -export -in my.crt  -inkey my.key -out tmp.p12 -name myalias -certfile chain
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore tmp.p12 -srcstoretype PKCS12

Danach scheint, dass mykeystore.jks nur mein Zertifikat enthält, nicht DigiCertCA2 oder den Stamm, wenn er mit dem Befehl keytool -list aufgelistet wird. Mit -v (verbose) wird jedoch die Kettentiefe und ihre Zertifikate angezeigt:

~/$ keytool  --list --keystore mykeystore.jks  -v|grep -e chain -e Certificate\\[
Enter keystore password:  123456
Certificate chain length: 3
Certificate[1]:
Certificate[2]:
Certificate[3]:

Und dies ist es, was jarsigned benötigt, um das Glas ordnungsgemäß zu signieren, d. H., Um die richtige Certs-Kette einzubetten und das Glas auch für den endgültigen Browserbenutzer überprüfbar zu machen.

5
tomas

Ich habe festgestellt, dass die Meldung "Diese jar enthält Einträge, deren Zertifikatkette nicht validiert ist" auch gedruckt wird, wenn Sie die Jar-Datei mit JRE 1.7.0_21 signieren und mit einer niedrigeren Version von JRE 1.7.0 überprüfen. 

Fazit: Es ist kein Downgrade auf Java 1.6 erforderlich. Verwenden Sie einfach dieselbe Jarsigner-Version zum Signieren und Überprüfen.

2
lyaffe

Dies ist ein Sicherheitsmechanismus in JDK 7+. Dies gibt die Warnung aus, wenn Gläser ohne Zeitstempel signiert werden, die mit einem -tsa-Flag übergeben werden können. Wenn ein Glas keinen Zeitstempel hat, funktioniert es nicht mehr nach dem Gültigkeitsdatum.

Wenn Sie ein Android-Ziel erstellen, wird diese Warnung immer gedruckt, wenn Sie ein JDK neuer als 1.7.0_51 verwenden. Android empfiehlt im Allgemeinen eine Gültigkeitsdauer von 30 Jahren, sodass diese Warnung zu 100% ignoriert werden kann, es sei denn, Ihr Geschäftsplan sieht vor, dass Benutzer dieselbe .apk-Datei im Jahr 2046 verwenden dürfen.

Hier ist das Ticket für die Funktion, das Ziel ist, Zeitstempel zu fördern, die meiner Meinung nach effektiv sein werden. http://bugs.Java.com/view_bug.do?bug_id=8023338 .

2
mateor

Wenn Sie Ihr Zertifikat auf einem von Jarsigner verwendeten p12 erstellen/exportieren, müssen Sie sicherstellen, dass Folgendes ausgewählt ist (z. B. beim Export mit dem Internet Explorer-Assistenten).

"Den privaten Schlüssel exportieren" "Wenn möglich, alle Zertifikate in den Zertifizierungspfad einschließen" "Exportiere alle erweiterten Eigenschaften" unter der Option .PFX oder PKCS # 12 aktiviert.

Wenn Sie den p12 erst richtig erstellen, erfordert jarsign keinen besonderen Aufwand.

0
PGP

Wenn Ihre Zertifikate von Entrust stammen, stellen Sie sicher, dass Sie das neuere Stammzertifikat verwenden.

http://www.entrust.net/knowledge-base/technote.cfm?tn=7875

Problem:

Sie erhalten eine Fehlermeldung, die Ihr SLL-Zertifikat angibt Die Validierung ist aufgrund eines fehlenden Felds für grundlegende Einschränkungen fehlgeschlagen.

Lösung: 

Im Jahr 2009 veröffentlichte Entrust das 2048-Bit-Stammzertifikat erneut, um .__ aufzunehmen. das Feld Grundbedingungen (cn = Entrust.net Certification Authority (2048), gültig bis 24.07.2029). Entrust hat die Ausgabe von .__ gestoppt. ursprüngliches 2048-Bit-Root durch Root-Updates in Windows und Java (ab Version 1.6 Update 22). Das aktualisierte Stammzertifikat mit grundlegenden Einschränkungen finden Sie hier:

https://www.entrust.net/downloads/binary/entrust_2048_ca.cer

0
cmcginty