63

開発中の MacBook Pro では問題なく動作するテストがありますが、継続的インテグレーションの TeamCity サーバーでは実行できません。

エラーは次のとおりです。

java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

開発ボックスと TeamCity はどちらも Java 1.6 を使用し、特別な AES 暗号化が必要な場合は BouncyCastle ライブラリを使用します。

コードは次のとおりです。

private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
    return cipher.doFinal(info.getBytes("UTF-8"));
}

アップデート

選択した回答によると、TeamCity インストールで何かを変更する必要があり、一部のユーザーのインストールに影響を与える可能性があるため、別の暗号化ライブラリに切り替えて制限なしで行う必要があるのは良い選択ではありません。したがって、おそらく弾む城が役立ちます。

更新 2

この制限を回避するために、実際に BouncyCastle を使用するように切り替えました。これは、BC プロバイダーではなく、独自の BC クラスを直接使用する場合にのみ機能することに注意してください。

4

5 に答える 5

134

このエラーは、Java 仮想マシンが、米国の輸出法により制限された暗号化キー サイズのみを許可するポリシーを使用していることを意味します。

Java 9 以降

Unlimited Strength Jurisdiction Policy Files は Java 9 に含まれており、デフォルトで使用されます ( Java 9 Migration Guide の Security Updates を参照してください)。

Java 9 でこのエラーが発生した場合は、ポリシー構成がより制限の厳しいポリシーに変更されたことを意味している可能性があります ( limited)。移行ガイドの手順を参照してください。

JCE 管轄ポリシー ファイルのデフォルトは無制限です

アプリケーションが以前に Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files を必要としていた場合、それらをダウンロードまたはインストールする必要はなくなりました。これらは JDK に含まれており、デフォルトでアクティブ化されています。

お住まいの国または用途でより制限的なポリシーが必要な場合でも、限定された Java 暗号化ポリシー ファイルを引き続き利用できます。

デフォルトで提供されるいずれのポリシー ファイルでも満たされない要件がある場合は、これらのポリシー ファイルをニーズに合わせてカスタマイズできます。

ファイル のcrypto.policySecurity プロパティ 、またはJava Platform, Standard Edition Security Developer's Guide のCryptographic Strength Configurationを参照してください。<java-home>/conf/security/java.security

Java 8 以前

Java 8 Update 161 以降

Java 8 Update 161 以降、Java 8 はデフォルトで無制限強度管轄ポリシーに設定されます。このエラーが表示された場合は、構成が に変更されたことを示している可能性がありますlimited。これを に戻すには、Java 8 Update 151 に関する次のセクション、または Java 9 に関する前のセクションの手順を参照してくださいunlimited

Java 8 Update 151 以降

Java 8 Update 151 以降、Unlimited Strength Jurisdiction Policy は Java 8 に含まれていますが、デフォルトでは使用されていません。有効にするには、 (JDK の場合) または(JRE の場合)java.securityでファイルを編集する必要があります。行のコメントを外します (または含めます)<java_home>/jre/lib/security<java_home>/lib/security

crypto.policy=unlimited

管理者として実行するエディターを使用してファイルを編集してください。

ポリシーの変更は、JVM の再起動後にのみ有効になります (これは、Tomcat のような長時間実行されるサーバー プロセスにとって特に重要です)。

下位互換性のために、次のセクションで説明されているポリシー ファイルのインストールも同様に機能します。

Java 8 Update 151 より前

Java 8 Update 144 以前の場合、Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files ( Oracleで入手可能) をインストールする必要があります。

これらのファイルをインストールするREADME.txtには (ダウンロードの から):

  1. 無制限の強度の JCE ポリシー ファイルをダウンロードします。

  2. ダウンロードしたファイルを解凍して展開します。

    これにより、jce というサブディレクトリが作成されます。このディレクトリには、次のファイルが含まれています。

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
  3. 無制限強度ポリシーの JAR ファイルをインストールします。

    後で元の「強力な」が制限されたポリシー バージョンに戻すことにした場合は、最初に元の JCE ポリシー ファイル (US_export_policy.jar および local_policy.jar) のコピーを作成します。次に、強力なポリシー ファイルを、前の手順で抽出した無制限の強度のバージョンに置き換えます。

    JCE 管轄ポリシー JAR ファイルの標準的な場所は次のとおりです。

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    

JDK については、jre/lib/security にあることに注意してください。

新しいポリシー ファイルは、JVM の再起動後にのみ有効になります (これは、Tomcat のような長時間実行されるサーバー プロセスにとって特に重要です)。

于 2010-10-05T13:52:36.580 に答える
1

ポリシーファイルをインストールすることに加えて、それCUSTOMLONGSECRETKEY...getBytes()が実際に32バイトの配列を生成することも確認してください。私はそれを使用CUSTOMLONGSECRETKEY.getBytes(some encoding)して最初の32バイトを取得します。さらに良いことに、秘密鍵全体を使用して、必要なサイズのAESの鍵を取得します。

于 2010-10-05T13:58:38.640 に答える
0

IDE が使用する JAVA_HOME へのパスを確認してください。正しいパスにコピーするため。

私の場合、IntelliJ を使用します: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

コンソールに $JAVA_HOME を表示する代わりに。/Users/myuser/.sdkman/candidates/java/current/jre/lib/security

于 2017-10-05T21:58:18.457 に答える