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

问题描述 投票:0回答:4

我对科尔多瓦有非常困难且完全无法用谷歌搜索的问题。

一个程序,在

--debug
模式下编译时工作得很好,在
--release
模式下编译后就停止工作。 我确保来源是相同的,并且效果是恒定的。

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

这个问题的范围非常狭窄,在我的例子中是下面一行:

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

我的一个朋友报告了该行中出现相同的错误:

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

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

android cordova ssl release
4个回答
18
投票

问题

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

  1. 我的 Thawte SSL 证书(尽管价格昂贵)未被 Android 5.1.1 识别为有效证书(同时被所有桌面浏览器识别)

  2. --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;

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


6
投票

问题

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

    添加到服务器。

    
    

  3. 解决了任何 ssl 协议的问题,
https

wss
    


1
投票

您可以通过

https://www.sslshopper.com/ssl-checker.html#hostname=

检查该网站


0
投票
adb logcat

调试 SystemWebViewClient.java 类帮助我解决了问题。有一些标准 SSL 错误,如下所示:

https://developer.android.com/reference/android/net/http/SslError。
就我而言,我最终发现颁发 CA(Let's Encrypt)在 7 之前的 Android 版本上不再受信任。

© www.soinside.com 2019 - 2024. All rights reserved.