Giải quyết javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Xây dựng đường dẫn PKIX không thành công Lỗi?


426

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ầu

gâ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)App2(port 443). App1kết nối với App2. Khi App1kết nối với App2tô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.xmlcả 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.xmlcác app2má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 app1chươ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());

bản sao có thể có của HTTPClient và SSL
Hầu tước Lorne

Tôi đã gặp phải lỗi này khi giao tiếp giữa các máy chủ phân cụm không có vấn đề SSL riêng lẻ. Khi tôi đặt đúng cách domainnametrong 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 đó.
DavidG

Một điều khác để kiểm tra là bạn có phiên bản Java mới nhất - Tôi đã gặp một lỗi tương tự vì điều này.
Redzarf

stackoverflow.com/questions/2893819/ - - cũng có liên quan và một câu trả lời tuyệt vời.
Siddhartha

Câu trả lời:


406

Bạn cần thêm chứng chỉ cho App2 vào tệp tin Truststore của JVM được sử dụng tại %JAVA_HOME%\lib\security\cacerts.

Trước tiên, bạn có thể kiểm tra xem chứng chỉ của bạn đã có trong cửa hàng tin cậy hay chưa bằng cách chạy lệnh sau: keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"(bạn không cần cung cấp mật khẩu)

Nếu chứng chỉ của bạn bị thiếu, bạn có thể lấy nó bằng cách tải xuống bằng trình duyệt của mình và thêm nó vào cửa hàng tin cậy bằng lệnh sau:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>

Sau khi nhập, bạn có thể chạy lại lệnh đầu tiên để kiểm tra xem chứng chỉ của bạn đã được thêm chưa.

Thông tin Sun / Oracle có thể được tìm thấy ở đây .


6
Bạn sẽ phải sử dụng đường dẫn đầy đủ, ví dụ: c: \ java \ jdk \ lib \ security \ cacerts
SimonSez

48
Giống như SimonSez đã nói, bạn không cần mật khẩu, nhưng nếu bạn muốn nó, mật khẩu mặc định là "thay đổi".
Felix

16
Ngoài ra, trong Windows, bạn cần chạy thiết bị đầu cuối với tư cách quản trị viên, nếu không, bạn sẽ gặp lỗi keytool error: java.io.FileNotFoundException ... (Access is denied)khi bạn cố gắng nhập chứng chỉ của mình.
Felix

2
Ah @SimonSez bạn là chúa của tôi. Nhưng để thêm vào nó, người ta phải chỉ định vị trí và mật khẩu của cửa hàng tin cậy như được đề cập bởi @M Sach để làm cho nó hoạt động.
BudsNanKis

2
Tiếp tục có vấn đề với Java 1.8. Cần thêm chứng chỉ như được mô tả và sử dụng Java <1.8
Tom Howard

180

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ệ

• Khi tôi gặp lỗi, tôi đã cố gắng tìm hiểu ý nghĩa của biểu thức và tôi thấy, sự cố này xảy ra khi máy chủ thay đổi chứng chỉ SSL HTTPS của họ và phiên bản java cũ hơn của chúng tôi không nhận ra cơ quan chứng nhận gốc (CA) .

• Nếu bạn có thể truy cập URL HTTPS trong trình duyệt của mình thì có thể cập nhật Java để nhận ra CA gốc.

• Trong trình duyệt của bạn, hãy truy cập URL HTTPS mà Java không thể truy cập. Nhấp vào chuỗi chứng chỉ HTTPS (có biểu tượng khóa trong Internet Explorer), nhấp vào khóa để xem chứng chỉ.

• Chuyển đến Chi tiết về các loại giấy chứng nhận và các bản sao của tập tin và bản sao. Sao chép nó ở định dạng Base64 (.cer) . Nó sẽ được lưu trên máy tính để bàn của bạn.

• Cài đặt chứng chỉ bỏ qua tất cả các cảnh báo.

• Đây là cách tôi thu thập thông tin chứng chỉ của URL mà tôi đang cố truy cập.

Bây giờ tôi phải tạo phiên bản java của mình để biết về chứng chỉ để không bị từ chối nhận URL. Về mặt này, tôi phải đề cập đến việc tôi đã thông báo rằng thông tin chứng chỉ gốc vẫn được mặc định ở vị trí bảo mật \ jre \ lib \ của JDK và mật khẩu mặc định để truy cập là: changeit.

Để xem thông tin về cacerts sau đây là các quy trình cần tuân thủ:

• Nhấp vào nút Bắt đầu -> Chạy

• Nhập cmd. Dấu nhắc lệnh mở (bạn có thể cần mở nó với tư cách quản trị viên).

• Chuyển đến Java/jreX/binthư mục của bạn

• Gõ như sau

keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Nó đưa ra danh sách các chứng chỉ hiện tại có trong kho khóa. Nó trông giống như thế này:

C: \ Tài liệu và Cài đặt \ NeelanjanaG> keytool -list -keystore D: \ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

Nhập mật khẩu kho khóa: thay đổi

Loại kho khóa: jks

Nhà cung cấp kho khóa: CN

Kho khóa của bạn chứa 44 mục

verisign class3g2ca, ngày 26 tháng 3 năm 2004, TrustedCertEntry,

Dấu vân tay chứng chỉ (MD5): A2: 33: 9B: 4C: 74: 78: 73: D4: 6C: E7: C1: F3: 8D: CB: 5C: E9

entrustclientca, ngày 9 tháng 1 năm 2003, TrustedCertEntry,

Dấu vân tay chứng nhận (MD5): 0C: 41: 2F: 13: 5B: A0: 54: F5: 96: 66: 2D: 7E: CD: 0E: 03: F4

thawtepersonalbasicca, ngày 13 tháng 2 năm 1999, đáng tin cậyCertEntry,

Dấu vân tay chứng chỉ (MD5): E6: 0B: D2: C9: CA: 2D: 88: DB: 1A: 71: 0E: 4B: 78: EB: 02: 41

addtrustgroup1ca, ngày 1 tháng 5 năm 2006, TrustedCertEntry,

Dấu vân tay (MD5): 1E: 42: 95: 02: 33: 92: 6B: B9: 5F: C0: 7F: DA: D6: B2: 4B: FC

verisign class2g3ca, ngày 26 tháng 3 năm 2004, TrustedCertEntry,

Dấu vân tay (MD5): F8: BE: C4: 63: 22: C9: A8: 46: 74: 8B: B8: 1D: 1E: 4A: 2B: F6

• Bây giờ tôi phải đưa chứng chỉ đã cài đặt trước đó vào các mục.

• Đối với điều này sau đây là thủ tục:

keytool Nhậnimportportnoprompt HPtrustcacerts ănalias ALIASNAME -file FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

Nếu bạn đang sử dụng Java 7:

keytool Nhậnimportcert Từtrustcacerts ănalias ALIASNAME -file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass Changeit

• Sau đó sẽ thêm thông tin chứng chỉ vào tệp cacert.

Đó là giải pháp tôi tìm thấy cho Ngoại lệ được đề cập ở trên !!


5
Bạn làm gì khi chứng chỉ hết hạn? Lặp lại mọi thứ (hàng năm)?
ggkmath

7
Có cách nào để làm điều này lập trình?
Tơ lụa lụa

1
Đối với những người xử lý lỗi PKIX, "Đường dẫn không xâu chuỗi với bất kỳ neo tin cậy nào", giải pháp này không giải quyết được vấn đề đó cho tôi.
IcedDante

3
Một câu hỏi - Có phải bí danh là địa chỉ web mà chúng tôi đang nhập chứng chỉ không? Ví dụ: nếu URL là domain.site.com/pages/service.asmx thì bí danh nên là domain.site.com hoặc URL hoàn chỉnh (domain.site.com/pages/service.asmx) hoặc cũng nên được thêm tiền tố vào http : // hoặc nó chỉ là một tên tùy ý?
nanosoft

1
đường dẫn: \ lib \ an ninh> keytool -import -noprompt -trustcacerts -alias WebCert -file webCertResource.cer -keystore c: / Users / Jackie / Desktop -storepass changeit tôi nhận được "hệ thống không thể tìm thấy một file nào đó"
Jesse

46

Cách làm việc-nó trong Tomcat 7

Tôi muốn hỗ trợ chứng chỉ tự ký trong Ứng dụng Tomcat nhưng đoạn mã sau không hoạt động

import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}

đây là những gì đã giải quyết vấn đề của tôi:

1) Tải .crttập tin

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • thay thế <your domain>bằng tên miền của bạn (ví dụ jossef.com)

2) Áp dụng .crttệp trong cacertskho chứng chỉ của Java

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • thay thế <your domain>bằng tên miền của bạn (ví dụ jossef.com)
  • thay thế <JAVA HOME>bằng thư mục nhà java của bạn

3) Hack nó

Mặc dù đã cài đặt chứng chỉ của tôi trong Javacác cửa hàng chứng chỉ mặc định, Tomcat bỏ qua điều đó (có vẻ như nó không được cấu hình để sử dụng kho lưu trữ chứng chỉ mặc định của Java).

Để hack cái này, hãy thêm đoạn mã vào đâu đó trong mã của bạn:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

4
Bước 2 đã thực hiện thủ thuật cho tôi bằng SpringBoot và Tomcat 7. Cảm ơn bạn.
Tim Perry

Tôi có phải sử dụng keytool từ java được tomcat sử dụng không? Bởi vì trên một máy chủ tôi có thể có nhiều java
vikifor

@vikifor vâng. Bạn cũng có thể chạy nó cho tất cả các thư mục java được cài đặt trên hệ thống của bạn
Jossef Harush

1
Điều này đã làm việc! cảm ơn một tấn @JossefHarush cho một câu trả lời hữu ích như vậy!
Tom Taylor

1
vấn đề của tôi đã được giải quyết sau khi thêm đoạn mã của @Jossef Harush vào mã của tôi.
Chamod Pathirana

10

Trong trường hợp của tôi, vấn đề là máy chủ web chỉ gửi chứng chỉ và CA trung gian, không phải CA gốc. Thêm tùy chọn JVM này đã giải quyết vấn đề:-Dcom.sun.security.enableAIAcaIssuers=true

Hỗ trợ cho phương thức truy cập caIssuers của tiện ích mở rộng Quyền truy cập thông tin có sẵn. Nó bị tắt theo mặc định để tương thích và có thể được kích hoạt bằng cách đặt thuộc tính hệ thống com.sun.security.enableAIAcaIssuersthành giá trị đúng.

Nếu được đặt thành đúng, việc triển khai PKIX của CertPathBuilder của Sun sử dụng thông tin trong tiện ích mở rộng AIA của chứng chỉ (ngoài các Chứng nhận được chỉ định) để tìm chứng chỉ CA đang phát hành, miễn là nó là URI loại ldap, http hoặc ftp.

Nguồn


Điều này thực sự giải quyết vấn đề của tôi, cảm ơn!
Luís Silva

6

Một lý do khác có thể là một phiên bản lỗi thời của JDK. Tôi đã sử dụng jdk phiên bản 1.8.0_60, chỉ cần cập nhật lên phiên bản mới nhất đã giải quyết được vấn đề chứng chỉ.


2
Tôi cũng gặp vấn đề tương tự. Gọi API bằng Chứng chỉ mã hóa cho phép có thể không hoạt động với các phiên bản Java cũ hơn vì nó không được các cơ quan chứng nhận gốc đáng tin cậy nhận ra. Cập nhật Java sẽ giải quyết vấn đề này.
hertg

5

Tập tin cacerts của tôi hoàn toàn trống rỗng. Tôi đã giải quyết vấn đề này bằng cách sao chép tệp cacerts ra khỏi máy windows của mình (đó là sử dụng Oracle Java 7) và đưa nó vào hộp Linux của tôi (OpenJDK).

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

và sau đó trên máy linux

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

Nó đã làm việc rất tốt cho đến nay.


1
Điều này hoạt động tuyệt vời nếu vấn đề là bạn đang sử dụng phiên bản java cũ hơn không có chứng chỉ mới nhất.
atripathi

@atripathi thế nào về máy Mac?
iOSAndroidWindowsMobileAppsDev

Có lỗi gì đó nghiêm trọng với cài đặt Java của bạn nếu tệp cacerts trống. Bạn nên cài đặt lại tất cả.
Hầu tước Lorne

Có lẽ, nhưng giải pháp này đã có hiệu quả và không có gì sai sau đó.
Ryan Shillington

5

Đối với tôi, lỗi này cũng xuất hiện trong khi cố gắng kết nối với một quá trình đằng sau proxy ngược NGINX đang xử lý SSL.

Hóa ra vấn đề là một chứng chỉ mà không có toàn bộ chuỗi chứng chỉ được nối. Khi tôi thêm certs trung gian, vấn đề đã được giải quyết.

Hi vọng điêu nay co ich.


đó trông giống như những gì tôi đang có. bạn có thể giải thích về cách bạn thêm các certs trung gian và ở đâu. tôi đang sử dụng proxy đảo ngược httpd và không NGINX.
Asaf Magen

điều này đã giúp tôi trong trường hợp của tôi vì tôi đang sử dụng httpd: access.redhat.com/solutions/43575
Asaf Magen

Với nginx, Nó chỉ sử dụng các tệp .key và .pem cho cấu hình SSL. Trước tiên, bạn chuyển đổi .crt thành .pem (đơn giản: cp yourfile.crt yourfile.pem) và sau đó cho chuỗi chứng chỉ SSL: bạn nối tệp .cer vào cuối cùng của .pem (cat yourfile.cer >> yourfile.pem)
Thế Anh Nguyễn

5

Sử dụng Tomcat 7 trong Linux, điều này đã tạo nên mánh khóe.

String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Trong Linux, $JAVA_HOMEkhông phải lúc nào cũng được thiết lập, nhưng thường /etc/alternatives/jretrỏ đến$JAVA_HOME/jre


5

Mã dưới đây hoạt động với tôi:

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}

HttpsURLConnection conn = null;
            URL url = new URL(serviceUrl);
            conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  

             conn.setSSLSocketFactory(sc.getSocketFactory());

5
Mã này hoàn toàn không an toàn và không nên được sử dụng.
Hầu tước Lorne

@ user207421 Tại sao nó không an toàn? Những gì đang xảy ra trong mã ngắn gọn.
Govinda Sakhare

Điều này đang bỏ qua tất cả các xác nhận chứng chỉ, về cơ bản nó cho phép bất kỳ chứng chỉ nào được chấp nhận. Cách thức hoạt động của certs là có chứng chỉ gốc (theo nghĩa đen) được bảo vệ về mặt vật lý, tại các cơ quan chứng nhận khác nhau. Chứng chỉ này sau đó được sử dụng để cấp các chứng chỉ thứ cấp khác, có thể được xác nhận hoàn toàn cho cơ quan chứng nhận gốc. Điều này đang bỏ qua tất cả các kiểm tra ngược dòng, có nghĩa là tôi có thể gửi bất kỳ chứng chỉ ssl nào (thậm chí tự tạo) và ứng dụng của bạn sẽ chấp nhận nó an toàn, mặc dù danh tính của tôi là url không được xác minh.
Scott Taylor

4

Tôi đã sử dụng jdk1.8.0_171khi tôi phải đối mặt với cùng một vấn đề. Tôi đã thử 2 giải pháp hàng đầu ở đây (thêm chứng chỉ bằng keytool và một giải pháp khác có hack) nhưng chúng không hiệu quả với tôi.

Tôi đã nâng cấp JDK của mình lên 1.8.0_181và nó hoạt động như một bùa mê.


2

tôi đã viết một tập lệnh cmd (dòng lệnh) ngu ngốc win32 (WinXP 32 bit) tìm kiếm tất cả các phiên bản java trong tệp chương trình và thêm chứng chỉ cho chúng. Mật khẩu cần phải là "thay đổi" mặc định hoặc tự thay đổi nó trong tập lệnh :-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause

2

Đối với MacOS X bên dưới, lệnh chính xác đã hoạt động với tôi khi tôi phải thử với hypen kép trong tùy chọn 'importcert' hoạt động:

sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit

2

Đối với tôi đã không làm việc giải pháp được công nhận từ bài đăng này: https://stackoverflow.com/a/9619478/4507034 .

Thay vào đó, tôi quản lý để giải quyết vấn đề bằng cách nhập chứng nhận vào máy của tôi.

Các bước:

  1. Truy cập URL (ví dụ. https://localhost:8443/yourpath) Nơi chứng nhận không hoạt động.
  2. Xuất khẩu chứng nhận như mô tả trong bài viết đã đề cập.
  3. Trên máy tính windows của bạn mở: Manage computer certificates
  4. Chuyển đến Trusted Root Certification Authorities->Certificates
  5. Nhập vào đây your_certification_name.certập tin của bạn .

1

Đối với Tomcat đang chạy trên máy chủ Ubuntu, để tìm hiểu Java nào đang được sử dụng, hãy sử dụng lệnh "ps -ef | grep tomcat":

Mẫu vật:

/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat

Sau đó, chúng ta có thể truy cập vào: cd /usr/local/java/jdk1.7.0_15/jre/lib/securance

Tập tin cacerts mặc định được đặt ở đây. Chèn chứng chỉ không tin cậy vào nó.


1

Để an toàn, chúng tôi không nên sử dụng các chứng chỉ tự ký trong quá trình thực hiện. Tuy nhiên, khi phát triển thường chúng ta phải sử dụng các môi trường dùng thử có các certs tự ký. Tôi đã cố gắng khắc phục vấn đề này theo chương trình trong mã của tôi và tôi đã thất bại. Tuy nhiên, bằng cách thêm chứng chỉ vào cửa hàng ủy thác jre đã khắc phục vấn đề của tôi. Vui lòng tìm các bước dưới đây,

  1. Tải xuống chứng chỉ trang web,

  2. Sao chép chứng chỉ (ví dụ: cert_file.cer) vào thư mục $ JAVA_HOME \ Jre \ Lib \ Security

  3. Mở CMD trong Quản trị viên và thay đổi thư mục thành $ JAVA_HOME \ Jre \ Lib \ Security

  4. Nhập chứng chỉ vào cửa hàng ủy thác bằng lệnh bên dưới,

keytool -import -alias ca -file cert_file.cer -keystore cacerts -storepass Changeit

Nếu bạn gặp lỗi khi nói keytool không thể nhận ra, vui lòng tham khảo điều này.

Nhập như dưới đây

Tin tưởng chứng chỉ này: [Có]

  1. Bây giờ hãy thử chạy mã của bạn hoặc truy cập URL bằng lập trình bằng java.

Cập nhật

Nếu máy chủ ứng dụng của bạn là jboss, hãy thử thêm thuộc tính hệ thống bên dưới

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

Hi vọng điêu nay co ich!


1

GIẢI PHÁP NÂNG CẤP (Alpine Linux)

Để có thể khắc phục sự cố này trong môi trường ứng dụng của chúng tôi, chúng tôi đã chuẩn bị các lệnh đầu cuối Linux như sau:

cd ~

Sẽ tạo tập tin cert trong thư mục nhà.

apk add openssl

Lệnh này cài đặt openssl trong alpine Linux. Bạn có thể tìm thấy các lệnh thích hợp cho các bản phân phối Linux khác.

openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

Tạo tập tin chứng chỉ cần thiết.

sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt

Áp dụng tệp được tạo cho JRE với chương trình 'keytool'.

Lưu ý: Vui lòng thay thế DNS của bạn bằng<host-dns-ssl-belongs>

Lưu ý2: Vui lòng lưu ý rằng -nopromptsẽ không nhắc thông báo xác minh (có / không) và -storepass changeittham số sẽ tắt lời nhắc mật khẩu và cung cấp mật khẩu cần thiết (mặc định là 'thay đổi'). Hai thuộc tính này sẽ cho phép bạn sử dụng các tập lệnh đó trong môi trường ứng dụng của mình như xây dựng hình ảnh Docker.

Lưu ý3 Nếu bạn đang triển khai ứng dụng của mình thông qua Docker, bạn có thể tạo tệp bí mật một lần và đưa nó vào tệp dự án ứng dụng của bạn. Bạn sẽ không cần phải tạo ra nó nhiều lần.


0

Tôi cũng gặp vẫn đề này.

Tôi đã thử hầu hết mọi thứ bằng cách thêm chứng chỉ SSL vào .keystore, nhưng, nó không hoạt động với Java1_6_x. Đối với tôi, điều đó có ích nếu chúng ta bắt đầu sử dụng phiên bản Java mới hơn, Java1_8_x làm JVM.


1
Tương tự cho tôi. Một bản cập nhật từ Java 1.8.0_91 đến 1.8.0_121 đã giải quyết vấn đề. Tôi đã có ngoại lệ bằng cách sử dụng Apache HTTPClient.
Devabc

Tôi vẫn gặp sự cố này khi sử dụng xác thực Oauth2
Sofiane

0

Tôi gặp vấn đề này với Android Studio khi tôi đứng sau proxy. Tôi đã sử dụng Crashlytics cố gắng tải lên tệp ánh xạ trong quá trình xây dựng.

Tôi đã thêm chứng chỉ proxy bị thiếu vào kho ủy thác tại /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

với lệnh sau: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

ví dụ với mật khẩu Truststore mặc định keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

Chỉ là một hack nhỏ. Cập nhật URL trong tệp "hudson.model.UpdateCenter.xml" từ https sang http

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

0

Tôi muốn hòa nhập vì tôi có môi trường QEMU nơi tôi phải tải xuống các tệp trong java. Hóa ra /etc/ssl/certs/java/cacertstrong QEMU không có vấn đề gì vì nó không khớp với /etc/ssl/certs/java/cacertsmôi trường máy chủ. Môi trường máy chủ lưu trữ phía sau proxy công ty, do đó, các trích dẫn java là phiên bản tùy chỉnh.

Nếu bạn đang sử dụng môi trường QEMU, hãy đảm bảo hệ thống máy chủ có thể truy cập các tệp trước tiên. Ví dụ, bạn có thể thử tập lệnh này trên máy chủ của mình trước để xem. Nếu tập lệnh chỉ chạy tốt trong máy chủ nhưng không có trong QEMU, thì bạn đang gặp vấn đề tương tự như tôi.

Để giải quyết vấn đề này, tôi đã phải tạo một bản sao lưu của tệp gốc trong QEMU, sao chép tệp trong môi trường máy chủ vào nhà tù chroot QEMU và sau đó java có thể tải xuống các tệp bình thường trong QEMU.

Một giải pháp tốt hơn sẽ là gắn kết /etcvào môi trường QEMU; tuy nhiên tôi không chắc liệu các tập tin khác có bị ảnh hưởng trong quá trình này không. Vì vậy, tôi quyết định sử dụng công việc xấu xí nhưng dễ dàng này.


0

Đây có vẻ là một nơi tốt để ghi lại một lý do có thể khác cho thông báo lỗi PKIX khét tiếng. Sau khi dành quá nhiều thời gian để xem nội dung kho khóa và cửa hàng tin cậy và các cấu hình cài đặt java khác nhau, tôi nhận ra rằng vấn đề của tôi đã giảm xuống ... một lỗi đánh máy.

Lỗi đánh máy có nghĩa là tôi cũng đang sử dụng kho khóa làm kho ủy thác. Vì các công ty của tôi, Root CA không được xác định là chứng chỉ độc lập trong kho khóa mà chỉ là một phần của chuỗi chứng chỉ và không được xác định ở bất kỳ nơi nào khác (ví dụ: các cảnh báo), tôi liên tục gặp lỗi PKIX.

Sau khi phát hành thất bại (đây là cấu hình prod, nó vẫn ổn ở nơi khác) và hai ngày đầu tôi cuối cùng cũng thấy lỗi đánh máy, và bây giờ tất cả đều tốt.

Hy vọng điều này sẽ giúp được ai đó.


-1

thêm mã này vào mã của bạn:

TrustManager[] trustAllCerts = new TrustManager[]{
           new X509TrustManager() {
               @Override
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                   return new X509Certificate[0];
               }

               @Override
               public void checkClientTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }

               @Override
               public void checkServerTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }
           }
       };

       try {
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
       } catch (GeneralSecurityException e) {
       }

1
Các câu trả lời chỉ có mã thường được tán thành trên trang web này. Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn để bao gồm một số ý kiến ​​hoặc giải thích về mã của bạn? Giải thích nên trả lời các câu hỏi như: Nó làm gì? Làm thế nào để nó làm điều đó? Nó đi đâu? Làm thế nào để giải quyết vấn đề của OP?
mypetlion

1
thêm mã này vào mã của bạn . Đừng thêm mã này vào mã của bạn . Tạo SSLContext theo cách này sẽ xóa tất cả các kiểm tra bảo mật xác minh danh tính của máy chủ mà bạn đang kết nối. Câu trả lời cho vấn đề mất chìa khóa của bạn là KHÔNG loại bỏ tất cả các khóa khỏi mọi thứ bạn sở hữu.
Andrew Henle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.