このチュートリアルをオラクルから使用しているファイルのデジタル署名を作成しようとしています。
ローカル マシンではすべて問題なく動作しますが、マウスやキーボードなどを使用せずに Web サーバーで実行しようとすると、1 つのファイルにのみ署名することができ、試行ごとに次の例外が発生します。
java.security.ProviderException: nextBytes() failed
これは、sign 関数を実行したときに正確に発生します。
byte[] realSig = dsa.sign();
私がこれまでに学んだことから、これは、ランダムなシーケンスを生成するために必要なエントロピー プールを空にすることが原因である可能性があります。入力デバイスのないサーバーでは、十分な速度で入力されていません。これが実際に当てはまる場合、1 つの解決策はランダム シードのソースを dev/random から dev/urandom に変更することかもしれませんが、セキュリティ上の理由から良くないと言われています。
質問は次のとおりです。これは本当に私の問題の原因ですか? もしそうなら、Java に dev/urandom の使用を強制する方法は何ですか? または、これを処理するより良い方法はありますか?
編集:誰かがここで言及したが、応答する前に彼の回答を削除したため、次のコードを追加すると問題が解決しました:
if (System.getProperty("java.security.egd") == null) {
System.setProperty("java.security.egd", "file:///dev/urandom");
}
これは最善の解決策ではないかもしれませんが、ファイルに署名して検証するには十分です。