「You have limited key lengths available.」というエラーの対処方法

Oracle javaでBurpを起動してHTTPSのサイトを閲覧しようとすると、Alertタブに以下のメッセージが表示されて通信に失敗することがあります。

You have limited key lengths available. To use stronger keys, please download and install the JCE unlimited strength jurisdiction policy files, from Oracle.

Java暗号化アーキテクチャOracleプロバイダのドキュメントに記載されていますが、デフォルトの状態では暗号化の強度に制限がかかっており、それにより上記のエラーが発生します。

一部の国では輸入規制があるため、Oracleの実装では、暗号化アルゴリズムの強度を制限するデフォルトの暗号化管轄ポリシー・ファイルが提供されます。 (中略) より強力なアルゴリズム(たとえば、256ビットの鍵を使用するAES)が必要な場合は、強度が無制限のJCE管轄ポリシー・ファイルを入手して、JDK/JREにインストールする必要があります。

簡単な実験をして暗号化アルゴリズムによって違いが出ることを確認してみます。

実験

簡単なWebサーバを立ち上げて実験を行います。この実験は外部と通信できない状態の仮想環境上で行うことを推奨します。

ディレクトリを作り、適当な内容のindex.htmlをファイルとして用意した上で、そのディレクトリで以下のコマンドを発行します。

$ python3 -m http.server

これで8000ポートで待ち受ける簡単なHTTPサーバができました。ブラウザで http://localhot:8000 にアクセスすることでindex.htmlの内容が表示されます。

次にsocatでHTTPS通信を実現します。まずは実験用のサーバ証明書を作成します。

$ openssl genrsa -out server.key 1024
$ openssl req -new -key server.key -x509 -days 1095 -out server.crt
$ cat server.key server.crt > server.pem

実験用なので2つ目のコマンドの実行時の情報入力はデフォルトで問題ないです。
また、作成した証明書は所謂オレオレ証明書なので自分だけがアクセス可能な環境でのみ使用してください。

作成した証明書を用いてsocatを起動し、HTTPサーバをHTTPSでアクセスできるようにします。

$ socat openssl-listen:8443,reuseaddr,fork,verify=0,cert=server.pem,cipher=DHE-RSA-AES128-SHA256 tcp4:localhost:8000

これで https://localhost:8443 にアクセス可能になります。「cipher」で使用する暗号化アルゴリズムを指定しています。「DHE-RSA-AES128-SHA256」を指定した場合はBurpを通してもタイトルのエラーは発生しません。

上記socatを終了させ、「DHE-RSA-AES128-SHA256」を「DHE-RSA-AES256-SHA256」に変更します。

$ socat openssl-listen:8443,reuseaddr,fork,verify=0,cert=server.pem,cipher=DHE-RSA-AES256-SHA256 tcp4:localhost:8000

この状態で再度Burpを通してアクセスすると接続に失敗し、Alertタブにタイトルのエラーメッセージが表示されます。
これにより256ビットの鍵を使用するAESがデフォルトの状態では対応できていないことがわかります。

エラーの対処方法

エラーが発生する理由は暗号化のアルゴリズムの強度に制限があるためです。この制限を回避するにはpolicyファイルを上書きする必要があります。Oracle Java 8用のファイルはJCE Unlimited Strength Jurisdiction Policy Files for JDK/JRE 8 Downloadからダウンロードすることが可能です。
ダウンロードして展開したjarファイルを置き換えBurpを再起動することで、「DHE-RSA-AES256-SHA256」の場合でもアクセスできるようになることが確認できます。

© 2016 - 2024 DARK MATTER / Built with Hugo / テーマ StackJimmy によって設計されています。