2017-08-30 288 views
0

我在我的Android應用中使用Google's HTTP Client for Java。在我們進行質量檢查測試時,我的服務器暫時使用自簽名證書。我們將有一個正確簽名的證書當我們發佈,但現在我只需要忽略...用於Java的Google Http客戶端:忽略java.security.cert.CertPathValidatorException:未找到認證路徑的信任錨點

CertPathValidatorException: Trust anchor for certification path not found. 

...錯誤信息,告訴API來繼續處理HTTP請求/響應。

我無法在Google的文檔中找到任何可禁用此檢查的地方。我發現了其他apis的幾個StackOverflow帖子,但沒有發現Google HTTP客戶端。任何幫助?

import com.google.api.client.http.GenericUrl; 
import com.google.api.client.http.HttpRequest; 
import com.google.api.client.http.HttpRequestFactory; 
import com.google.api.client.http.HttpRequestInitializer; 
import com.google.api.client.http.HttpResponse; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.UrlEncodedContent; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.JsonObjectParser; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.client.util.Maps; 
import com.google.api.client.util.escape.CharEscapers; 

...

static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
HttpRequestFactory requestFactory = 
       HTTP_TRANSPORT.createRequestFactory(new HttpRequestInitializer() { 
        @Override 
        public void initialize(HttpRequest request) { 
         request.setParser(new JsonObjectParser(JSON_FACTORY)); 
         request.setConnectTimeout(defaultTimeoutSeconds()*1000); 
         request.setReadTimeout(defaultTimeoutSeconds()*1000); 
        } 
       }); 
+0

什麼是「Google的Java客戶端」?你的意思是Android SDK中的「HttpClient」API(並且已經停用了一段時間)?你的意思是提供一個更新版本的Apache HttpClient類的獨立庫嗎?你的意思是別的嗎?無論如何,在Android 7.0+上,您可以使用網絡安全配置向Android教授您的自簽名證書:https://developer.android.com/training/articles/security-config.html – CommonsWare

+0

我使用的是com.google .api.client.http。*位於https://developers.google.com/api-client-library/java/ –

+0

我的QA測試人員將測試Android 5.0+,因此我無法使用7.0+的解決方案,但我一定會通讀這篇文章來了解未來的知識! –

回答

0

我花了一些時間的javadoc,谷歌的HttpTransport爬行,發現我的答案是間接的。

Google提供了兩種HttpTransport實現:NetHttpTransport和ApacheHttpTransport。前者使用Java的基本HttpURLConnection來完成所有的通信,並且是首選。後者在封面下使用Apache httpclient,如果您需要基本NetHttpTransport中未提供的高級配置參數,則Google HttpTransport文檔會說使用Apache。

而不是我的初始化運輸常數是這樣的:

static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 

我使用ApacheHttpTransport生成器賦予可以選擇跳過證書驗證。

... new ApacheHttpTransport.Builder().doNotValidateCertificate().build(); 

注:對於任何人來到這個答案後,這是一個壞主意。我只在受控的質量保證環境和短時間內完成這項工作,同時獲得我們正確簽署的SSL證書。一旦我們的簽名證書到位,那麼我將回到上面的原始代碼,並要求我的應用程序的所有API通信都有一個正確簽名的證書。

請勿在生產代碼中進行操作。 :)

相關問題