2013-09-26 14 views
18

Der Fall: Ich bin Aufrechterhaltung eines Java-Applets, die die BouncyCastle Bibliotheken verwendet bcpkix-jdk15on-149.jar und bcprov-jdk15on-149.jar.BouncyCastle Cryptography Anbieter Bibliothek mit Applet auf Java 7u40 verwendet

Problem ist, wenn das Applet auf einem JRE-Version 7_u40 aktiviert Browser ausgeführt wird.
Das Verhalten hat sich gegenüber Version 7_u25 so geändert, dass immer ein modales Fenster wie "Sicherheitsabfrage für eine App mit selbstsigniertem Zertifikat" angezeigt wird (das nicht mehr dauerhaft ausgeblendet werden kann), nur vertrauenswürdig bcprov.

https://www.java.com/en/download/help/appsecuritydialogs.xml

Soweit ich weiß, ist dies, weil BC Bibliotheken mit dem BouncyCastle Zertifikat signiert sind, von dem "JCE Code Signing CA" ausgestellt. Aus diesem Grund kann die lib als Kryptografieanbieter fungieren und agieren.

ABER: Die JRE kann die Zertifikatskette nicht erstellen, um der Signatur zu vertrauen. Es zeigt „Anbieter: UNKNOWN“

Ich weiß, dass ich diese Signatur entfernen und Zeichen von mir (ich besitze ein Zeichen Zertifikat Thawte Code):

  • es mit bcpkix lib arbeitet
  • es nicht funktioniert mit bcprov, weil es nicht als ein gültiger Kryptografieanbieter betrachtet wird (es wird von der JRE nicht vertrauenswürdig sein).

Bin ich richtig? Was kann ich tun?
PS: Ich googelte viel, um das JCA-Root-Zertifikat zu finden (um es in den JRE-Truststore zu legen), ohne Erfolg ... Gibt es eine Möglichkeit, diese Root-CA zu greifen?

+0

Einige Leute haben mir gesagt, die bcprov Bibliothek zu unterzeichnen ein zweites Mal mit meinem eigenen Zertifikat (bereits von BC unterzeichnet). Das Problem ist, dass das Ergebnis bei der Verifizierung mit "jarsigner" fehlschlägt. Also, wenn jemand weiß, wie man eine andere Signatur in eine JAR-Datei legt, lass es mich wissen –

Antwort

21

Nach viel suchen und einig Post in BC Mailing-Liste .... fand ich die Lösung, so lasse ich es hier für andere, die diese Frage stellen können:

Die Lösung ist im Grunde die BC zu unterzeichnen Bibliothek ein zweites Mal mit meinem eigenen Zertifikat.
Die JAR benötigt die JCA-Signatur, um als Kryptographieanbieter vertrauenswürdig zu sein. Entfernen Sie sie daher nicht.
Das JAR benötigt (zusätzlich) eine Codesignatur, um in der JVM (vertrauenswürdig durch die JRE) ausgeführt werden zu können.

Eine letzte Sache, passiert einige Inkompatibilität auf der Signaturtechnologie:

  • BC lib unterzeichnet wird mit SHA1 Algorythm
  • jarsigner (auf meinem Computer) verdauen wird die Signatur mit SHA256 digest algorythm standardmäßig tun, was zu einem Verifikationsfehler führt.
  • Also musste ich Jarsigner bitten, es auf die SHA1-Art zu tun.(Aus irgendeinem Grunde haben beide Unterschriften von diesem Standpunkt aus betrachtet, konsequent sein)

Hier ist die magischen Parameter von jarsigner Befehl hinzufügen und machen es möglich: -digestalg SHA1

Beispielbefehl:

jarsigner -keystore ./mykeystore.jks -storepass myPass -digestalg SHA1 bcprov-jdk15on-149.jar myAlias 

... und fertig!

Der folgende Beitrag gab mir den Tipp: What prevents Java from verifying signed jars with multiple signature algorithms

+2

du bist ein Gott unter Männern –

+0

mein Applet ist eine Jar-Datei, die Klassen aus allen anderen Gläsern einschließlich Bounty Castle enthält, bekomme ich diese Ausnahme verursacht von: java.io.IOException: Fehler beim Erstellen von MAC: java.lang.SecurityException: JCE kann den Provider BC nicht authentifizieren. Bitte beachten Sie, wie man jarsigner verwendet, wenn bc-Klassen in meinem Applet-Jar sind. – user884424

+1

Nur ein Kommentar, auf meinem System (Ubuntu 14.04 64 Bit, OpenJDK 7) mit bcprov-jdk15on v1.56, musste ich es mit -digestalg SHA-256 signieren, damit die Verifizierung erfolgreich war. – ixM

0

Wir haben auch die anderen Stackoverflow Post enthalten kann und die Antwort, die mir geholfen haben:

Putting der Linie

: Security.addProvider (neu org.bouncycastle. jce.provider.BouncyCastleProvider());

Hat mir geholfen, die Ausnahme loszuwerden.

Quelle: jce cannot authenticate the provider bc