2013-04-26 30 views
6

Tôi đang cố gắng để có được một ví dụ của org.apache.ws.security.components.crypto.Merlin sử dụng org.apache.ws.security.components.crypto.CryptoFactory cụ thể là phương pháp CryptoFactory.getInstance(properties).Sự cố khi khởi tạo JavaKeyStore từ tệp

này consistantly sẽ ném

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

mà evantually là do

java.security.UnrecoverableKeyException: Password verification failed

Các mật khẩu trên file keystore đã được kiểm tra với keytool trên dòng lệnh và là đúng .

keystore được tạo ra thông qua quá trình sau:

CMD Window detailing keytool -genkey -keystore testkeystore.jks

Đó là trong thư mục gốc của porject nhật thực.

Các Nhờ có chương trình kiểm tra như sau:

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

    } 
} 

và ngoại lệ sau đây được tạo ra:

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 

Mật khẩu như được chỉ ra trong cửa sổ cmd được thiết lập để "password", nhưng bằng tất cả tài khoản ứng dụng đang từ chối nó, tôi có thể thay đổi mật khẩu bằng cách sử dụng keytool -storepasswd mà không có vấn đề gì, Vì vậy, tôi biết mật khẩu mà tôi đang cung cấp là chính xác; bất cứ ai có thể gợi ý những gì có thể xảy ra ở đây không? Tôi đã cố gắng để gỡ lỗi này không thành công cho một ngày đầy đủ bây giờ.

Nếu có bất kỳ thông tin bổ sung nào tôi có thể cung cấp, vui lòng cho tôi biết.

chỉnh sửa -

các maven phụ thuộc folloing là cần thiết để xây dựng thử nghiệm này:

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

Chỉ cần lặp lại các bước của bạn với Oracle JDK 1.6 và nó hoạt động mà không có bất kỳ lỗi nào. Có thể mật khẩu của bạn không chính xác hoặc bạn đang cố mở kho khóa khác? Hãy thử tạo lại nó và thiết lập đường dẫn tuyệt đối đến kho khóa. – user1516873

+0

Xin chào người dùng, Sau khi đọc nhận xét của bạn, tôi đã xây dựng nó dựa trên một phiên bản JDK/JRE khác và nó đã hoạt động, sau khi tải xuống các nguồn cho rt.java và bước qua tôi thấy rằng lớp CryptoBase đã khởi tạo hai JavaKeyStores, tệp .jks của tôi) được tạo ra tốt, nhưng thứ hai là kho khóa 'cacerts' trong' jre \ lib \ security> 'không có mật khẩu mặc định của' changeit' đã gây ra lỗi không thành công; Bây giờ tôi đã thay đổi mật khẩu trên keystore jre và tôi đang làm việc tốt trong jre/jdk ban đầu của tôi. Cảm ơn bạn đã xác nhận rằng đây là cấu hình .. – Waltzy

+0

... vấn đề và không phải là vấn đề về mã hóa đối với tôi. Tuy nhiên, tôi rất lo lắng cho tiền thưởng đại diện của tôi để lãng phí, vì vậy nếu bạn muốn viết một cái gì đó cho một hiệu ứng tương tự, tôi có thể trao nó cho bạn. – Waltzy

Trả lời

2

Sau khi đọc nhận xét từ Người dùng tôi đã xây dựng nó dựa trên phiên bản JDK/JRE khác và nó hoạt động, sau khi tải xuống nguồn cho rt.java và bước qua, tôi thấy lớp CryptoBase đã khởi tạo hai JavaKeyStores, (là tệp .jks của tôi) được tạo ra tốt, nhưng thứ hai là kho khóa cacerts trong jre\lib\security> không có mật khẩu mặc định là changeit gây ra lỗi;

Tôi hiện đã thay đổi mật khẩu trên kho khóa jre và tôi đang làm việc tốt trong jre/jdk ban đầu của mình.

1

Tôi nghĩ vấn đề của bạn có liên quan với các thư viện vì stacktrace nói

'org.apache.ws .security.components.crypto.Merlin không thể tạo cá thể '

có nghĩa là bạn không có (o có phiên bản không chính xác) của thư viện WSS4J.

+0

Hi Curro, tôi đã cố gắng khắc phục vấn đề này (chi tiết tôi là câu trả lời của tôi bên dưới) nhưng tôi sẽ trao cho bạn tiền thưởng vào cuối 4 ngày tiếp theo để đại diện không bị mất. – Waltzy

Các vấn đề liên quan