2011-12-04 55 views
9

Tôi đang tìm cách phân tích cú pháp tệp XML cập nhật tệp được cho biết hàng ngày - vấn đề duy nhất tôi gặp phải là họ sử dụng chứng chỉ của riêng họ (https://...) và tôi không thể sử dụng URL cụ thể đó, cũng như không có liên kết http: // ....javax.net.ssl.SSLException: java.security.InvalidAlgorithmParameterException: tham số trustAnchors phải không rỗng

URL url = new URL("https://..."); 
... 
Document document = db.parse(url.openStream()); 

Mã này ném ngoại lệ sau khi chạy thử nghiệm của tôi:

javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

Tôi đã nhìn thấy rất nhiều lời đề nghị đối phó với việc tạo ra các lớp học khác nhau để đối phó với các loại hình kết nối hoặc với một máy chủ cá nhân , cũng như thêm chứng chỉ vào kho khóa và sau đó thêm kho khóa đó vào dự án Java, nhưng tôi đã không thể làm điều đó và đang tìm kiếm một cách đơn giản hơn một chút để tôi truy cập vào XML trực tuyến.

+0

Dường như bạn đã thay đổi các thiết lập truststore của bạn không sử dụng những cái mặc định. Bạn đã thay đổi gì? – Bruno

+1

Điều này có tác dụng loại bỏ kho lưu trữ tin cậy mặc định, do đó bạn nhận được thông số trustAnchors trống. Luôn luôn có một kho tin không trống. – Bruno

+0

Xem [answer] [1] Tóm lại, không thể tìm thấy kho khóa. [1]: http://stackoverflow.com/a/6788682/207131 – FabienB

Trả lời

3

Thông báo tò mò này có nghĩa là không tìm thấy truststore.

Không có gì liên quan đến XML BTW.

+0

Tôi làm cách nào để thêm và quản lý một truststore? – Acetaminophen

+0

@Acetaminophen Xem Javadoc: Hướng dẫn Tham khảo An ninh/JSSE. – EJP

+0

Tôi đã đổi tên thành /lib/security/cacerts thành /lib/security/cacerts_orig trước đó trong một nỗ lực để thêm chứng chỉ tôi có vào kho khóa - Tôi đã sửa lỗi đó và hiện có lỗi sau: javax.net.ssl .SSLHandshakeException: sun.security.validator.ValidatorException: Xây dựng đường dẫn PKIX không thành công: sun.security.provider.certpath.SunCertPathBuilderException: không thể tìm thấy đường dẫn chứng nhận hợp lệ để yêu cầu mục tiêu – Acetaminophen

9

Bạn cần một cửa hàng tin cậy để lưu trữ chứng chỉ SSL. Bạn có thể tải xuống chứng chỉ bằng trình duyệt web ưa thích của mình. Để tải chứng chỉ vào truststore, bạn cần chương trình "keytool", đi kèm với JDK.

Ví dụ, nếu tập tin chứng chỉ của bạn được đặt tên là "certificate.crt" và bạn muốn tạo một truststore tên "secure.ts", bạn có thể gọi keytool như sau:

keytool -importcert -keystore secure.ts -storepass S3cuR3pas$! -file certificate.crt 

Bây giờ, bạn phải nói với chương trình của bạn, nơi keystore là và mật khẩu để mở nó, xác định các thuộc tính hệ thống "javax.net.ssl.trustStore" và "javax.net.ssl.trustStorePassword" trước mở kết nối

URL url = new URL("https://..."); 

System.setProperty("javax.net.ssl.trustStore", "secure.ts"); 
System.setProperty("javax.net.ssl.trustStorePassword", "S3cuR3pas$!"); 
... 
Document document = db.parse(url.openStream()); 
-3

Tôi chạy vào cùng một ngoại lệ cho MAC OSX (Yosemite) của tôi, trong khi phát triển các ứng dụng Java 6. Bạn cần phải tải về và cài đặt Java của Apple cho OSX 2014:

http://support.apple.com/kb/DL1572

0

Bạn có thể thử với điều này:

String javaHomePath = System.getProperty("java.home"); 
String keystore = javaHomePath + "/lib/security/cacerts"; 
String storepass= "changeit"; 
String storetype= "JKS"; 

String[][] props = { 
    { "javax.net.ssl.trustStore", keystore, }, 
    { "javax.net.ssl.keyStore", keystore, }, 
    { "javax.net.ssl.keyStorePassword", storepass, }, 
    { "javax.net.ssl.keyStoreType", storetype, }, 
}; 
for (int i = 0; i < props.length; i++) { 
    System.getProperties().setProperty(props[i][0], props[i][1]); 
} 
// Now you can proceed to connect to call the webservice. 
// SSL will be used automatically if the service endpoint url 
// starts with <a href="https://." target="_blank"   rel="nofollow">https://.</a> 
// The server will send its certificate signed by verisign and 
// client will trust and authenticate the server as it recognizes 
// verisign as one trusted root.