我的Android项目使用API 15。我正在使用HttpsURLConnection类通过https连接到服务器。在WiFi上一切都正常,但如果我关闭WiFi并使用3G运行,则会出现以下问题:
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)
如果我做错了什么,为什么它可以在WiFi上运行?
这里有更多的信息。
如果我使用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上工作,但这绝对不是我的首选选项。