10

Java の次の行を見てください。

Mac.getInstance("HmacSHA1");

これを簡単なテスト プログラムに入れると、サーバー上で問題なく動作します。ただし、コンテナでこの行を使用すると、

java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
  at javax.crypto.Mac.getInstance(DashoA13*..)

どちらの場合も、同じ JDK インストールが使用されます。

少しグーグルで調べた後、次の2つのことを行うことで、なんとか機能させることができました。

  1. sunjce_provider.jarから$JAVA_HOME/jre/lib/extコンテナーの lib ディレクトリにコピーします。
  2. 次の行をコードに追加します。

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

具体的には、これはApache Jamesメールレットで発生しますが、これは JVM オプションに関係していると確信しています。これが使用する起動スクリプトです。

最終的には機能するようになりましたが、ソリューションはハッキングされすぎて正しいものではないように感じます。何が起こっているのかの説明と、より「適切な」解決策をいただければ幸いです。

関連する質問: Java 暗号を使用すると NoSuchAlgorithmException が発生します。ただし、この場合、HmacSHA1 アルゴリズムはすぐにサポートされるべきであると確信しています。証拠として、これはテスト プログラムで問題なく動作します。

4

5 に答える 5

11

起動スクリプトは、java.ext.dirsを独自のディレクトリ セット (アプリケーションに固有) に設定しますが、常駐する「通常の」拡張ディレクトリ ( $JAVA_HOME/jre/lib/ext/) は省略しsunjce_provider.jarます。これは最初のポイントを説明しています (Jar ファイルを lib ディレクトリにコピーすると、再び表示されます)。これは簡単に再現できます。

2点目ですが、これは起動スクリプトがオプションで設定するポリシーファイルによるものだと思い-Djava.security.policyます。一部のプロバイダーが使用可能かどうかは、ポリシー ファイルによって異なります。デフォルトのポリシー ファイルは SunJCE プロバイダを利用可能にしますが、スタートアップ スクリプトはデフォルト以外のカスタム ポリシー ファイルを要求するため、何でもかまいません。そのポリシー ファイルを確認することをお勧めします。

たとえば、私のシステム (Ubuntu Linux、Ubuntu によってパッケージ化された Sun JVM 1.6.0_20 を使用) では、デフォルトのポリシー ファイルが/etc/java-6-sun/security/java.security含まれており、(特に) 次の行が含まれています。

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC

これは、デフォルトで利用できるプロバイダーを定義します。あなたの症状から、明示的に登録されていない限り、カスタム ポリシー ファイルが SunJCE を使用できないようにしたと思います (これは、起動スクリプトが SunJCE を含む Jar ファイルへのアクセスも削除したため、理解できます...)。

于 2010-05-18T11:01:08.397 に答える
0

SHA1、MD5、およびSHA256に短縮されました

于 2012-12-19T21:45:20.647 に答える