我在9443端口有一台服务器。它正在使用godaddy为“example.com”签名的ssl证书。我尝试连接到以下网址:
https://example.com:9443/api/v1/foo
从我编写的ios应用程序和桌面浏览器中运行良好。如果我尝试从Android手机连接,我收到400错误的请求响应。我尝试通过Chrome为Android做同样的事情,它给了我:
ERR_TUNNEL_CONNECTION_FAILED
服务器也在使用自签名证书监听端口443,并且android客户端在那里工作正常(我需要一些额外的代码才能让我的应用程序信任自签名证书)。
android中有哪些限制,https必须使用端口443?我在想,因为我使用的是合法的ssl证书,所以我不需要任何自定义代码来强制应用程序信任该证书。我的连接代码:
HttpParams params = new BasicHttpParams();
DefaultHttpClient client = new DefaultHttpClient(params);
HttpResponse response = client.execute(request);
Result result = new Result(response.getStatusLine().getStatusCode());
response.getStatusLine().getStatusCode(); // 400
response.getStatusLine().toString(); // HTTP/1.1 400 Bad Request
由于
答案 0 :(得分:1)
我认为有两种可能性。
搜索ERR_TUNNEL_CONNECTION_FAILED android
会引导我this page,作者声称:
Android因某些未知原因不允许您使用不标准 SSL端口(即只有端口443在使用https时才能工作)
我通过使用我的妻子在端口2000上尝试使用SSL网站来证实这一点 在AT& T上的iphone。果然它工作得很好。所以它不是AT& T.也 值得指出它在wifi上工作正常。
希望这只是一个错误,将来会修复。
但是,this site声称通过代理访问网站时发生错误。您可能在Android手机上配置了一个代理,它正试图以某种方式使用。
告诉您所在的世界最简单的方法是从其他Android手机上查看,如果有的话。
答案 1 :(得分:0)
它可能对你有帮助
public HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(
params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
}