我对科尔多瓦有非常困难且完全无法用谷歌搜索的问题。
一个程序,在
--debug
模式下编译时工作得很好,在--release
模式下编译后就停止工作。
我确保来源是相同的,并且效果是恒定的。
--debug
构建和--release
构建之间的唯一区别是--release
构建无法打开任何SSL连接。
这个问题的范围非常狭窄,在我的例子中是下面一行:
Socket = new WebSocket('wss://376.su/');
我的一个朋友报告了该行中出现相同的错误:
<img src="https://blabla" />;
UPD:问题已解决,请参阅答案。
我已经确定了问题的确切根源,并且找到了完美的解决方案。事实证明这是两个独立问题的叠加,每个问题都具有严重的误导性:
我的 Thawte SSL 证书(尽管价格昂贵)未被 Android 5.1.1 识别为有效证书(同时被所有桌面浏览器识别)
--debug
中的cordova build
标志只是忽略证书“错误”(默默地)。
转到您的项目目录并找到以下文件:
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 时都会影响每台设备。
查找适合您平台的详细设置。以下是一些示例:
Microsoft IIS 和 Exchange:https://knowledge.digicert.com/solution/SO16219.html
RedHat 上的 Apache(及相关):https://access.redhat.com/solutions/43575
您可以在StackExchange's Unix 的问答中阅读更多相关信息。
利用信任层次结构功能,您可以链接证书。
您可以使用以下工具来利用这一努力:https://whatsmychaincert.com/
或者您可以自己完成,因为它只是文本文件(证书)的串联:
将权威机构的证书与您的证书连接起来。 这样,您将首先发送您的 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
your_domain_bundle.cert
添加到服务器。
https
、
wss
等您可以通过
https://www.sslshopper.com/ssl-checker.html#hostname=