Sto cercando di ottenere un'istanza di org.apache.ws.security.components.crypto.Merlin
utilizzando org.apache.ws.security.components.crypto.CryptoFactory
in particolare il metodo CryptoFactory.getInstance(properties)
.Problemi di istanziazione di un JavaKeyStore dal file
Ciò positiv gettare
java.lang.RuntimeException: org.apache.ws.security.components.crypto.Merlin cannot create instance
che evantually è causato da
java.security.UnrecoverableKeyException: Password verification failed
La password del file di archivio chiavi è stato controllato con il keytool sulla riga di comando ed è corretto .
l'archivio di chiavi viene generato tramite il seguente processo:
che si trova nella directory principale del porject eclisse.
L'applciation prova è la seguente:
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 ");
}
}
e la seguente eccezione viene generata:
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
La password come indicato nella finestra cmd è impostato su "password", ma da tutti account l'applicazione sta rifiutando, posso cambiare la password utilizzando keytool -storepasswd
senza problemi, quindi so che la password che sto fornendo è corretta; qualcuno può suggerire cosa potrebbe andare storto qui? Ho cercato di eseguire il debug di questo infruttuoso per un giorno intero ora.
Se ci sono ulteriori informazioni che posso fornire, fatemelo sapere.
modifica -
l'esperto di dipendenze folloing è necessario per costruire questo test:
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.5.8</version>
<scope>provided</scope>
</dependency>
Basta ripetere i passaggi con Oracle JDK 1.6 e funziona senza errori. Forse la tua password non è corretta o stai tentando di aprire un altro keystore? Prova a ricrearlo e imposta il percorso assoluto al keystore. – user1516873
Ciao utente, dopo aver letto i tuoi commenti l'ho costruito su una versione diversa del JDK/JRE e ha funzionato, dopo aver scaricato i sorgenti per rt.java e passato il passaggio ho scoperto che la classe CryptoBase stava istanziando due JavaKeyStores, il primo (essendo il mio file .jks) che ha istanziato bene, ma il secondo era il keystore 'cacerts' in' jre \ lib \ security> 'che non aveva la password di default di' changeit' che stava causando il problema; Ora ho cambiato la password sul keystore jre e sto lavorando bene nel mio jre/jdk originale. Quindi grazie per aver confermato che questa era una configurazione ... – Waltzy
... problema e non un problema di codifica per me. Tuttavia, sono disgustato dal fatto che la mia reputazione sia andata sprecata, quindi se vuoi scrivere qualcosa con un effetto simile, posso dartelo. – Waltzy