簡単な背景: Webstart アプリケーションをリリースします。これには、独自のアプリケーション jar と多数のサードパーティ jar が含まれます。Webstart では、jnlp ファイルによって参照されるすべての分散 jar が単一の証明書によって署名されている必要があります。したがって、自己署名証明書を使用して、すべての jar (当社の jar とサードパーティの jar) に署名します。一部のサードパーティの jar は、それらを作成したパーティによって既に署名されていますが、再度署名するだけで問題なく動作します。今まで。
問題: 最近 Java 6 から Java 7 に移行したところ、突然 webstart がいくつかの jar のロードを拒否し、「無効な SHA1 署名ファイル ダイジェスト」と不平を言っています。これは一部の jar でのみ発生し、他の jar では発生せず、複数の署名を持つように見える失敗した jar 間で共通のスレッドが表示されます。
SO とインターネットを検索した後、Java の jarsigner のデフォルトの署名アルゴリズムが Java 6 と Java 7 の間で SHA1 から SHA256 に変更されたようで、さまざまな人々が「jarsigner -digestalg SHA1」を使用して検証の問題を回避することを推奨しています。 . 私はそれを試しましたが、確かに、多重署名された jar が検証されるようになりました。したがって、これは私たちの問題の回避策のようです。
私が収集した情報によると、サードパーティの署名は SHA1 署名であり、デフォルトの SHA256 で署名していたため、署名が混在しているようです。「-digestalg」スイッチを使用して SHA1 を強制すると、同じタイプの署名が 2 つになり、検証が機能するようになりました。では、アルゴリズムが異なる複数の署名が原因で問題が発生しているようですか? それとも、私が見逃している他の要因がありますか。
質問:
- SHA1 + SHA256 では検証に失敗するのに、SHA1 + SHA1 では検証されるのはなぜですか? 技術的な理由はありますか?セキュリティ ポリシー上の理由ですか。両方の署名が正しいことを確認できないのはなぜですか?
- 現在のデフォルトの SHA256 の代わりに SHA1 を使用する (引き続き使用する) ことに欠点はありますか?