我试图使用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在命令行上是正确的。
密钥库通过以下方法生成:
这是在蚀,项目的根目录。
测试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>
只需使用Oracle JDK 1.6重复您的步骤,并且无任何错误地工作。也许你的密码不正确,或者你试图打开不同的密钥库?尝试重新创建它并设置密钥库的绝对路径。 – user1516873 2013-04-29 12:55:24
嗨用户,在阅读您的评论后,我建立它针对不同版本的JDK/JRE,它的工作原理是,在下载rt.java的源代码并逐步通过后,我发现CryptoBase类实例化了两个JavaKeyStores,第一个我的.jks文件)实例化,但第二个是'jre \ lib \ security>'中的'cacerts' keystore,它没有导致失败的'changeit'的默认密码;我现在已经改变了jre keystore上的密码,并且在我原来的jre/jdk中工作得很好。所以谢谢你确认这是一个配置.. – Waltzy 2013-04-29 14:14:06
...问题,而不是我的编码问题。不过,我讨厌我的代表浪费,所以如果你想写一些类似的效果我可以授予你。 – Waltzy 2013-04-29 14:14:44