Ionic构建--发布android apk时HTTPS被阻止。

9

调试apk正常运行,排除了通常的嫌疑,但是当我构建、签名、安装发布版本时,angular无法进行https $http API调用(对于相同端点的http调用,我在调试期间已经允许)。

安装了cordova白名单 ionic plugin add cordova-plugin-whitelist

manifest.xml包含正确的指令。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Ionic 的 config.xml 包含了正确的指令。

  <access origin="*"/>
  <allow-navigation href="*" />

我的index.html声明了一个宽松的内容安全策略:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

我还使用了两个不同的在线SSL检查器来检查我的中间证书链--它们都没问题。

我完全被难住了。有什么建议吗?

2个回答

6
重新申请SSL证书时要特别注意包含中间证书。
尽管https://cryptoreport.websecurity.symantec.com/checker/和其他三个SSL检查器显示我的SSL证书没有问题,为了安全起见,我重置并配置了AWS弹性负载均衡器的SSL设置,确保我已经包含了(虽然是可选的,但不可忽略的)中间证书,之后问题就解决了。

我们遇到了类似的问题(在某些安卓设备上出现,而在其他设备上则没有,这让人感到困惑)。我发现 SSL 检查器 抱怨证书链(作为唯一的 SSL 检查器),而 openssl s_client -showcerts -connect yourhost.com:443 显示证书链实际上是存在的,但打印出 Verify return code: 19 (self signed certificate in certificate chain) - jakub.g
@jakub.g 我也遇到了同样的问题,解决方法是给我的CA客服发送邮件,他们提供了正确的根证书和中间证书。COMODO在他们的网站上有多个根证书,我只是使用了错误的一个。 - chrispytoes
在我们的情况下,问题最终被证明是Chromium中的一个错误 - 最后我们从Symantec证书切换到Comodo证书,并解决了这个问题。 - jakub.g
非常感谢你!你救了我的一天。我已经陷入困境两天了。非常感谢你... - Shikhar S

1
Modify this function in SystemWebViewClient.java found in 

平台\安卓\Cordova库\源代码\org\apache\cordova

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
  final String packageName = this.cordova.getActivity().getPackageName();
  final PackageManager pm = this.cordova.getActivity().getPackageManager();

  ApplicationInfo appInfo;
  try {
    appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
    if ((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
      // debug = true
      handler.proceed();
      return;
    } else {
      // debug = false
      // THIS IS WHAT YOU NEED TO CHANGE:
      // 1. COMMENT THIS LINE
      // super.onReceivedSslError(view, handler, error);
      // 2. ADD THESE TWO LINES
      // ---->
      handler.proceed();
      return;
      // <----
    }
  } catch (NameNotFoundException e) {
    // When it doubt, lock it out!
    super.onReceivedSslError(view, handler, error);
  }
}

这将忽略第三方签名的自生成证书上出现的任何SSL错误。 详细阅读此处

1
这不是一个真正的解决方案,而更像是一个解决问题的权宜之计。正如链接所述,您不应在生产应用程序中使用此方法。 - Justin Loveless
如果第三方签名的自动生成证书发生SSL错误,这将被忽略。我已经说明了原因。如果SSL不是自签名的,则不会出现任何错误。 - manish kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接