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

基于Qt的本地WebSocket转WSS遇证书验证失败问题求助

解决Qt WebSocket在Safari/iOS上的自签证书验证问题

一、浏览器对自签证书的态度

Safari和iOS设备依然支持自签证书,但必须手动将证书加入系统信任列表,这是硬性要求。不同于Chrome可通过高级选项临时跳过验证,Safari需要将证书导入Mac系统钥匙串并设置为「始终信任」;iOS则需先在设置中安装证书,再到「通用-关于本机-证书信任设置」里开启信任开关,否则会直接拒绝连接。

二、自签证书生成的常见错误排查

按Let's Encrypt指南生成证书仍验证失败,大概率是证书不符合现代浏览器的要求,重点检查以下几点:

  • 必须包含Subject Alternative Name(SAN):仅设置Common Name(CN=localhost)已不被支持,证书扩展里必须明确添加DNS:localhost作为SAN字段。
  • 密钥长度与签名算法:密钥至少2048位(推荐4096位),签名算法需用SHA-256及以上,避免被标记为不安全。
  • 证书用途:生成时需指定extendedKeyUsage = serverAuth,明确这是服务器证书,而非客户端证书。

给个可直接用的OpenSSL生成命令:

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj "/CN=localhost" -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

三、Qt服务器端的配置注意事项

使用SSLEchoServer示例时,需确保:

  • 证书与密钥文件路径正确,Qt进程有读取权限(尤其macOS/iOS沙盒环境下,需将证书添加到项目资源或设置正确的文件访问权限)。
  • SSL配置需正确加载证书和私钥,示例代码参考:
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
QSslCertificate cert = QSslCertificate::fromPath("localhost.crt").first();
QSslKey key = QSslKey::fromPath("localhost.key", QSsl::Rsa);
sslConfig.setLocalCertificate(cert);
sslConfig.setPrivateKey(key);
server->setSslConfiguration(sslConfig);
  • 优先使用系统自带的SSL后端(macOS用Security.framework、iOS用SecureTransport),避免使用自定义编译的OpenSSL库,减少兼容性问题。

四、替代方案

如果不想处理手动信任证书的繁琐流程,可尝试以下方式:

  • 内网穿透工具:用ngrok之类的工具将本地50050端口映射到带正规HTTPS证书的公网地址,Safari/iOS会自动信任公网证书,适合开发测试场景(注意数据会经过第三方服务器)。
  • 开发者模式临时关闭验证:iOS设备进入「设置-Safari浏览器-高级-开发者」,开启「禁用证书验证」;Mac Safari可在「开发」菜单中勾选「忽略SSL错误」,仅适合开发阶段使用,正式环境禁用。
  • 使用mkcert工具:专门生成本地信任的自签证书,会自动将证书导入系统信任存储,无需手动操作。生成命令简单:mkcert localhost,比手动写OpenSSL命令更可靠。

内容的提问来源于stack exchange,提问作者Alexander Carôt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:05:30