繁体   English   中英

关于 SSL,cordova“发布”的行为与“调试”不同

[英]cordova "release" behaves differently to "debug" regarding SSL

我对cordova有非常困难且完全无法搜索的问题。

--debug模式下完美编译的程序在--release模式下编译后停止工作。 我确保来源是相同的,并且效果是恒定的。

--debug build 和--release build 之间的唯一区别是--release build 无法打开任何 SSL 连接

这个问题的范围很窄,就我而言,它是以下几行:

Socket = new WebSocket('wss://376.su/');

我的一个朋友在行中报告了同样的错误:

<img src="https://blabla" />;

UPD:问题已解决,请参阅答案。

问题

我已经确定了问题的确切根源,并且找到了完美的解决方案。 结果证明这是两个独立问题的叠加,每个问题都具有严重的误导性:

  1. 我从 Thawte 获得的 SSL 证书(尽管成本很高)未被 Android 5.1.1 识别为有效证书(同时被所有桌面浏览器识别)

  2. cordova build--debug标志只是忽略证书“错误”(静默)。

解决方案

转到您的项目目录并找到以下文件:

platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java

找到方法定义 ( onReceivedSslError ) 和以下条件:

(appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0

这就是--debug--release不同之处。 为了忽略证书“错误”,应执行以下代码:

handler.proceed();
return;

该文件在构建过程中一直存在。 下次向项目添加平台时,不要忘记忽略这些准错误。

问题

Android 无法识别该证书的证书颁发机构 (CA)。 这是一个常见问题,特别是对于较旧的设备,每次出现新 CA 时都会影响每个设备。

解决方案

A. 配置中间证书。

寻找适合您平台的详细设置。 这里有些例子:

你可以在 StackExchange's Unix 的这个问答中阅读更多关于它的信息

B. 使用信任层次链接证书。

利用信任层次结构功能,您可以链接证书。

您可以使用以下工具来利用这项工作: https : //whatsmychaincert.com/

或者您可以自己完成,因为它只是文本文件(证书)的串联:

Linux / macOS 的示例步骤

  1. 将权威的证书与您的证书连接起来。 这样,您将首先发送您的 CA 证书,以确保设备您的域证书之前信任您的 CA。

    如果你有单独的证书,这个 shell 命令可以解决问题:

     $ cat authority1.cert authority2.cert authority3.cert your_domain.cert >> your_domain_bundle.cert

    或者,如果您有一个ca-bundle文件,即证书的串联,只需运行:

     $ cat authority.ca-bundle your_domain.cert >> your_domain_bundle.cert
  2. your_domain_bundle.cert添加到服务器。

解决了任何 ssl 协议、 httpswss等的问题。

我有同样的问题,但主要来源不是代码 SystemWebViewClient.java。 你的帖子帮助我找到了确切的来源。 实际上,主要来源是您尝试访问的 https 站点缺少 Cordova 连接到安全站点所需的证书颁发机构 (CA)。 实际上,我正在使用基于 Ionic/Cordova 构建的 Siberian CMS。

您可以使用https://www.sslshopper.com/ssl-checker.html#hostname=检查该站点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM