Phonegap Android应用程序ajax对HTTPS的请求失败,状态为0

Ern*_*ons 14 ajax https cordova

来自Android上的PhoneGap/Cordova应用程序的Ajax HTTPS请求莫名其妙地失败,状态= 0.它仅在使用发布密钥(即从ADT导出)对应用程序进行签名时出现,但在使用调试密钥签名(直接在模拟器或电话中运行)时不会出现.

request = new XMLHttpRequest()
request.open "GET", "https://some.domain/", true
request.onreadystatechange = ->
  console.log "** state = " + request.readyState
  if request.readyState is 4
      console.log "** status = " + request.status

request.send()
Run Code Online (Sandbox Code Playgroud)

总是输出

** state = 4
** status = 0
Run Code Online (Sandbox Code Playgroud)

如果我从Play商店或adb实用程序安装应用程序并不重要.我认为它可以与证书连接,因为并非所有HTTPS域都以这种方式失败.

Sol*_*ran 13

我遇到了同样的问题,但我的解决方案有点不同.

  1. 仅在我的Cordova应用程序的Android App版本中,通过HTTPS调用我的服务器的AJAX被阻止.不在iOS中,不在桌面浏览器中.最令人困惑的是,在实际的Android浏览器中,HTTPS AJAX调用没有问题.

  2. 我确认我可以对众所周知且受信任的URL(例如https://google.com)进行HTTPS AJAX调用,以及对我尝试过的任何URL进行常规HTTP调用.

  3. 这让我相信我的SSL证书要么没有100%正确安装,要么PositveSSL的廉价(〜$ 10美元)证书不是普遍信任的,或两者兼而有之.

  4. 我的证书已安装在我的AWS Load Balancer上,因此我查看了我可能如何搞砸了这一点,以及PositiveSSL如何在可信度方面不是最好的证书.Lucky me发现了一篇涵盖AWS ELB安装证书的文章,他们碰巧使用的是PositiveSSL证书!包含在内的是这个小宝石:

"......不要被AWS对话框欺骗,当您的ELB直接与浏览器交谈时,证书链不是真正可选的......"

http://www.nczonline.net/blog/2012/08/15/setting-up-ssl-on-an-amazon-elastic-load-balancer/

击鼓....

我重新安装了带有"可选"证书链信息的证书,并且对我的服务器的HTTPS AJAX调用开始工作了.

因此,在证书信任方面,Android Webview似乎比Android浏览器更保守.这并不完全直观,因为它们应该基本上是相同的技术.


Ern*_*ons 6

当请求的URL以错误或自签名证书响应时,就会发生这种情况.在测试或发布应用程序的朋友,设置<application android:debuggable="true"...>在AndroidManifest.xml是不够的-它会自动绕过证书错误.

但Google Play商店不接受带有的APK android:debuggable="true".首先,证书当然需要修复.但是当发生这种情况时,这里是PhoneGap/Cordova 3的解决方法:

  1. 在您的应用包中创建一个子类CordovaWebViewClient:

    public class SSLAcceptingCordovaWebViewClient extends CordovaWebViewClient {
        public SSLAcceptingCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
            super(cordova, view);
        }
    
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 同样的IceCreamCordovaWebViewClient:

    public class SSLAcceptingIceCreamCordovaWebViewClient extends IceCreamCordovaWebViewClient {
        public SSLAcceptingIceCreamCordovaWebViewClient(CordovaInterface cordova, CordovaWebView view) {
            super(cordova, view);
        }
    
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在<Your App Name>.java添加替代为makeWebViewClient:

    @Override
    protected CordovaWebViewClient makeWebViewClient(CordovaWebView webView) {
        if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
            return new SSLAcceptingCordovaWebViewClient(this, webView);
        } else {
            return new SSLAcceptingIceCreamCordovaWebViewClient(this, webView);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

Etvoilà!SSL错误将被忽略.但是,永远不要使用错误的证书.尝试先修复它们,只有在用完其他解决方案时才使用这个脏的解决方法.