Tôi đang làm việc trên một hướng dẫn cho các dịch vụ web REST tại www.udemy.com (REST Java Web Services). Ví dụ trong hướng dẫn nói rằng để có SSL, chúng ta phải có một thư mục có tên là "trust_store" trong dự án "client" nhật thực của tôi nên chứa tệp "lưu trữ khóa" (chúng tôi có dự án "client" để gọi dịch vụ và dự án "dịch vụ" có chứa dịch vụ web REST - 2 dự án trong cùng một không gian làm việc nhật thực, một khách hàng, dịch vụ còn lại là dịch vụ). Để đơn giản, họ nói sẽ sao chép "keystore.jks" từ máy chủ ứng dụng thủy tinh (glassfish \ domain \ domain1 \ config \ keystore.jks) mà chúng tôi đang sử dụng và đưa nó vào thư mục "trust_store" mà họ đã tạo cho tôi dự án khách hàng. Điều đó dường như có ý nghĩa: các certs tự ký trong máy chủ ' s key_store sẽ tương ứng với các certs trong client client_store. Bây giờ, làm điều này, tôi đã nhận được lỗi mà bài viết gốc đề cập. Tôi đã googled điều này và đọc rằng lỗi là do tệp "keystore.jks" trên máy khách không chứa chứng chỉ tin cậy / đã ký, chứng chỉ mà nó tìm thấy là tự ký.
Để làm cho mọi thứ rõ ràng, hãy để tôi nói rằng theo tôi hiểu, "keystore.jks" chứa các certs tự ký và tệp "cacerts.jks" chứa các certs CA (được ký bởi CA). "Keystore.jks" là "kho khóa" và "cacerts.jks" là "kho tin cậy". Như "Bruno", một nhà bình luận, nói ở trên, "keystore.jks" là cục bộ và "cacerts.jks" dành cho các máy khách từ xa.
Vì vậy, tôi đã nói với bản thân mình rằng, cá thủy tinh cũng có tệp "cacerts.jks", là tệp tin Trust_store của thủy tinh. cacerts.jsk được cho là chứa chứng chỉ CA. Và rõ ràng tôi cần thư mục trust_store của mình để chứa tệp lưu trữ khóa có ít nhất một chứng chỉ CA. Vì vậy, tôi đã thử đặt tệp "cacerts.jks" vào thư mục "trust_store" mà tôi đã tạo, trong dự án máy khách của mình và thay đổi các thuộc tính VM để trỏ đến "cacerts.jks" thay vì "keystore.jks". Điều đó đã thoát khỏi lỗi. Tôi đoán tất cả những gì nó cần là một chứng chỉ CA để làm việc.
Điều này có thể không lý tưởng cho sản xuất, hoặc thậm chí cho sự phát triển ngoài việc chỉ cần làm một cái gì đó để làm việc. Chẳng hạn, bạn có thể sử dụng lệnh "keytool" để thêm CA certs vào tệp "keystore.jks" trong máy khách. Nhưng dù sao thì hy vọng điều này ít nhất sẽ thu hẹp các tình huống có thể xảy ra ở đây để gây ra lỗi.
CSONG: Cách tiếp cận của tôi có vẻ hữu ích cho khách hàng (chứng chỉ máy chủ được thêm vào client trust_store), có vẻ như các nhận xét ở trên để giải quyết bài đăng gốc rất hữu ích cho máy chủ (chứng chỉ ứng dụng khách được thêm vào máy chủ trust_store). Chúc mừng.
Thiết lập dự án Eclipse:
- Dự án MyClient
- src
- kiểm tra
- Thư viện hệ thống JRE
- ...
- Trust_store
--- cacerts.jks --- keystore.jks
Đoạn trích từ tệp MyClientProject.java:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}