2016-07-26 4 views
0

Je crée un périphérique matériel qui se connecte à la plate-forme AWS IOT. Selon la documentation, l'authentification avec la plate-forme aws iot est faite avec TLS. J'ai l'autorité racine, la clé de client et les fichiers de certificat de client sur l'appareil qui autorisent l'accès. Est-il un moyen d'utiliser ces fichiers dans l'en-tête HTTP lors de la demande POST? Si c'est le cas, comment? Jusqu'à présent, voici le code pour l'IDE Energia (basé sur l'IDE Arduino) et en utilisant les méthodes WiFiClient.Insertion de certificats clients dans une requête POST HTTPS

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); 
    } 
} 

Cela donne cependant une erreur d'authentification:

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

Les certificats clients TLS seraient envoyés/utilisés dans le cadre de votre appel 'client.sslConnect()', et non dans le cadre de la requête HTTP. La prise de contact TLS (et l'échange/validation des certificats client et serveur) se produit _avant_ tout message HTTP est envoyé. – Castaglia

+0

Maintenant que j'y pense, je suppose que c'est la raison pour laquelle la connexion est réussie en premier lieu. Alors quoi est l'erreur "Missing Authentication Token"? et comment puis-je résoudre ce problème? – hpb

+1

Bonne question. [Ce message sur les forums AWS] (https://forums.aws.amazon.com/thread.jspa?threadID=221078) suggère que vous devrez peut-être utiliser le port 8443 (pas le port 443) pour l'API shadow. Je vous suggère également de vérifier que votre fonction 'client.println()' ajoute CRLF, pas seulement LF, à la fin des chaînes (car HTTP nécessite des terminaisons de ligne CRLF.) – Castaglia

Répondre

1

Les certificats client TLS seraient envoyés/utilisés dans le cadre de votre client.sslConnect() appel, pas dans le cadre de la requête HTTP. La prise de contact TLS (et l'échange/validation des certificats client et serveur) a lieu avant l'envoi de tout message HTTP.

This AWS forums post indique que vous devrez peut-être utiliser le port 8443 (et non le port 443), pour l'API shadow. Il semble que l'utilisation/l'exigence de l'authentification mutuelle TLS (via des certificats), par rapport à l'utilisation des en-têtes AWS SIGv4, est déterminée par AWS IOT en fonction du port utilisé.

Espérons que cela aide!