You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Yocto(Rocko)镜像中QtWebEngine遇ERR_SSL_PROTOCOL_ERROR求助

解决Yocto Rocko镜像中QtWebEngine HTTPS访问SSL错误问题

结合你提到curl/wget访问正常的情况,问题确实仅与QtWebEngine(Chromium)的配置相关,下面逐个解答你的疑问:

1. 配置镜像让QtWebEngine访问已安装的证书

虽然你已经包含了ca-certificates配方,但QtWebEngine的Chromium引擎可能没有自动识别系统证书路径,需要手动配置:

  • 临时测试方案:在启动QML应用前设置环境变量,指定证书文件/目录:
    export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
    export SSL_CERT_DIR=/etc/ssl/certs/
    # 然后启动你的应用
    ./your-qml-app
    
  • 永久集成方案:在Yocto中添加qtwebengine_%.bbappend配方,确保构建时启用系统证书支持:
    DEPENDS += "ca-certificates"
    EXTRA_QMAKEVARS_PRE += "WEBENGINE_CONFIG+=use_system_certs"
    
    这样构建出来的QtWebEngine会默认加载系统证书存储中的证书。

2. 查看QtWebEngine可用的证书列表

QtWebEngine没有直接的命令行工具列出证书,但可以通过Chromium远程调试工具查看:

  • 启动应用时开启远程调试:
    QTWEBENGINE_REMOTE_DEBUGGING=9222 ./your-qml-app
    
  • 在同一局域网的电脑浏览器中访问 http://<设备IP>:9222,打开DevTools面板,切换到Security标签页:
    • 点击View Certificate可以查看当前网站的证书链
    • 查看Trusted Root Certificates部分,就能看到Chromium加载的所有信任根证书

3. 提高错误日志的Verbosity

通过环境变量开启Chromium和QtWebEngine的详细SSL日志:

  • 设置Chromium的日志参数,输出SSL握手的详细过程:
    QTWEBENGINE_CHROMIUM_FLAGS="--v=2 --ssl-log-level=3" ./your-qml-app
    
    • --v=2:开启Chromium的详细日志输出
    • --ssl-log-level=3:输出最详细的SSL调试信息,包括证书加载、验证步骤、握手失败的具体原因
  • 同时可以开启Qt网络模块的SSL日志作为补充:
    QT_LOGGING_RULES="qt.network.ssl.debug=true" ./your-qml-app
    

4. 其他需要注意的点

除了证书配置,还有几个常见的排查方向:

  • 系统时间正确性:SSL证书验证严格依赖系统时间,如果设备时间偏差较大(比如早于证书生效时间或晚于过期时间),会直接导致验证失败。用date命令检查时间,必要时配置NTP服务同步时间。
  • TLS协议版本兼容性:Rocko版本的QtWebEngine对应的Chromium可能默认禁用了TLS 1.0/1.1等旧协议,如果目标网站仅支持这些旧协议,需要添加启动参数:
    QTWEBENGINE_CHROMIUM_FLAGS="--ssl-version-min=tls1.0" ./your-qml-app
    
  • 依赖库完整性:确保镜像中包含了openssl配方,QtWebEngine的Chromium引擎需要依赖OpenSSL来处理SSL连接,缺失会导致握手失败。
  • 文件权限:如果应用以非root用户运行,要确保用户对/etc/ssl/certs/目录和ca-certificates.crt文件有读取权限(一般设置为目录755,文件644即可)。
  • SNI支持:部分网站依赖SNI(Server Name Indication)来返回正确证书,虽然Rocko版本的Chromium已支持SNI,但可以通过详细日志确认SNI请求是否正常发送。

补充:你的curl/wget验证输出

curl输出:

root@imx6dl:~# curl -v https://www.youtube.com -o output.html
* Rebuilt URL to: https://www.youtube.com/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 216.58.205.110...
* TCP_NODELAY set
* Connected to www.youtube.com (216.58.205.110) port 443 (#0)
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* found 148 certificates in /etc/ssl/certs/ca-certificates.crt
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_ECDSA_CHACHA20_POLY1305
* server certificate verification OK
* server certificate status verification SKIPPED
* common name: *.google.com (matched)
* server certificate expiration date OK
* server certificate activation date OK
* certificate public key: EC/ECDSA
* certificate version: #3
* subject: C=US,ST=California,L=Mountain View,O=Google LLC,CN=*.google.com
* start date: Tue, 24 Apr 2018 10:34:31 GMT
* expire date: Tue, 17 Jul 2018 09:27:00 GMT
* issuer: C=US,O=Google Trust Services,CN=Google Internet Authority G3
* compression: NULL
* ALPN, server accepted to use http/1.1
> GET / HTTP/1.1
> Host: www.youtube.com
> User-Agent: curl/7.54.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Strict-Transport-Security: max-age=31536000
< Expires: Tue, 27 Apr 1971 19:44:06 EST
< P3P: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=it for more info."
< X-XSS-Protection: 1; mode=block; report=https://www.google.com/appserve/security-bugs/log/youtube
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Cache-Control: no-cache
< Date: Wed, 16 May 2018 06:04:40 GMT
< Server: YouTube Frontend Proxy
< Set-Cookie: VISITOR_INFO1_LIVE=ZnHYI40gIu0; path=/; domain=.youtube.com; expires=Mon, 12-Nov-2018 06:04:40 GMT; httponly
< Set-Cookie: YSC=WB62WY8_qvg; path=/; domain=.youtube.com; httponly
< Set-Cookie: PREF=f1=50000000; path=/; domain=.youtube.com; expires=Mon, 14-Jan-2019 17:57:40 GMT
< Alt-Svc: hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35"
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [376 bytes data]
100 472k 0 472k 0 0 380k 0 --:--:-- 0:00:01 --:--:-- 380k
* Connection #0 to host www.youtube.com left intact
root@imx6dl:~#

wget输出:

root@imx6dl:~# wget -v https://www.youtube.com
--2018-05-16 06:26:57-- https://www.youtube.com/
Resolving www.youtube.com... 216.58.205.78, 216.58.205.110, 216.58.205.142, ...
Connecting to www.youtube.com|216.58.205.78|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html.3'

index.html.3 [ <=> ] 453.84K 702KB/s in 0.6s

2018-05-16 06:26:58 (702 KB/s) - 'index.html.3' saved [464732]
root@imx6dl:~#

内容的提问来源于stack exchange,提问作者Morix Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:45