Chỉnh sửa: - Đã thử định dạng câu hỏi và chấp nhận câu trả lời theo cách dễ trình bày hơn tại Blog của tôi
Đây là vấn đề ban đầu.
Tôi nhận được lỗi này:
thông báo chi tiết 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ệ cho mục tiêu được yêu cầugây ra 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ệ đến mục tiêu được yêu cầu
Tôi đang sử dụng Tomcat 6 làm máy chủ web. Tôi có hai ứng dụng web HTTPS được cài đặt trên các Tomcats khác nhau trên các cổng khác nhau nhưng trên cùng một máy. Nói App1(port 8443)
và
App2(port 443)
. App1
kết nối với App2
. Khi App1
kết nối với App2
tôi nhận được lỗi trên. Tôi biết đây là một lỗi rất phổ biến vì vậy đã tìm thấy nhiều giải pháp trên các diễn đàn và trang web khác nhau. Tôi có mục dưới đây trong server.xml
cả hai Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Mọi trang web đều nói cùng một lý do rằng chứng chỉ được cung cấp bởi app2 không có trong kho đáng tin cậy của app1 jvm. Điều này dường như cũng đúng khi tôi cố gắng truy cập cùng một URL trong trình duyệt IE, nó hoạt động (với sự nóng lên, có vấn đề với chứng chỉ bảo mật của trang web này. Ở đây tôi nói tiếp tục đến trang web này). Nhưng khi cùng một URL bị máy khách Java (trong trường hợp của tôi), tôi gặp lỗi ở trên. Vì vậy, để đưa nó vào cửa hàng tin cậy, tôi đã thử ba tùy chọn sau:
Lựa chọn 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Tùy chọn2 Cài đặt bên dưới trong biến môi trường
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Tùy chọn3 Cài đặt bên dưới trong biến môi trường
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Nhưng không có gì làm việc .
Điều cuối cùng làm việc là thực thi cách tiếp cận Java được đề xuất trong Cách xử lý các chứng chỉ SSL không hợp lệ với Apache HttpClient? bởi Pascal Thivent tức là thực thi chương trình InstallCert.
Nhưng cách tiếp cận này tốt cho thiết lập devbox nhưng tôi không thể sử dụng nó trong môi trường sản xuất.
Tôi tự hỏi tại sao ba cách tiếp cận nói trên không làm việc khi tôi đã đề cập đến các giá trị như nhau trong server.xml
các app2
máy chủ và cùng giá trị trong truststore bởi khung cảnh
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
trong app1
chương trình.
Để biết thêm thông tin, đây là cách tôi thực hiện kết nối:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
trong các máy chủ RHEL của mình, sự cố đã biến mất. Hy vọng nó sẽ giúp được ai đó.