2013-04-26 92 views
6

我试图使用org.apache.ws.security.components.crypto.CryptoFactory特别是CryptoFactory.getInstance(properties)方法获得org.apache.ws.security.components.crypto.Merlin的实例。从文件实例化JavaKeyStore时遇到麻烦

这将consistantly抛出

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

其evantually由

java.security.UnrecoverableKeyException: Password verification failed

上的密钥库文件中的口令引起的已检查用keytool在命令行上是正确的。

密钥库通过以下方法生成:

CMD Window detailing keytool -genkey -keystore testkeystore.jks

这是在蚀,项目的根目录。

测试applciation如下:

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窗口指示被设置为“口令”的口令,但所有帐户应用程序拒绝它,我可以更改密码使用keytool -storepasswd没有问题,所以我知道我提供的密码是正确的;任何人都可以提出这里可能会出错吗?我一直在努力调试这一整天失败的一整天。

如果有任何额外的信息,我可以提供,请让我知道。

编辑 -

的folloing Maven的依赖关系,需要建立这个测试:

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

只需使用Oracle JDK 1.6重复您的步骤,并且无任何错误地工作。也许你的密码不正确,或者你试图打开不同的密钥库?尝试重新创建它并设置密钥库的绝对路径。 – user1516873 2013-04-29 12:55:24

+0

嗨用户,在阅读您的评论后,我建立它针对不同版本的JDK/JRE,它的工作原理是,在下载rt.java的源代码并逐步通过后,我发现CryptoBase类实例化了两个JavaKeyStores,第一个我的.jks文件)实例化,但第二个是'jre \ lib \ security>'中的'cacerts' keystore,它没有导致失败的'changeit'的默认密码;我现在已经改变了jre keystore上的密码,并且在我原来的jre/jdk中工作得很好。所以谢谢你确认这是一个配置.. – Waltzy 2013-04-29 14:14:06

+0

...问题,而不是我的编码问题。不过,我讨厌我的代表浪费,所以如果你想写一些类似的效果我可以授予你。 – Waltzy 2013-04-29 14:14:44

回答

2

在阅读用户的评论之后,我针对不同版本的JDK/JRE构建了它,它在下载rt.java源代码并逐步完成后发挥作用,发现CryptoBase类实例化了两个JavaKeyStore,第一个(作为我的.jks文件),但是第二个是jre\lib\security>中的cacerts密钥存储库,它没有导致失败的默认密码changeit;

我现在已经改变了密钥仓库的密码,我在我原来的jre/jdk中工作得很好。

1

我觉得你的问题是与图书馆相关的,因为堆栈跟踪说

“org.apache.ws .security.components.crypto.Merlin无法创建实例'

这意味着您没有(o版本不正确)的WSS4J库。

+0

嗨Curro,我已经设法解决这个问题(详细我是我的回答下面),但我会奖励你在未来4天结束的赏金,所以代表不会丢失。 – Waltzy 2013-05-02 09:12:58