2016-07-26 137 views
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"} 
+1

TLS客户端证书将作为您的client.sslConnect()调用的一部分发送/使用,而不是作为HTTP请求的一部分。 TLS握手(以及客户端和服务器证书的交换/验证)在任何HTTP消息发送之前发生。 – Castaglia

+0

现在我想起来了,我想这就是为什么连接成功的原因。那么什么是“缺少身份验证令牌”错误?我该如何解决这个问题? – hpb

+1

好问题。 [此AWS论坛帖子](https://forums.aws.amazon.com/thread.jspa?threadID=221078)表明您可能需要为shadow API使用端口8443(不是端口443)。我还建议你仔细检查你的'client.println()'函数是否将CRLF(不仅仅是LF)附加到字符串的末尾(因为HTTP需要CRLF行结束符)。 – Castaglia

回答

1

的TLS客户端证书将被送往/作为您client.sslConnect()调用的一部分,作为HTTP请求的一部分。 TLS握手(以及客户端和服务器证书的交换/验证)发生在任何HTTP消息发送之前。

This AWS forums post暗示您可能需要使用端口8443(而不是端口443),以用于影子API。它看起来像使用/要求TLS相互认证(通过证书),使用AWS SIGv4标头,由AWS IOT根据所用端口确定。

希望这会有所帮助!