在443以外的端口上使用SSL时遇到400错误请求?

时间:2013-10-26 02:13:18

标签: android

我在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

由于

2 个答案:

答案 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();
    }
}