开发一对一聊天App遇SSL/TLS报错:服务器要求但客户端未启用
问题诊断与修复方案
从你的日志和代码来看,问题根源非常清晰:你的ejabberd服务器强制要求使用SSL/TLS加密连接,但客户端代码里主动禁用了安全加密模式,导致连接被服务器拒绝。
关键问题点
- 日志里服务器明确返回了强制TLS的标识:
stream:features
</stream:features>
- 你的客户端配置里硬编码禁用了安全模式:
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
修复步骤
只需要修改客户端的安全模式配置,适配服务器的强制加密要求,有两种推荐方式:
方式一:强制启用TLS(最匹配服务器要求)
将安全模式改为required,客户端会自动发起TLS握手,符合服务器的强制加密规则:
// 替换原来的disabled配置 config.setSecurityMode(ConnectionConfiguration.SecurityMode.required)
方式二:自动协商模式(兼容更多场景)
如果未来服务器可能调整为可选加密,也可以设置为ifpossible,客户端会自动检测服务器是否要求加密并适配:
config.setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible)
额外注意事项(测试环境专属)
如果你的ejabberd使用的是自签名证书(测试环境常见),修改后可能会遇到证书验证失败的问题,你可以临时添加以下配置跳过证书验证(生产环境禁止使用):
// 临时跳过证书验证(仅测试用) config.setHostnameVerifier { _, _ -> true } config.setCustomSSLContext(SSLContext.getDefault())
另外,也可以考虑直接使用ejabberd的加密专用端口5223,修改客户端的端口配置即可:
config.setPort(5223)
修改完成后重新启动服务,应该就能正常建立加密连接并完成登录了。
内容的提问来源于stack exchange,提问作者Amit Ranjan
相关产品推荐
相关产品推荐

