自定义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配方,确保构建时启用系统证书支持:
这样构建出来的QtWebEngine会默认加载系统证书存储中的证书。DEPENDS += "ca-certificates" EXTRA_QMAKEVARS_PRE += "WEBENGINE_CONFIG+=use_system_certs"
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
相关产品推荐
相关产品推荐

