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

使用预签名URL的MQTT Websocket Java客户端连接AWS IoT Core时出现签名错误

使用预签名URL的MQTT Websocket Java客户端连接AWS IoT Core时出现签名错误

嘿,我刚碰到过一模一样的问题!你遇到的错误本质是代码配置和预签名URL的使用逻辑冲突了——你手里已经有了完全签名好的WebSocket URL,但你的代码还在试图让SDK自动生成签名,这就导致了“没有凭证就尝试签名HTTP请求”的报错。

先给你拆解下问题出在哪:

  • 你用了newMtlsBuilderFromPath(null, null):这个Builder是给MTLS证书认证用的,哪怕你开了withWebsockets(true),它还是会保留自动签名的逻辑。
  • 你还加了withWebsocketSigningRegion("eu-west-1"):这个配置是告诉SDK“帮我给WebSocket请求签名”,但你没传入任何凭证(前面的参数都传了null),自然就触发了报错。
  • 关键是:预签名URL本身已经包含了所有签名参数(X-Amz-Algorithm、X-Amz-Signature这些),根本不需要SDK再做任何签名操作!

给你调整好的正确代码:

// 改用newWebsocketBuilder,专门处理WebSocket连接,不需要MTLS证书
AwsIotMqttConnectionBuilder builder = AwsIotMqttConnectionBuilder.newWebsocketBuilder()
        .withWebsockets(true)
        .withEndpoint(connectionUrl) // 直接传入完整的预签名URL
        .withClientId(clientId)
        .withConnectionEventCallbacks(callbacks)
        // 移除withWebsocketSigningRegion,预签名URL已经包含所有签名信息
        // 不需要手动设置端口,SDK会从预签名URL的wss://...:443里自动解析
        ;

MqttClientConnection connection = builder.build();
CompletableFuture<Boolean> connected = connection.connect();
connected.get(); // 等待连接完成

再给你几个额外的注意点:

  • 确认你的预签名URL是有效的:检查X-Amz-Expires字段的时间有没有过期,区域是不是eu-west-1,生成URL时用的IoT Core endpoint有没有错。
  • 预签名URL要原样传入,不要做任何额外的URL编码,不然会导致签名验证失败。
  • 生成预签名URL的账号必须有iot:Connect权限,否则即使URL格式正确,连接时也会被AWS IoT Core拒绝。

这个问题我之前折腾了好几个小时,换了Builder之后马上就解决了,你试试应该就没问题了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:05:32