我在Cedar堆栈上有一个Heroku应用程序,它有一个这样的URL:
https://my-app.herokuapp.com/
我正在使用搭载SSL,我没有自己的证书。但这样可以正常工作,我在浏览器中没有看到任何错误/警告。
现在我想让我的Android应用程序安全地连接到这个Heroku应用程序。我尝试的代码如下:
BasicHttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 4000);
HttpConnectionParams.setSoTimeout(httpParameters, 4000);
DefaultHttpClient client = new DefaultHttpClient(httpParameters);
HttpRequestBase httpRequest = new HttpGet("https://my-app.herokuapp.com/api/player");
client.execute(httpRequest);
但这不起作用。我没有看到任何警告,错误或异常,但它只是不通过HTTPS连接而是HTTP。
我做错了什么?
我必须使用其他任何子类吗?我认为只提供HTTPS URL就足够了,我在互联网上发现的一些帖子似乎验证了这一点。
我已经找到了关于使用SSL / TLS here,here和here的HttpClient的答案,但它们并没有真正帮助我。除了我不知道该怎么做之外,我不确定这些答案是否会影响我,因为我没有看到任何暗示证书问题的例外情况。
答案 0 :(得分:0)
你可以试试这个:
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient defaultclient = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
cm = new ThreadSafeClientConnManager(defaultclient.getParams(), registry);
client = new DefaultHttpClient(cm, defaultclient.getParams());
// Set verifier
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
post = new HttpPost("https://my-app.herokuapp.com/api/player");