2014-02-12 48 views
0

我已经得到了雪松堆栈上的Heroku的应用程序,其中有这样的URL:如何让Android应用通过HTTPS连接到Heroku应用?

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网址就足够了,我在互联网上发现的一些帖子似乎证实了这一点。

我用SSL/TLS找到了有关HttpClient的答案here,herehere,但它们并没有真正帮助我。除了我不完全知道该怎么做的事实之外,我不确定这些答案是否会影响我,因为我没有看到任何会提示证书问题的例外情况。

+0

这一直没有重复。我已经明确地从Stack Overflow中引用了三个类似的问题,这些问题没有涵盖相同的问题,因为我没有使用无效证书,并且想要压制警告,就像其他问题讨论的那样。 – caw

+0

问题是我用'Base64.DEFAULT'在HTTP头中使用了base64编码的数据。事实证明,我不得不使用'Base64.NO_WRAP'为了不破坏请求。出于这个原因,Heroku停止返回值为“https”的“X-Forwarded-Proto”头。 – caw

回答

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"); 
+0

+1在主机名验证者。 – jww

+0

谢谢,但这只是一个肮脏的黑客攻击,它会让你的应用程序变得脆弱,不是吗? (MITM等) – caw

相关问题