cordova"release"与SSL的"debug"行为不同

Eug*_*rov 14 ssl android release cordova

我对cordova有一个非常困难且完全不可解决的问题.

完全以--debug模式编译的程序在模式编译后停止工作--release.我确保源是相同的,效果是恒定的.

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

这个问题本地化非常狭窄,在我的例子中它是以下行:

Socket = new WebSocket('wss://376.su/');
Run Code Online (Sandbox Code Playgroud)

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

<img src="https://blabla" />;
Run Code Online (Sandbox Code Playgroud)

UPD:问题解决了,看看答案.

Eug*_*rov 16

问题

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

  1. 来自Thawte的我的SSL证书(尽管其成本)不被Android 5.1.1识别为有效的(同时被所有桌面浏览器识别)

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

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

platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java
Run Code Online (Sandbox Code Playgroud)

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

(appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0
Run Code Online (Sandbox Code Playgroud)

这是什么使--debug--release不同.为了忽略证书"错误",应执行以下代码:

handler.proceed();
return;
Run Code Online (Sandbox Code Playgroud)

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


Ign*_*ago 5

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

一种可能的解决方案是利用信任层次结构

  1. 将您的证书与授权机构的证书联系起来。

    这样,您将首先发送CA的证书,以确保设备域证书之前信任您的CA。

    如果您有分开的证书,则此shell命令可以解决问题:

    $ cat authority1.cert authority2.cert authority3.cert your_domain.cert >> your_domain_bundle.cert
    
    Run Code Online (Sandbox Code Playgroud)

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

    $ cat authority.ca-bundle your_domain.cert >> your_domain_bundle.cert
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将其添加your_domain_bundle.cert到服务器。

https和解决的问题wss

  • 您能解释一下忽略证书的有效性比验证证书颁发机构更好吗?我想了解为什么我错了。 (2认同)