将客户端证书插入 HTTPS POST 请求

Inserting client certificates into an HTTPS POST request

我正在构建连接到 AWS IOT 平台的硬件设备。根据文档,aws iot 平台的身份验证是使用 TLS 完成的。我在授权访问的设备上有根 CA、客户端密钥和客户端证书文件。有没有办法在发出 POST 请求时在 HTTP header 中使用这些文件?如果是这样,如何?到目前为止,这里是 Energia IDE(基于 Arduino IDE)和使用 WiFiClient 方法的代码。

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 客户端证书将 sent/used 作为您 client.sslConnect() 调用的一部分, 而不是 作为 HTTP 请求的一部分。 TLS 握手(以及 exchange/validation 客户端和服务器证书)发生在发送任何 HTTP 消息之前。

This AWS forums post 建议您可能需要使用端口 8443( 而不是 端口 443)作为影子 API。貌似use/requirement的TLS相互认证(通过证书),使用AWS SIGv4headers,是由AWS IOT根据使用的端口决定的.

希望对您有所帮助!