7

メソッドを具体的にorg.apache.ws.security.components.crypto.Merlin使用するインスタンスを取得しようとしています。org.apache.ws.security.components.crypto.CryptoFactoryCryptoFactory.getInstance(properties)

これは一貫してスローします

java.lang.RuntimeException: org.apache.ws.security.components.crypto.Merlin cannot create instance

これは最終的にによって引き起こされます

java.security.UnrecoverableKeyException: Password verification failed

キーストア ファイルのパスワードは、コマンド ラインの keytool でチェックされ、正しいものです。

キーストアは、次のプロセスで生成されます。

CMD ウィンドウの詳細 keytool -genkey -keystore testkeystore.jks

これは、Eclipse プロジェクトのルート ディレクトリにあります。

テストアプリケーションは次のとおりです。

public class App {
    public static void main(String[] args) throws CredentialException,
            IOException {
        System.out.println("Starting");
        Properties p = new Properties();
        p.setProperty("org.apache.ws.security.crypto.merlin.keystore.password",
                "password");
        p.setProperty("org.apache.ws.security.crypto.provider",
                "org.apache.ws.security.components.crypto.Merlin");
        p.setProperty("org.apache.ws.security.crypto.merlin.keystore.type",
                "jks");
        p.setProperty("org.apache.ws.security.crypto.merlin.file", "./testkeystore.jks");

        Crypto crypto = CryptoFactory.getInstance(p);
        System.out.println(" Complete ");

    }
}

次の例外が生成されます。

Exception in thread "main" java.lang.RuntimeException: org.apache.ws.security.components.crypto.Merlin cannot create instance
    at org.apache.ws.security.components.crypto.CryptoFactory.loadClass(CryptoFactory.java:225)
    at org.apache.ws.security.components.crypto.CryptoFactory.loadClass(CryptoFactory.java:180)
    at org.apache.ws.security.components.crypto.CryptoFactory.getInstance(CryptoFactory.java:73)
    at com.restart.test.cryptotest2.App.main(App.java:22)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.apache.ws.security.components.crypto.CryptoFactory.loadClass(CryptoFactory.java:211)
    ... 3 more
Caused by: org.apache.ws.security.components.crypto.CredentialException: Failed to load credentials.
    at org.apache.ws.security.components.crypto.AbstractCrypto.load(AbstractCrypto.java:174)
    at org.apache.ws.security.components.crypto.AbstractCrypto.<init>(AbstractCrypto.java:135)
    at org.apache.ws.security.components.crypto.Merlin.<init>(Merlin.java:71)
    ... 8 more
Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
    at java.security.KeyStore.load(KeyStore.java:1214)
    at org.apache.ws.security.components.crypto.AbstractCrypto.load(AbstractCrypto.java:168)
    ... 10 more
Caused by: java.security.UnrecoverableKeyException: Password verification failed
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)
    ... 13 more

cmdウィンドウに示されているパスワードは "password" に設定されていますが、すべてのアカウントでアプリケーションが拒否してkeytool -storepasswdいます。問題なく使用してパスワードを変更できます。提供しているパスワードが正しいことはわかっています。誰かがここで何がうまくいかないのかを提案できますか? 私はこれを丸一日デバッグしようとしましたが、うまくいきませんでした。

私が提供できる追加情報があれば、私に知らせてください。

編集 -

このテストをビルドするには、次の Maven 依存関係が必要です。

   <dependency> 
      <groupId>org.apache.ws.security</groupId> 
      <artifactId>wss4j</artifactId> 
      <version>1.5.8</version> 
      <scope>provided</scope>
    </dependency>
4

2 に答える 2

2

スタックトレースが言うので、あなたの問題はライブラリに関連していると思います

「org.apache.ws.security.components.crypto.Merlin はインスタンスを作成できません」

これは、WSS4J ライブラリを持っていない (バージョンが正しくない) ことを意味します。

于 2013-05-02T08:46:22.247 に答える