2013-04-26 18 views
6

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:

CMD Window detailing keytool -genkey -keystore testkeystore.jks

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> 
+2

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

+0

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

+0

... 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

risposta

2

Dopo aver letto i commenti dell'Utente, 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 creando un'istanza di 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 predefinita di changeit che stava causando l'errore;

Ora ho cambiato la password sul keystore jre e sto lavorando bene nel mio jre/jdk originale.

1

Credo che il problema è correlato con le librerie perché stacktrace dice

'org.apache.ws .security.components.crypto.Merlin non può creare l'istanza '

significa che non si dispone (o di una versione errata) della libreria WSS4J.

+0

Ciao Curro, sono riuscito a risolvere questo problema (dettagliato sono la mia risposta qui sotto) ma ti assegnerò la taglia alla fine dei prossimi 4 giorni, quindi il rappresentante non è perso. – Waltzy