NoSuchAlgorithmException: Algorithmus HmacSHA1 nicht verfügbar

8

Schau dir die folgende Java-Zeile an:

%Vor%

Wenn ich dies in ein einfaches Testprogramm lege, läuft es ohne Probleme auf meinem Server. Wenn ich diese Zeile jedoch in einem Container verwende, bekomme ich

%Vor%

In beiden Fällen wird die gleiche JDK-Installation verwendet.

Nachdem ich etwas gegoogelt habe, habe ich es geschafft, indem ich zwei Sachen gemacht habe:

  1. Kopieren von sunjce_provider.jar von $JAVA_HOME/jre/lib/ext in das lib-Verzeichnis des Containers.
  2. Hinzufügen der folgenden Zeile zu meinem Code:

    java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());

Genauer gesagt passiert mir das in einem Apache James Mailet, aber ich bin mir ziemlich sicher, dass dies zu tun hat mit JVM-Optionen. Hier ist das Startskript , das es verwendet .

Obwohl ich es am Ende zum Laufen gebracht habe, fühlt sich die Lösung zu gehackt an, um die richtige zu sein. Ich würde mich über eine Erklärung dessen, was vor sich geht, sowie über eine "richtige" Lösung freuen.

Verwandte Frage : Die Verwendung von Java crypto führt zu NoSuchAlgorithmException . In diesem Fall bin ich jedoch ziemlich sicher, dass der HmacSHA1-Algorithmus sofort unterstützt werden sollte. Als Beweis funktioniert das ohne Probleme in einem Testprogramm.

    
itsadok 18.05.2010, 10:11
quelle

4 Antworten

10

Das Startskript setzt java.ext.dirs auf seine eigenen Verzeichnisse (anwendungsspezifisch), unterlässt jedoch das Erweiterungsverzeichnis "normal" ( $JAVA_HOME/jre/lib/ext/ ), in dem sich sunjce_provider.jar befindet. Dies erklärt Ihren ersten Punkt (das Kopieren der Jar-Datei in das Lib-Verzeichnis macht es wieder sichtbar). Dies wird leicht reproduziert.

Was den zweiten Punkt angeht, denke ich, dass dies an der Richtliniendatei liegt, die das Startskript mit der Option -Djava.security.policy setzt. Ob einige Anbieter verfügbar sind oder nicht, hängt von den Richtliniendateien ab. Die Standardrichtliniendatei macht den SunJCE-Provider verfügbar, aber da die Startskripts eine nicht standardmäßige benutzerdefinierte Richtliniendatei erfordern, ist alles möglich. Ich schlage vor, dass Sie sich die Policy-Datei ansehen.

Zum Beispiel ist auf meinem System (Ubuntu Linux, mit Sun JVM 1.6.0_20 wie von Ubuntu verpackt) die Standard-Richtliniendatei in /etc/java-6-sun/security/java.security und enthält (unter anderem) die folgenden Zeilen:

%Vor%

definiert, welche Anbieter standardmäßig verfügbar sein sollen. Aufgrund Ihrer Symptome glaube ich, dass die benutzerdefinierte Richtliniendatei SunJCE nur dann verfügbar gemacht hat, wenn sie explizit registriert wurde (was verständlich ist, da das Startskript auch den Zugriff auf die Jar-Datei mit SunJCE entfernt hat).

    
Thomas Pornin 18.05.2010, 11:01
quelle
0

Es wurde auf SHA1, MD5 und SHA256 verkürzt

    
ppostma1 19.12.2012 21:45
quelle
0

Versuchen Sie, die Java-Version zu ändern

Ich habe die Ausnahme NoSuchAlgorithmException: "Unable to obtain JCA MAC algorithm 'HmacSHA512'" in der folgenden Java-Version erhalten:

  

Java-Version "1.8.0_131"
  Java (TM) SE Laufzeitumgebung (Build 1.8.0_131-b11)
  Java HotSpot (TM) 64-Bit-Server-VM (Build 25.131-b11, gemischter Modus)

Nach dem Ändern der JDK-Version wurde das folgende Problem behoben:

  

Java-Version "1.8.0_45"
  Java (TM) SE Laufzeitumgebung (Build 1.8.0_45-b15)
  Java HotSpot (TM) 64-Bit Server-VM (Build 25.45-b02, gemischter Modus)

Das erforderliche JAR für dieses Problem ist sunjce_provider.jar , möglicherweise ist es beschädigt.

    
Vishrant 26.07.2017 02:00
quelle
0

Die korrekte verkürzte Form ist wie folgt

%Vor%     
Alex George 09.01.2018 11:44
quelle

Tags und Links