使用预签名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
相关产品推荐
相关产品推荐

