2017-07-04 53 views
0
public class URLConnectionReader { 
     public static void main(String[] args) throws Exception { 
      URL urlObj = new URL("https://www.paypal.com"); // enter url here 
      HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); 
      connection.setRequestMethod("GET"); 
      connection.connect(); 
      int code = connection.getResponseCode(); 
      System.out.println(code); 
     } 
} 

我正在创建一个URL测试器,它检查URL是否正常工作。上面是我的代码。当我用https://www.paypal.com测试它时,它返回200,当我用https://www.facebook.com测试它时,它会抛出异常。 下面是异常堆栈跟踪Java URL连接https URL上的奇怪行为

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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) 
    at URLConnectionReader.main(URLConnectionReader.java:27) 
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:387) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
    ... 11 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 

at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
... 17 more 

有谁能够解释一下我为什么https://www.paypal.com返回200,但https://www.facebook.com抛出异常。

回答

0

这里的问题在于,默认情况下,Java带有根CA证书的非常有限的集合 。它“接受”比典型的 浏览器少得多的CA。解决此问题的最简单方法是从Chrome或Firefox等浏览器中导出一组 CA证书,并使用keytool将它们导入到Java的密钥存储库中 。

ref

+0

不要发布基本上是来自另一个问题的引用的答案,而是投票或标记为重复关闭。 –

+0

我看不到标志中的重复标志 –

+1

我回滚了您的最后一次编辑,因为答案中的文本不是您的,因此必须引用和归因。您的修改删除了这是一个引用的事实,并删除了归属地,这会使您的回答违反规则(特别是plagiary)。标记为重复可能需要稍高的声誉,不确定。 –

0

由于贝宝,是由一个机构是在您的信任签名的证书,而Facebook并没有。