2013-04-26 8 views
6

Ich versuche, eine Instanz von org.apache.ws.security.components.crypto.Merlin mit org.apache.ws.security.components.crypto.CryptoFactory speziell die CryptoFactory.getInstance(properties) Methode zu bekommen.Fehler bei der Instanziierung eines JavaKeyStore aus Datei

Dies wird

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

consistantly werfen die evantually von

java.security.UnrecoverableKeyException: Password verification failed

Das Passwort auf der Schlüsselspeicherdatei mit dem keytool auf der Kommandozeile überprüft wurde und korrekt verursacht wird, .

wird die Schlüsselspeicher über das folgende Verfahren erzeugt:

CMD Window detailing keytool -genkey -keystore testkeystore.jks

, die in dem Root-Verzeichnis der Eklipse porject ist.

Der Test applciation ist wie folgt:

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 "); 

    } 
} 

und die folgende Ausnahme erzeugt wird:

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 

Das Passwort wie im cmd Fenster angezeigt wird auf „Passwort“, sondern auch von allen Konten, die die Anwendung ablehnt, kann ich das Passwort unter Verwendung keytool -storepasswd ohne Probleme ändern, So weiß ich, dass das Passwort, das ich zur Verfügung stelle, korrekt ist; kann jemand vorschlagen, was hier schief gehen könnte? Ich habe versucht, dies jetzt für einen ganzen Tag erfolglos zu debuggen.

Wenn es weitere Informationen gibt, die ich Ihnen zur Verfügung stellen kann, lassen Sie es mich bitte wissen.

bearbeiten -

die folloing Maven Abhängigkeit ist erforderlich, um diese Prüfung zu bauen:

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

Wiederholen Sie einfach Ihre Schritte mit Oracle JDK 1.6 und es funktioniert ohne Fehler. Vielleicht ist Ihr Passwort falsch oder Sie versuchen, einen anderen Schlüsselspeicher zu öffnen? Versuchen Sie, es neu zu erstellen, und legen Sie absoluten Pfad zu Keystore fest. – user1516873

+0

Hallo Benutzer, nach dem Lesen Ihrer Kommentare habe ich es gegen eine andere Version des JDK/JRE gebaut und es funktionierte, nach dem Download der Quellen für rt.java und Durchlaufen fand ich, dass die CryptoBase-Klasse zwei JavaKeyStores instanziiert, die erste (meine .jks-Datei), die instanziiert wurde, aber die zweite war der 'cacerts'-Schlüsselspeicher in' jre \ lib \ security> ', der nicht das Standardpasswort von' changeit' hatte, das den Fehler verursachte; Ich habe jetzt das Passwort auf dem JRE Keystore geändert und ich arbeite gut in meinem ursprünglichen jre/jdk. Also vielen Dank für die Bestätigung, dass dies eine Konfiguration war .. – Waltzy

+0

... Problem und kein Coding-Problem für mich. Ich bin jedoch verabscheut, weil mein Kopfgeld verschwendet wird. Wenn Sie also etwas mit einem ähnlichen Effekt schreiben wollen, kann ich es Ihnen verleihen. – Waltzy

Antwort

2

Nach dem Lesen der Kommentare von User habe ich es gegen eine andere Version des JDK/JRE gebaut und es funktionierte, nach dem Herunterladen der Quellen für rt.java und Durchlaufen fand ich, dass die CryptoBase-Klasse zwei JavaKeyStores Instanziierung der erste (das ist meine .jks-Datei), die instanziiert, aber die zweite war die cacerts Keystore in jre\lib\security>, die nicht das Standardkennwort changeit hatte, die den Fehler verursachte;

Ich habe jetzt das Passwort auf dem JRE Keystore geändert und ich arbeite gut in meinem ursprünglichen JRE/JDK.

1

denke ich, Ihr Problem mit Bibliotheken ist verwandt, weil stacktrace sagt

org.apache.ws‘ .security.components.crypto.Merlin kann keine Instanz erstellen '

Es bedeutet, dass Sie keine (oder eine falsche Version) WSS4J-Bibliothek haben.

+0

Hallo Curro, ich habe es geschafft, dieses Problem zu beheben (detailliert Ich bin meine Antwort unten), aber ich werde Ihnen das Kopfgeld am Ende der nächsten 4 Tage vergeben, so dass die Wiederholung nicht verloren ist. – Waltzy