2010-01-26 32 views
31

Tôi đã thiết lập chứng chỉ tự ký để kiểm tra kết nối java ssl - tuy nhiên, nó từ chối xác định vị trí trustStore java. Tôi đã lưu các bản sao của nó trong/Java/jre6/lib/security ngoài thư mục mà các lớp được biên dịch thành (im sử dụng netbeans) và cũng vào/java/jre6/bin không có điều nào ở trên dường như hoạt động, bởi vì khi tôi chạy sau đây - trustStore = null.java - đường dẫn đến trustStore - thiết lập thuộc tính không hoạt động?

public class ShowTrustStore { 

    public static void main(String[] args) { 

     System.setProperty("javax.net.ssl.keyStore", "keystore.jks"); 
     System.setProperty("javax.net.ssl.trustStrore", "cacerts.jks"); 
     System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 



     String trustStore = System.getProperty("javax.net.ssl.trustStore"); 
     if (trustStore == null) { 
      System.out.println("javax.net.ssl.trustStore is not defined"); 
     } else { 
      System.out.println("javax.net.ssl.trustStore = " + trustStore); 
     } 
    } 
} 

cách đặt đường dẫn chính xác?

********** CẬP NHẬT ************ Sử dụng phương pháp getfile() và một số debug nhiều dữ liệu hơn:

package ssltest; 

public class Main { 

    public static void main(String[] args) { 

//  System.setProperty("javax.net.ssl.keyStore", "/keystore.jks"); 
//  System.setProperty("javax.net.ssl.trustStrore", "/java.home/cacerts.jks"); 
//  System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 
//  System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

     try { 
      Main.class.getResource("trustStore.jks").getFile(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     String trustStore = System.getProperty("javax.net.ssl.trustStore"); 

     if (trustStore == null) { 
      String storeLoc; 
      storeLoc = System.getProperty("java.class.path"); 
      System.out.println("classpath: " + storeLoc); 
     } 

     trustStore = System.getProperty("javax.net.ssl.trustStore"); 
     if (trustStore == null) { 
      System.out.println("javax.net.ssl.trustStore is not defined"); 
     } else { 
      System.out.println("javax.net.ssl.trustStore = " + trustStore); 
     } 
    } 
} 

chạy: java.lang.NullPointerException classpath: C: \ Users \ Main \ Documents \ NetBeansProjects \ sslTest \ build \ classes; C: \ Users \ Main \ Documents \ NetBeansProjects \ sslTest \ src tại ssltest.Main.main (Main.java : 15) javax.net.ssl.trustStore không được xác định BUILD SUCCESSFUL (tổng thời gian: 0 giây)

+0

xem câu trả lời cập nhật của tôi – Bozho

+0

hoạt động! cảm ơn nhiều! – oneAday

+0

Tốt để biết rằng tôi không phải là người duy nhất có tìm kiếm một giờ lỗi cho giờ ... vì một chút typo ... ;-) – Steffen

Trả lời

47

Bạn có lỗi đánh máy - nó là trustStore.

Ngoài thiết lập các biến với System.setProperty(..), bạn cũng có thể sử dụng

-Djavax.net.ssl.keyStore=path/to/keystore.jks 
+0

im không chắc chắn những gì khác tôi có thể thử - ive có giá trị java.home như C: \ Program Files (x86) \ Java \ jdk1.6.0_17 \ jre bây giờ ngay cả khi tôi lưu trữ hai tập tin ở đây và chạy nó: System.setProperty ("javax.net.ssl.keyStore", "/ java .home/keystore.jks "); System.setProperty ("javax.net.ssl.trustStrore", "/java.home/cacerts.jks"); nó vẫn không tìm thấy chúng ... – oneAday

+0

java.home không được giải quyết dưới dạng đường dẫn. bạn có thể lấy nó thông qua System.getProperty ("java.home"), nhưng không nên đặt keystore ở đó. Bên cạnh đó, tôi đã cho bạn ba lựa chọn - hãy thử chúng. – Bozho

+0

Tôi đã thử sử dụng cả hai - công việc không đầu tiên và phương pháp thứ hai ném một ngoại lệ con trỏ null - ive đã thêm mã và thông tin gỡ lỗi ở trên. ive lưu trữ các tệp ở cả hai vị trí này (hiển thị dưới dạng đường dẫn lớp): C: \ Users \ Main \ Documents \ NetBeansProjects \ sslTest \ build \ classes; C: \ Users \ Main \ Documents \ NetBeansProjects \ sslTest \ src bất kỳ ý tưởng nào đang xảy ra? cảm ơn !! – oneAday

37

Hình như bạn có một typo - "trustStrore" cần được "trustStore", tức là

System.setProperty("javax.net.ssl.trustStrore", "cacerts.jks"); 

nên :

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks"); 
+0

Tác phẩm này có hoạt động không? Tôi tự hỏi nếu tôi cần phải sử dụng các -Djavax.net.ssl ​​.... công cụ – simgineer

+3

Nó làm việc cho tôi bằng cách sử dụng '-Djavax.net.ssl.trustStore =/home/path/to/truststore' với Tomcat8 – Goot

5

Cả

-Djavax.net.ssl.trustStore=path/to/trustStore.jks 

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks"); 

làm điều tương tự và không có sự khác biệt làm việc khôn ngoan. Trong trường hợp của bạn, bạn chỉ có một lỗi đánh máy. Bạn đã viết sai chính tả trustStore trong javax.net.ssl.trustStore.

+3

Không đúng, gây hiểu lầm. TrustStore là một container khách hàng cho các khóa công khai của các máy chủ tin cậy, trong khi keyStore là một vùng chứa các khóa riêng của bạn. – peterh

+1

@peterh Không đúng sự thật, gây hiểu lầm. Một truststore là một thùng chứa phía client- * hoặc server- * cho * chứng chỉ * của người ký đáng tin cậy. – EJP

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