Java SecurityException:署名者情報が一致しません


121

いつものようにクラスを再コンパイルすると、突然次のエラーメッセージが表示されました。どうして?どうすれば修正できますか?

java.lang.SecurityException: class "Chinese_English_Dictionary"'s signer information does not match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(ClassLoader.java:776)

回答:


136

これは、同じパッケージに属するクラスが異なるJARファイルからロードされ、それらのJARファイルに異なる証明書で署名されている場合、またはおそらく、少なくとも1つは署名され、他の1つ以上は署名されていない場合(ロードされたクラスを含む)これらのAFAIKは署名できないため、ディレクトリから)。

したがって、すべてのJAR(または少なくとも同じパッケージのクラスを含むJAR)が同じ証明書を使用して署名されていることを確認するか、パッケージが重複しているJARファイルのマニフェストから署名を削除してください。


同じ証明書を使用しましたが、有効期限が切れています。どうすれば更新できますか?
フランク

34
誰かが初心者にそれを行う方法を説明できますか?1週間前にJavaと春の仕事を始めましたが、迷っています。
mghz 2014年

私も同様の問題に直面していますが、休止状態のjarファイルにあります。これらのjarファイルは署名されていませんが、まだこの問題に直面しています。どうして?stackoverflow.com/questions/24386463/…を
user613114

同じ証明書で複数のjarに署名する特定のプロセスはありますか?同じ証明書でjarに1つずつ署名しようとしましたが、それでも次の例外が発生しました。署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しません
vegeta

@vegeta:申し訳ありませんが、私は実際には署名手続きの経験がありません。
Michael Borgwardt、

45

それを回避する簡単な方法は、インポートされたjarファイルの順序を(Eclipse)から変更できるようにすることです。パッケージを右クリック->ビルドパス->ビルドパスの構成->参照とライブラリ->注文とエクスポート。署名ファイルを含むjarの順序を変更してみてください。


テストする署名付きのjarファイル、同じパッケージ、junit、jre、その他のjarのテストクラスファイルがあります。日食の正しい順序はどれですか?まだすべての組み合わせを試したかどうかはわかりません。しかし、クラスローダーSecurityExceptionを超えていませんでした
datafiddler 2017

このソリューションのおかげで、junit5とhamcrest-all.jarの順序を変更しただけで、テストが再び機能します:)
Wallnussfolie

41

A. mavenを使用する場合、衝突するjarをデバッグする便利な方法は次のとおりです。

mvn dependency:tree

たとえば、例外の場合:

java.lang.SecurityException: class "javax.servlet.HttpConstraintElement"'s signer information does not match signer information of other classes in the same package

私たちはします:

mvn dependency:tree|grep servlet

その出力:

[INFO] +- javax.servlet:servlet-api:jar:2.5:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet.jsp:jar:2.2.0.v201112011158:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:jar:1.2.0.v201105211821:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.0.0.RC2:compile

は、servlet-api 2.5とjavax.servlet 3.0.0.xの衝突を示しています。

B.その他の有用なヒント(セキュリティ例外をデバッグする方法とmaven depを除外する方法)は、署名者情報が一致しない場合の質問です。


私はSTSをIDEとして使用しています。コンソールをmavenコンソールに切り替え、そこで上記のコマンドを実行しようとしましたが、何も起こりませんでした。それとも私は間違っていますか?
nanosoft 2015

1
nanosoft、あなたの質問はSTS関連であると思われるため、新しいトップレベルの質問を作成できます。mvnは確かにコマンドライン引数を受け入れます。
Eugene Gr。Philippov

@ EugeneGr.Philippovこれはどのように関連していますか?dependency:treeが示すのは、署名者とは関係のないjarのバージョンです
Gavriel

@Gavriel私はあまり掘り出しませんでしたが、あなたが衝突を取り除くとき、例外は起こりません。
Eugene Gr。フィリポフ

それはある場合には当てはまるかもしれませんが、すべてではありません。たとえば、com.microsoft.azureグループのさまざまなアーティファクトは複数のソースからコンパイルされているように見えるため、一部のアーティファクトには同じバージョンがありません。また、ほとんどの場合、複数のバージョンが存在してもエラーは発生しません(エンフォーサープラグインが警告または失敗した場合でも)
Gavriel

23

私の場合、ライブラリパス:SにBouncyCastleのJARバージョンが重複していた


2
同じことが私にも起こりました。すべてのBC jarを削除し、適切なバージョンをロードすることで解決しました。
Broken_Window 2015

1
@Cedric-同じBouncyCastleが私に
当てはまり

私の場合は、内部のspring-cloudにjdk15onが必要であり、プロジェクトにbcprov-jdk16を使用していたためです。
Glats

8

私は同様の例外がありました:

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

根本的な問題は、Hamcrestライブラリを2回インクルードしたことです。Maven pomファイルを使用した後。また、JUnit 4ライブラリ(これにもHamcrestライブラリが含まれています)をプロジェクトのビルドパスに追加しました。ビルドパスからJUnitを削除するだけで、すべて問題なく動作しました。


6

これは、CGLIBがアプリケーションターゲットクラスの署名者情報の代わりに独自の署名者情報を使用するため、cglibがインストルメント化されたプロキシで発生する可能性があります。


4
これが事実である場合、私たちは何ができますか?
Leandro、2014年

@Jarek:ここでの解決策は何でしょうか?このソリューションを使用できますか?developer.jboss.org/thread/241718
gaurav

@gaurav署名されたjarの使用を停止しました。これらはJava Web Startにのみ必要であり、長い間見捨てられてきました。
JarekPrzygódzki'19年

4
  1. 署名後、アクセス:dist \ lib
  2. 余分な.jarを見つける
  3. Winrarを使用して、フォルダーを抽出(「フォルダー名」に抽出)オプション
  4. アクセス:META-INF / MANIFEST.MF
  5. そのような各署名を削除します。

名前:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =

  1. ファイルを保存します
  2. もう一度ジップ
  3. .jarに戻るRenaime ext
  4. 既に

私はあなたのアドバイス、次のいくつかの問題を抱えている:stackoverflow.com/questions/33988136/...
リング

2

Eclipseで実行している場合は、ビルドパスに追加されたプロジェクトのjarファイルを確認してください。または、control-shift-Tを実行して、同じ名前空間に一致する複数のjarをスキャンします。次に、プロジェクトのビルドパスから冗長または古いjarを削除します。


2

私はEclipseとJUnit 5でこの問題を抱えています。私の解決策は、user2066936による以前の回答に触発されました。それは、インポートライブラリの順序を再構成することです。

  1. プロジェクトを右クリックします。
  2. [Javaビルドパス]を開きます。
  3. [注文とエクスポート]をクリックします。
  4. 次に、JUNITを優先順位を上げます。

1

私の場合、パッケージ名の競合でした。現在のプロジェクトと署名された参照ライブラリには、共通のパッケージが1つありましたpackage.foo.utils。現在のプロジェクトでエラーが発生しやすいパッケージ名を別の名前に変更しただけです。


1

少し古いスレッドですが、私はこれにかなりの時間立ち往生していたので、ここに修正があります(それが誰かを助けることを願っています)

私のシナリオ:

パッケージ名は、com.abc.defです。このパッケージのクラスを含む2つのjarファイルがjar1とjar2です。つまり、いくつかのクラスはjar1にあり、他のクラスはjar2にあります。これらのjarファイルは、同じキーストアを使用して署名されていますが、ビルドの異なる時点で(つまり個別に)署名されています。その結果、jar1とjar2のファイルの署名が異なるようです。

すべてのファイルをjar1に入れ、それらをすべて一緒にビルド(および署名)しました。問題はなくなります。

PS:パッケージ名とjarファイル名は単なる例です


1

bouncycastle.orgからすべてのjarを追加した場合(私の場合は、crypto-159.zipから)、該当しないJDKのjarを削除してください。冗長性があります。おそらく「jdk15on」jarだけが必要です。


これはまさに私の問題でした。私は、共有libsフォルダーに同じカスタム署名バージョンがすでにあるアプリケーションサーバーにBCアプリケーションを展開していました。解決策は、それらを削除して新しいバージョンを使用することでした。
GChiappe

1

この質問は長い間続きましたが、私は何かを売り込みたいです。私はSpringプロジェクトの課題に取り組んでおり、Eclipse IDEでそれを発見しました。Spring Boot Rest APIにMavenまたはGradleを使用している場合は、ビルドパスからJunit 4または5を削除し、pom.xmlまたはGradleビルドファイルにJunitを含める必要があります。yml設定ファイルにも当てはまると思います。


0

これは、名前が異なる1つのファイルまたは異なる場所からのファイルを2回インクルードした場合、特に同じファイルの2つの異なるバージョンである場合にも発生します。


すみませんが、わかりません。どのようなファイルですか?私の場合、エラーはorg.jboss.security.xacml.jaxb.PoliciesTypeクラスにあり、JBoss EAP 5.2に付属しているjar(/EnterprisePlatform-5.2.0/jboss-eap-5.2/ jboss-as / common / lib / jbossxacml.jar)
Leandro

0

直せた。

根本原因:これは、署名付きjarでSun JAXB実装を使用する場合の一般的な問題です。基本的に、JAXB実装は、リフレクションを使用せずにプロパティに直接アクセスするクラスを生成することにより、リフレクションを回避しようとしています。残念ながら、この新しいクラスは、アクセスされているクラスと同じパッケージに生成されます。これは、このエラーの原因です。

解決策:次のシステムプロパティを追加して、署名されたjarと互換性のないJAXB最適化を無効にします。-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true

参照:https : //access.redhat.com/site/solutions/42149


0

@Mohit Phougat応答に基づいて、@ Grabアノテーションを使用してGroovyを実行している場合は、そのようなアノテーションを並べ替えることができます。


0

これは、JUnit +安心+ hamcrestを使用しているときに発生しました。この場合、ビルドパスにjunitを追加しないでください。Mavenプロジェクトがある場合、これで解決しました。以下はpom.xmlです。

<dependencies>

    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>3.0.0</version>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>

    </dependency>


</dependencies>

0

私はJUNIT 5を実行していて、Hamcrest外部jarも参照していました。しかし、HamcrestはJUNIT 5ライブラリの一部でもあります。そのため、ビルドパスのJUNIT 5ライブラリの外部のHamecrest jarファイルの順序を変更する必要があります。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.