2012-11-29 31 views
50

tôi có ngoại lệ sau khi cố gắng để gửi một yêu cầu đến một máy chủ http:Làm thế nào để bỏ qua việc xây dựng đường dẫn PKIX không thành công: sun.security.provider.certpath.SunCertPathBuilderException?

Đây là mã tôi đã sử dụng

URL url = new URL(
     "https://www.abc.com"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

conn.setRequestMethod("GET"); 

conn.setDoOutput(true); 

DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); 
// wr.writeBytes(params); 
wr.flush(); 
wr.close(); 

BufferedReader br = new BufferedReader(new InputStreamReader(
     conn.getInputStream())); 
String line = null; 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 

Dưới đây là ngoại lệ:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) 
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) 
    at com.amazon.mzang.tools.httpchecker.CategoryYank.getPV(CategoryYank.java:32) 
    at com.amazon.mzang.tools.httpchecker.CategoryYank.main(CategoryYank.java:18) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217) 
    at sun.security.validator.Validator.validate(Validator.java:218) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185) 
    ... 13 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318) 
    ... 19 more 

Máy chủ là không thuộc sở hữu của tôi. Có cách nào để bỏ qua ngoại lệ này không?

+5

Đừng bỏ qua * * ngoại lệ này. Nhập chứng chỉ (sau một số xác minh thủ công) trong cửa hàng tin cậy của bạn. Bỏ qua các lỗi chứng chỉ làm cho kết nối dễ bị tấn công MITM tiềm ẩn. – Bruno

+8

Có những lúc niềm tin không quan trọng đối với khách hàng nhưng https đã được máy chủ sử dụng thì không ít hơn. – Gus

Trả lời

44

Nếu bạn muốn bỏ qua giấy chứng nhận tất cả cùng nhau sau đó hãy xem câu trả lời ở đây: Ignore self-signed ssl cert using Jersey Client

Mặc dù điều này sẽ làm cho ứng dụng của bạn dễ bị tấn công man-in-the-middle.

Hoặc, hãy thử thêm cert vào cửa hàng java của bạn làm chứng chỉ tin cậy. Trang web này có thể hữu ích. http://blog.icodejava.com/tag/get-public-key-of-ssl-certificate-in-java/

Đây là một chuỗi khác cho biết cách thêm chứng chỉ vào cửa hàng của bạn. Java SSL connect, add server cert to keystore programmatically

Điều quan trọng là:

KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(someCert); 
ks.setEntry("someAlias", newEntry, null); 
28

Tôi đã sử dụng mã dưới đây để ghi đè SSL kiểm tra trong dự án của tôi và nó làm việc cho tôi.

package com.beingjavaguys.testftp; 

import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 
import java.security.cert.X509Certificate; 

/** 
* Fix for Exception in thread "main" javax.net.ssl.SSLHandshakeException: 
* sun.security.validator.ValidatorException: PKIX path building failed: 
* sun.security.provider.certpath.SunCertPathBuilderException: unable to find 
* valid certification path to requested target 
*/ 
public class ConnectToHttpsUrl { 
    public static void main(String[] args) throws Exception { 
     /* Start of Fix */ 
     TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } 
      public void checkClientTrusted(X509Certificate[] certs, String authType) { } 
      public void checkServerTrusted(X509Certificate[] certs, String authType) { } 

     } }; 

     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

     // Create all-trusting host name verifier 
     HostnameVerifier allHostsValid = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { return true; } 
     }; 
     // Install the all-trusting host verifier 
     HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 
     /* End of the fix*/ 

     URL url = new URL("https://nameofthesecuredurl.com"); 
     URLConnection con = url.openConnection(); 
     Reader reader = new InputStreamReader(con.getInputStream()); 
     while (true) { 
      int ch = reader.read(); 
      if (ch == -1) 
       break; 
      System.out.print((char) ch); 
     } 
    } 
} 
+0

Không tuân theo hợp đồng. – EJP

+0

Cảm ơn Kishore, ví dụ tốt để kiểm tra ở địa phương –

+0

Trong cuộc gọi đến 'sc.init()', đối số thứ ba có thể là 'null'. (Giá trị mặc định sẽ được cung cấp.) – kevinarpe

15

Set validateTLSCertificates tài sản để false cho lệnh JSoup của bạn.

Jsoup.connect("https://google.com/").validateTLSCertificates(false).get(); 
4

FWIW, trên Ubuntu 10.04.2 LTS cài đặt ca-certificate-java và các gói chứng chỉ cố định đã khắc phục vấn đề này cho tôi.

+0

Omg sau 6 giờ giao chiến với máy ảo Ubuntu 10.04 cũ của tôi, điều này đã khắc phục được lỗi pesky.Bản phát hành này quá cũ nên tôi phải sửa đổi sources.list vì những gói đó trả về 404 https://askubuntu.com/questions/805523/apt-get-update-for-ubuntu-10-04 – jpp1jpp1

0

Tôi gặp lỗi tương tự trong khi thực hiện thử nghiệm đơn giản dưới đây.

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

import static com.jayway.restassured.RestAssured.when; 
import static org.apache.http.HttpStatus.SC_OK; 

@RunWith(SpringJUnit4ClassRunner.class) 
public class GeneratorTest { 

@Test 
public void generatorEndPoint() { 
    when().get("https://bal-bla-bla-bla.com/generators") 
      .then().statusCode(SC_OK); 
    } 
} 

Việc sửa chữa đơn giản trong trường hợp của tôi là thêm 'useRelaxedHTTPSValidations()'

RestAssured.useRelaxedHTTPSValidation(); 

Sau đó, kiểm tra trông giống như

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

import static com.jayway.restassured.RestAssured.when; 
import static org.apache.http.HttpStatus.SC_OK; 

@RunWith(SpringJUnit4ClassRunner.class) 
public class GeneratorTest { 

@Before 
public void setUp() { 
    RestAssured.useRelaxedHTTPSValidation(); 
} 


@Test 
public void generatorEndPoint() { 
    when().get("https://bal-bla-bla-bla.com/generators") 
      .then().statusCode(SC_OK); 
    } 
} 
Các vấn đề liên quan