0
我正在构建一个连接到AWS IOT平台的硬件设备。根据文档,aws iot平台的身份验证使用TLS完成。我拥有授权访问的设备上的根CA,客户端密钥和客户端证书文件。在发出POST请求时,有没有办法在HTTP标头中使用这些文件?如果是这样,怎么样?到目前为止,这里是Energia IDE(基于Arduino IDE)和使用WiFiClient方法的代码。将客户端证书插入HTTPS POST请求
if (client.sslConnect(aws_endpoint, 443))
{
Serial.println("\nConnected to AWS endpoint");
String PostData = "{\"value1\" : \"testValue\", \"value2\" : \"Hello\", \"value3\" : \"World!\" }";
request = "POST /things/";
request += thingname;
request += "/shadow";
request += " HTTP/1.1";
Serial.print("Request:\t"); Serial.println(request);
Serial.print("Post data:\t"); Serial.println(PostData);
client.println(request);
client.println("Host: ");
client.println(aws_endpoint);
client.println(":443");
client.println("User-Agent: Energia/1.1");
client.println("Connection: close");
client.println("Content-Type: application/json");
client.print("Content-Length: "); client.println(PostData.length());
client.println();
client.println(PostData);
client.println();
}
else
{
Serial.println("Connection failed");
}
Serial.println();
Serial.println("Server response:");
Serial.println();
// Capture response from the server. (10 second timeout)
long timeOut = 5000;
long lastTime = millis();
while((millis()-lastTime) < timeOut)
{ // Wait for incoming response from server
while (client.available())
{ // Characters incoming from the server
char c = client.read(); // Read characters
Serial.write(c);
}
}
然而,这给出了一个身份验证错误:
HTTP/1.1 403 Forbidden
content-type: application/json
content-length: 91
date: Tue, 26 Jul 2016 11:46:59 GMT
x-amzn-RequestId: 4d5388a9-e3c4-460a-b674-c3f971f3330d
connection: Keep-Alive
x-amzn-ErrorType: ForbiddenException:
{"message":"Missing Authentication Token","traceId":"4d5388a9-e3c4-460a-b674-c3f971f3330d"}
TLS客户端证书将作为您的client.sslConnect()调用的一部分发送/使用,而不是作为HTTP请求的一部分。 TLS握手(以及客户端和服务器证书的交换/验证)在任何HTTP消息发送之前发生。 – Castaglia
现在我想起来了,我想这就是为什么连接成功的原因。那么什么是“缺少身份验证令牌”错误?我该如何解决这个问题? – hpb
好问题。 [此AWS论坛帖子](https://forums.aws.amazon.com/thread.jspa?threadID=221078)表明您可能需要为shadow API使用端口8443(不是端口443)。我还建议你仔细检查你的'client.println()'函数是否将CRLF(不仅仅是LF)附加到字符串的末尾(因为HTTP需要CRLF行结束符)。 – Castaglia