2016-06-11 198 views
2

我有三個問題,當我使用okhttp從這些網站獲取內容:的Java okhttp在重定向數和域名問題證書

  1. http://www.wp.com有錯誤有: javax.net.ssl.SSLHandshakeException:太陽.security.validator.ValidatorException:PKIX路徑建設失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到請求的目標

  2. http://www.macys.com有效的認證路徑具有誤差: java.net.ProtocolException:太多跟進 請求:21

  3. http://www.vk.me具有誤差: javax.net.ssl.SSLPeerUnverifiedException:主機名www.vk.me未驗證: 證書:SHA256/Sx09coMBYByu6GDlS0E6daYLDVLydbmJjFNkTANfSg4 = DN:CN = .vk.com,OU =域控制驗證 subjectAltNames:[ .vk.com,vk.com]

在2016年6月12日修訂版:

  • http://www.wordpress.com有錯誤有: javax.net.ssl.SSLHandshakeException:遠程主機關閉握手
  • 如何解決上述問題1-4時連接?謝謝大家!

    回答

    2

    鑑於網站都沒有被攻破:

    (1)你是缺少您值得信賴的商店根CA證書。如果網站使用的CA未與jdk一起交付,則可能發生這種情況。您需要使用keytool手動將其添加到可信商店中。 (2)我研究了錯誤並發現,如果它收到超過20個重定向請求,okhttp客戶端會拋出這個錯誤。我的來源是這樣的:https://github.com/square/retrofit/issues/1561

    更新:我剛剛爲macys.com做了一個瀏覽器加載頁面跟蹤。令人印象深刻的是,你應該給自己一些經驗:-)重定向是頁面的正常加載行爲,字體被重定向了數十億次。

    OkHTTP實現20的最大重定向值作爲硬編碼值。 https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/internal/http/HttpEngine.java(line 91)

    (3)證書中的域名與提供的證書不匹配。這是多主頁面上的常見錯誤。

    要解決(1),除了加入CA,你可以按此處所述實現Java SSL證書路徑驗證http://docs.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html#ValidationClasses

    要解決(3)你需要實現的TrustManager這裏描述SSL Certificate Verification in Java

    +0

    爲什麼不能分辨2?這是okhttp 3.3.1中的一個錯誤? –

    +0

    不,我不知道2發生了什麼:-) – thst

    +0

    我查了(2)的原因並更新了我的答案。 – thst

    1

    爲了您的第3期,你可以試試下面的

    private HostnameVerifier getHostnameVerifier() { 
        return new HostnameVerifier() { 
         @Override 
         public boolean verify(String hostname, SSLSession session) {    
          HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); 
          return hv.verify(".vk.com", session); 
         } 
        }; 
    } 
    

    然後

    OkHttpClient client = new OkHttpClient.Builder()   
         .hostnameVerifier(getHostnameVerifier()) 
         .build(); 
    
    +0

    其實,如果它不知道什麼網站的域名,我該怎麼做?該程序是根據用戶的要求監控網站,域名不僅是「www.vk.com」,還有其他網站,怎麼能一起忽略它們? –

    +0

    當然,我知道如果總是返回true,那將是安全問題,解決它的另一種方法,還有其他解決方案嗎? –

    +0

    無條件地返回true,呃哦,不好的托馬斯不,這是baaaaad風格.... – thst