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

iOS Xcode9.0 Swift4.0下MQTT证书认证连接异常求助

问题根源分析

你的代码里有两个关键设置直接绕过了系统的证书信任校验,这就是为什么删除证书后依然能成功连接的核心原因:

  • allowUntrustCACertificate = true:这个参数会让CocoaMQTT跳过系统层面的证书信任检查——无论服务器证书是否被系统信任,客户端都会直接接受它。
  • didReceive trust回调直接返回completionHandler(true):这个自定义验证方法里,你没有做任何实际的证书合法性校验,直接告诉客户端“信任该证书”,等于完全跳过了验证环节。

解决方案:修复证书校验逻辑

要实现「安装证书可连接,删除证书则连接失败」的预期效果,需要修改两处代码,让客户端严格遵循系统的证书信任机制:

1. 禁用allowUntrustCACertificate

在SSL配置部分,把allowUntrustCACertificate设为false,让客户端依赖系统的证书信任规则:

if useSSL == true{
    mqtt!.enableSSL = true
    mqtt!.allowUntrustCACertificate = false // 改为false,启用系统证书校验
}

2. 实现真实的证书验证逻辑

在didReceive trust回调里,使用系统的SecTrustEvaluateWithErrorAPI来验证证书是否被系统信任,替代直接返回true的偷懒写法:

func mqtt(_ mqtt: CocoaMQTT, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) {
    TRACE("trust: \(trust)")
    // 调用系统API验证证书合法性
    var error: CFError?
    let isValid = SecTrustEvaluateWithError(trust, &error)
    
    if isValid {
        completionHandler(true)
        TRACE("证书验证通过,允许连接")
    } else {
        completionHandler(false)
        TRACE("证书验证失败,拒绝连接: \(error.debugDescription)")
    }
}

验证效果

修改完成后:

  • 安装mosquitto.org.crt证书到iPhone后,系统会信任test.mosquitto.org的证书,客户端能正常连接,调试信息会显示connected状态,符合「连接成功」的预期。
  • 删除证书后,系统不再信任该服务器的证书,客户端会在证书验证环节失败,触发mqttDidDisconnect回调并输出错误信息,符合「连接失败」的预期。

内容的提问来源于stack exchange,提问作者user llm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:17:15