2012-08-04 85 views
7

我的android項目正在使用api 15.我通過https使用HttpsURLConnection類連接到服務器。一切都運行得很好通過WiFi,但如果我關閉WiFi和運行在3G我得到如下:當使用3g以上時,找不到證書路徑的信任錨,但在WiFi上工作正常

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:413) 
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)  at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477) 
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432) 
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)  at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280) 

如果我做錯了什麼,爲什麼會工作在無線網絡?

這裏有更多的信息。

如果我使用OpenSSL查看服務器證書信息,

echo | openssl s_client -connect myserver.com:443 

返回一個服務器級別的自簽名的證書,而

echo | openssl s_client -connect myserver.com:443 -servername myserver.com 

返回「正確」的證書。我在我的服務器上有多個虛擬主機,每個都有自己的rapidssl頒發的證書,所以我認爲這意味着我需要使用支持TLS的客戶端。至少這是我的我在Apache日誌看啓動時的消息的解釋:

Name-based SSL virtual hosts only work for clients with TLS server name indication support 

如果我是正確的,到目前爲止,這是否意味着我的移動3G網絡可以與TLS來擰緊或者是有別的東西我應該這樣做?

可以通過繼承DefaultHttpClient並導入包含服務器自簽名證書的密鑰庫,但絕對不是我的首選選項,從而使事情在3G上工作。

+0

什麼是服務器的URL? – jww 2014-08-13 08:49:40

回答

0

添加-servername選項只需設置Server Name Indication字段在Client Hello消息,這有助於我們選擇正確的證書,如果目標主機包含很多,就像在你的情況。但是,這與問題無關。

在SSL握手期間,證書以主題/發行者對形式交付,形成證書鏈。

I.e. google.com證書鏈看起來像這樣:

openssl s_client -connect google.com:443 
CONNECTED(00000003) 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify error:num=20:unable to get local issuer certificate 
verify return:0 
--- 
Certificate chain 
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com 
    i:/C=US/O=Google Inc/CN=Google Internet Authority G2 
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2 
    i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
    i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
--- 

一旦接收到,客戶端嘗試驗證在鏈中的所有發行者從底部到頂部(根)。如果客戶端無法驗證根證書,則會顯示Trust anchor for certification path not found消息。

因此,回到WiFi/3G問題,可能您的移動網絡的DNS無法解析您的證書鏈中的其中一箇中間發行人的地址。

UPDATE:

你可以把你的發行者的證書到您的APK,並通過TrustManager添加到代碼中。這種方法可能會克服接入網絡限制(如果有的話)。

+0

DNS與證書驗證有什麼關係? – EJP 2015-08-27 23:41:11

+0

如果其中一箇中間證書在設備CA密鑰庫中缺失,它可以通過哪種協議找到授權?此外,請檢查此答案:http://stackoverflow.com/questions/19220687/is-domain-name-of-the-server-checked-during-ssl-handshake – 2015-08-29 18:38:53

相關問題