NoSuchAlgorithmException: HmacSHA1-Algorithmus nicht verfügbar ist
Blick auf die folgende Zeile java:
Mac.getInstance("HmacSHA1");
Wenn ich dies in einem einfachen Programm testen, es läuft ohne Probleme auf meinem server. Allerdings, wenn ich diese Zeile in einem container, bekomme ich
java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
at javax.crypto.Mac.getInstance(DashoA13*..)
Den gleichen JDK-installation verwendet wird, in beiden Fällen.
Nach googeln Sie ein bisschen herum, ich habe es geschafft, es zu bekommen, um durch zwei Dinge:
- Kopieren
sunjce_provider.jar
aus$JAVA_HOME/jre/lib/ext
in das lib Verzeichnis des Containers. -
Fügen Sie folgende Zeile in meinem code:
java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
Speziell, das passiert mir in einer Apache James mailet, aber ich bin mir ziemlich sicher, dass dies hat zu tun mit der JVM-Optionen. Hier ist das Start-script , die es verwendet.
Obwohl ich es geschafft habe in das Ende, die Lösung fühlt sich zu gehackt zu werden, der richtige. Ich würde mich über eine Erklärung, was Los ist, sowie eine "richtige" Lösung.
Stellt sich die Frage,: Mit Hilfe der Java crypto führt zu NoSuchAlgorithmException. Aber in diesem Fall bin ich ziemlich sicher, dass die HmacSHA1-Algorithmus sollte out of the box unterstützt. Als Beweis, das funktioniert ohne Probleme in einem test-Programm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Start-Skript legt die
java.ext.dirs
auf Ihre eigenen Verzeichnisse (in der spezifischen Anwendung), aber das weglassen der "normale" extension directory ($JAVA_HOME/jre/lib/ext/
), die ist, wosunjce_provider.jar
befindet. Dies erklärt Ihren ersten Punkt (kopieren Sie die Jar-Datei in das lib-Verzeichnis macht es wieder sichtbar). Dies ist leicht reproduzierbar.Als für den zweiten Punkt, ich denke, dies ist aufgrund der policy-Datei, dass das Start-Skript legt mit der
-Djava.security.policy
option. Ob einige Anbieter verfügbar sind oder nicht, hängt von policy-Dateien. Die standardmäßige policy-Datei macht das SunJCE-provider zur Verfügung, aber seit die startup-Skripts beauftragt einen nicht-standardmäßigen, benutzerdefinierten policy-Datei, dann geht alles. Ich schlage vor, Sie nehmen einen Blick an, dass policy-Datei.Zum Beispiel, auf meinem system (Ubuntu Linux mit Sun JVM 1.6.0_20 wie verpackt von Ubuntu), die standardmäßige policy-Datei ist in
/etc/java-6-sun/security/java.security
und enthält (unter anderem) die folgenden Zeilen:denen definiert wird, was sollten die Anbieter werden standardmäßig verfügbar. Von Ihrer Symptome, ich denke, dass die benutzerdefinierte Richtliniendatei gemacht SunJCE nicht verfügbar, es sei denn, explizit registriert (was verständlich ist, da das Start-script auch entfernt den Zugriff auf die Jar-Datei mit SunJCE...).
Es wurde gekürzt auf SHA1, MD5-und SHA256 -
Versuchen, ändern Sie die Java-version
Ich war immer Ausnahme
NoSuchAlgorithmException: "Unable to obtain JCA MAC algorithm 'HmacSHA512'"
auf folgende Java-version:Nach dem ändern der JDK-version auf folgenden wurde die Frage geklärt:
Die erforderlichen jar für dieses Problem ist
sunjce_provider.jar
es ist möglich, dass es möglicherweise beschädigt ist.Die richtige Kurzform ist wie folgt