Débuté par gshunway, 27 déc. 2021 07:44 - 22 réponses
Posté le 27 décembre 2021 - 07:44
Bonjour, Nous venons vers la communauté pour votre aide sur un problème déjà identifié sur ce forum mais sans réponse. Nous basculons nos applications qui dialoguent avec AWS V2 vers SP-API de AMAZON. Obligation faite par l'obsolescence de AWS V2 qui arrive bientôt. Nous rencontrons un problème lors du Hash en HMAC_SHA_256 d'une chaine. La signature finale calculée par le code de test ci-dessous ne correspond pas à la signature attendue fournie par la Spec Amazon. Pour simplifier notre requête de test, nous utilisons les données de la spécification AMAZON que vous pouvez trouver aux adresses ci-dessous (voir code). Pour résumer : Nous avons une chaine de test. Nous avons la clé. Nous avons la signature attendue. Nous connaissons l'algo. Nous devons avec notre code retrouver la même signature Protocole de test : Utilisation de WINDEV 25 dans sa dernière mise à jour. Projet créé uniquement pour ce test en 32 et 64 bits Projet en ANSI PC sous Windows 11 (Non testé sur Windows 10 ou inférieur) Création d'une fenêtre simple avec un bouton et le code ci-dessous. Nous avons aussi testé la chaine, sa clé et son algo en ligne sur :https://fr.rakko.tools/tools/10/ La chaine retournée correspond à la chaine de notre code. Piste d'erreur : Mauvaise interprétation du caractère "\n" ou caract(10) dans la chaine de base en Hash de notre code. Le calcul de Amazon dans sa spec est peut être faux (nous avons envoyé une demande d'info à notre contact Amazon). La fonction Hash de Windev en défaut. Merci pour votre aide. Code : M_LF est une chaîne = Caract ( 10 ) Machaine est une chaîne = "AWS4-HMAC-SHA256" + M_LF... + "20150830T123600Z" + M_LF... + "20150830/us-east-1/iam/aws4_request" + M_LF... + "f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59" MaCle est une chaîne = "c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9" MBuff est un Buffer MBuff= HashChaîne ( HA_HMAC_SHA_256 , ChaîneVersUTF8 ( Machaine) , ChaîneVersUTF8 ( MaCle) ) MaSignature est une chaîne = Remplace ( Minuscule ( BufferVersHexa ( MBuff, 1 , 32 ) ) , " " , "" ) Trace ( MaSignature)
Posté le 27 décembre 2021 - 10:46
Bonjour, Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3 Bon courage, Franck R.PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne) sDateUTC est une chaîne sDateJour est une chaîne sSection est une chaîne sFinal est une chaîne sCanonic est une chaîne sTmp est une chaîne AWS_RC est une chaîne = Caract(10) sSignature est une chaîne sEnteteHTTP est une chaîne sAWS_REGION est une chaîne sAWS_PM_PAS est une chaîne sAWS_PM_LOG est une chaîne sAWS_PM_LOG = "votre login AWS" sAWS_PM_PAS = "votre mot de passe AWS" sAWS_REGION = "us-east-1" sDateUTC = interne_DateHeureVersISO8601() sDateJour = DateDuJour() sSection = "s3" // ou autre service "iam" sFinal = "aws4_request" SELON sReqType CAS "GET" // Requête de type GET sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("") CAS "PUT" // Requête de type PUT, POST, PATCH... sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-content-sha256:" + sHashSHA + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA AUTRE CAS FIN sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ... interne_CalculHashSha256(sCanonic, Faux) sSignature = interne_AWS4_SigDerivee("s3") sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature) SELON sReqType CAS "GET" // Chaine à transmettre dans l'entête sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature) CAS "PUT" sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + sHashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature) AUTRE CAS FIN RENVOYER sEnteteHTTP PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux) sSigningKey est une chaîne SI bIsFile = Vrai ALORS sSigningKey = HashFichier(HA_SHA_256, sData) SINON sSigningKey = HashChaîne(HA_SHA_256, sData) FIN RENVOYER interne_Hexa(sSigningKey) FIN PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "") sSign est une chaîne nInd est un entier nVal est un entier sSign = "" POUR nInd = 1 _À_ Taille(sData) nVal = Asc(sData[[nInd]]) sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin FIN RENVOYER sSign FIN PROCÉDURE INTERNE interne_DateHeureVersISO8601() // Conversion de l'heure locale en heure UTC dhDateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure) sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,... NumériqueVersChaîne(dhUTC..Année,"04d"),... NumériqueVersChaîne(dhUTC..Mois,"02d"),... NumériqueVersChaîne(dhUTC..Jour,"02d"),... NumériqueVersChaîne(dhUTC..Heure,"02d"),... NumériqueVersChaîne(dhUTC..Minute,"02d"),... NumériqueVersChaîne(dhUTC..Seconde,"02d"),... NumériqueVersChaîne(dhUTC..Milliseconde,"03d")) RENVOYER sDateHeureIso FIN PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne) sDateKey est une chaîne sDateRegionKey est une chaîne sDateRegionServiceKey est une chaîne sSigningKey est une chaîne sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS) sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey) sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey) sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey) RENVOYER sSigningKey FIN
Posté le 27 décembre 2021 - 10:46
Bonjour, Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3 Bon courage, Franck R.PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne) sDateUTC est une chaîne sDateJour est une chaîne sSection est une chaîne sFinal est une chaîne sCanonic est une chaîne sTmp est une chaîne AWS_RC est une chaîne = Caract(10) sSignature est une chaîne sEnteteHTTP est une chaîne sAWS_REGION est une chaîne sAWS_PM_PAS est une chaîne sAWS_PM_LOG est une chaîne sAWS_PM_LOG = "votre login AWS" sAWS_PM_PAS = "votre mot de passe AWS" sAWS_REGION = "us-east-1" sDateUTC = interne_DateHeureVersISO8601() sDateJour = DateDuJour() sSection = "s3" // ou autre service "iam" sFinal = "aws4_request" SELON sReqType CAS "GET" // Requête de type GET sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("") CAS "PUT" // Requête de type PUT, POST, PATCH... sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-content-sha256:" + sHashSHA + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA AUTRE CAS FIN sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ... interne_CalculHashSha256(sCanonic, Faux) sSignature = interne_AWS4_SigDerivee("s3") sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature) SELON sReqType CAS "GET" // Chaine à transmettre dans l'entête sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature) CAS "PUT" sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + sHashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature) AUTRE CAS FIN RENVOYER sEnteteHTTP PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux) sSigningKey est une chaîne SI bIsFile = Vrai ALORS sSigningKey = HashFichier(HA_SHA_256, sData) SINON sSigningKey = HashChaîne(HA_SHA_256, sData) FIN RENVOYER interne_Hexa(sSigningKey) FIN PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "") sSign est une chaîne nInd est un entier nVal est un entier sSign = "" POUR nInd = 1 _À_ Taille(sData) nVal = Asc(sData[[nInd]]) sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin FIN RENVOYER sSign FIN PROCÉDURE INTERNE interne_DateHeureVersISO8601() // Conversion de l'heure locale en heure UTC dhDateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure) sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,... NumériqueVersChaîne(dhUTC..Année,"04d"),... NumériqueVersChaîne(dhUTC..Mois,"02d"),... NumériqueVersChaîne(dhUTC..Jour,"02d"),... NumériqueVersChaîne(dhUTC..Heure,"02d"),... NumériqueVersChaîne(dhUTC..Minute,"02d"),... NumériqueVersChaîne(dhUTC..Seconde,"02d"),... NumériqueVersChaîne(dhUTC..Milliseconde,"03d")) RENVOYER sDateHeureIso FIN PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne) sDateKey est une chaîne sDateRegionKey est une chaîne sDateRegionServiceKey est une chaîne sSigningKey est une chaîne sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS) sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey) sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey) sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey) RENVOYER sSigningKey FIN
Membre enregistré 6 messages
Posté le 06 janvier 2022 - 15:07
Bonjour, Merci pour ces codes mais je suis perdu avec le calcul des signatures aws. Quelqu'un peut-il m'aider, je cherche à créer une signature pour API Get AssumeRole Je pense que c'est la construction de la demande canonique dans mon cas qui ne fonctionne pas. Franck R. a écrit : Bonjour, Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3 Bon courage, Franck R. PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne) sDateUTC est une chaîne sDateJour est une chaîne sSection est une chaîne sFinal est une chaîne sCanonic est une chaîne sTmp est une chaîne AWS_RC est une chaîne = Caract(10) sSignature est une chaîne sEnteteHTTP est une chaîne sAWS_REGION est une chaîne sAWS_PM_PAS est une chaîne sAWS_PM_LOG est une chaîne sAWS_PM_LOG = "votre login AWS" sAWS_PM_PAS = "votre mot de passe AWS" sAWS_REGION = "us-east-1" sDateUTC = interne_DateHeureVersISO8601() sDateJour = DateDuJour() sSection = "s3" // ou autre service "iam" sFinal = "aws4_request" SELON sReqType CAS "GET" // Requête de type GET sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("") CAS "PUT" // Requête de type PUT, POST, PATCH... sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-content-sha256:" + sHashSHA + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA AUTRE CAS FIN sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ... interne_CalculHashSha256(sCanonic, Faux) sSignature = interne_AWS4_SigDerivee("s3") sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature) SELON sReqType CAS "GET" // Chaine à transmettre dans l'entête sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature) CAS "PUT" sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + sHashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature) AUTRE CAS FIN RENVOYER sEnteteHTTP PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux) sSigningKey est une chaîne SI bIsFile = Vrai ALORS sSigningKey = HashFichier(HA_SHA_256, sData) SINON sSigningKey = HashChaîne(HA_SHA_256, sData) FIN RENVOYER interne_Hexa(sSigningKey) FIN PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "") sSign est une chaîne nInd est un entier nVal est un entier sSign = "" POUR nInd = 1 _À_ Taille(sData) nVal = Asc(sData[[nInd]]) sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin FIN RENVOYER sSign FIN PROCÉDURE INTERNE interne_DateHeureVersISO8601() // Conversion de l'heure locale en heure UTC dhDateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure) sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,... NumériqueVersChaîne(dhUTC..Année,"04d"),... NumériqueVersChaîne(dhUTC..Mois,"02d"),... NumériqueVersChaîne(dhUTC..Jour,"02d"),... NumériqueVersChaîne(dhUTC..Heure,"02d"),... NumériqueVersChaîne(dhUTC..Minute,"02d"),... NumériqueVersChaîne(dhUTC..Seconde,"02d"),... NumériqueVersChaîne(dhUTC..Milliseconde,"03d")) RENVOYER sDateHeureIso FIN PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne) sDateKey est une chaîne sDateRegionKey est une chaîne sDateRegionServiceKey est une chaîne sSigningKey est une chaîne sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS) sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey) sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey) sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey) RENVOYER sSigningKey FIN
Membre enregistré 6 messages
Posté le 06 janvier 2022 - 23:03
Bonsoir, Avez-vous trouvé une solution ? Je cherche également à créer une signature AWS pour signer l'APi Get AssumeRolehttps://sts.amazonaws.com/… }} Quelqu'un a-t-il déjà réussi à créer la signature ? J'arrive à retrouver les valeurs fournies dans les exemples AMAZON mais n'arrive pas à créer la signature pour cette api.
Posté le 16 janvier 2022 - 18:19
Bonjour, Je pense que la fonction Windev "HASHCHAINE" est incorrecte si je compare le résultat de: gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog" gsPrivatekey est une chaîne ANSI = "key" gbufSEncrypt est un Buffer gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey) avec ce que l'on obtient sur https://www.liavaag.org/English/SHA-Generator/HMAC/ ou encorehttps://asecuritysite.com/encryption/hmac avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12 sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9 (j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Posté le 16 janvier 2022 - 18:21
Bonjour, Je pense que la fonction Windev "HASHCHAINE" est incorrecte si je compare le résultat de: gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog" gsPrivatekey est une chaîne ANSI = "key" gbufSEncrypt est un Buffer gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey) avec ce que l'on obtient sur https://www.liavaag.org/English/SHA-Generator/HMAC/ ou encorehttps://asecuritysite.com/encryption/hmac avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12 sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9 (j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Membre enregistré 6 messages
Posté le 16 janvier 2022 - 18:22
Bonjour, Je pense que la fonction Windev "HASHCHAINE" est incorrecte si je compare le résultat de: gsSrequest est une chaîne ANSI ="The quick brown fox jumps over the lazy dog" gsPrivatekey est une chaîne ANSI = "key" gbufSEncrypt est un Buffer gbufSEncrypt= HashChaîne(HA_SHA_160, gsSrequest, gsPrivatekey) avec ce que l'on obtient sur https://www.liavaag.org/English/SHA-Generator/HMAC/ ou encorehttps://asecuritysite.com/encryption/hmac avec windev : 2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12 sur les deux sites: DE7C9B85B8B78AA6BC8A7A36F70A90701C9DB4D9 (j'ai essayé avec CHAINE / CHAINE ANSI / BUFFER le résultat n'est jamais le bon)
Membre enregistré 124 messages
Posté le 16 janvier 2022 - 20:42
Posté le 17 janvier 2022 - 00:42
les liens fournis contiennent le mot "HMAC" qui est une option de la fonction hash, mais cette option n'est pas utilisé dans ton code. donc utilise la même option des deux cotés si tu veux avoir le même résultat
Membre enregistré 351 messages
Posté le 17 janvier 2022 - 09:04
Bonjour, En fait le code de ton premier post était presque bon ... l'erreur que tu fais est de passer la clé en hexadécimal alors qu'il faut la passer sous forme de buffer ! Machaine est une chaîne = "AWS4-HMAC-SHA256" + M_LF... + "20150830T123600Z" + M_LF... + "20150830/us-east-1/iam/aws4_request" + M_LF... + "f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59" MaCle est une chaîne = "c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9" Trace ( Minuscule ( BufferVersHexa ( HashChaîne ( HA_HMAC_SHA_256 , Machaine, HexaVersBuffer ( MaCle) ) , SansRegroupement , SansLigne ) ) )
et tu obtiendras ce que tu désires : 5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
Note bien que toutes les fonctions de hachage de Windev fonctionnent sans aucun problème ! -- Bon développement, Patrick [3po.fr]
Membre enregistré 6 messages
Posté le 17 janvier 2022 - 10:43
Arghh, Merci, je suis un âne, "HA_SHA_160" au lieu de "HA_HMAC_SHA_160", cela va tout de suite mieux avec le bon paramètre Bonne journée
Posté le 16 mars 2023 - 16:06
Bonjour, Pourrais-je savoir comment passer les paramètres de requête HTTP lors de l'envoi ? J'ai beau respecter l'algo AWS mais je reçois l'erreur 403...
Posté le 05 juillet 2023 - 10:18
Bonjour, est-ce que quelqu'un a une classe qui fonctionne, car quand je prend les différents code, j'ai des problèmes de clés Avec mes meilleures salutations Fabrice
Posté le 18 juillet 2023 - 14:25
Bonjour, est-ce qu'une personne à un bout de code pour l'enregistrement d'une image dans S3. Merci de votre aide Fabrice
Posté le 23 mars 2025 - 19:01
a écrit : Bonjour,
Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3
Bon courage,
Franck R.
Procedure pglb_EnteteAWS4( s ReqType est une chaîne , s URL est une chaîne , s TmpParam est une chaîne , s NomBucket est une chaîne , s WebUrl est une chaîne , s HashSHA est une chaîne ) s DateUTC est une chaîne s DateJour est une chaîne s Section est une chaîne s Final est une chaîne s Canonic est une chaîne s Tmp est une chaîne AWS_RC est une chaîne = Caract ( 10 ) s Signature est une chaîne s EnteteHTTP est une chaîne s AWS_REGION est une chaîne s AWS_PM_PAS est une chaîne s AWS_PM_LOG est une chaîne s AWS_PM_LOG = "votre login AWS" s AWS_PM_PAS = "votre mot de passe AWS" s AWS_REGION = "us-east-1" s DateUTC = interne_DateHeureVersISO8601( ) s DateJour = DateDuJour ( ) s Section = "s3" s Final = "aws4_request" SELON s ReqType CAS "GET" s Canonic = "GET" + AWS_RC + s URL + AWS_RC + s TmpParam + AWS_RC + ... "host:" + s NomBucket + "." + s WebUrl + AWS_RC + ... "x-amz-date:" + s DateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256( "" ) CAS "PUT" s Canonic = "PUT" + AWS_RC + s URL + AWS_RC + "" + AWS_RC + ... "host:" + s NomBucket + "." + s WebUrl + AWS_RC + ... "x-amz-content-sha256:" + s HashSHA + AWS_RC + ... "x-amz-date:" + s DateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + s HashSHA AUTRE CAS FIN s Tmp = "AWS4-HMAC-SHA256" + AWS_RC + s DateUTC + AWS_RC + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + AWS_RC + ... interne_CalculHashSha256( s Canonic, Faux ) s Signature = interne_AWS4_SigDerivee( "s3" ) s Signature = HashChaîne ( HA_HMAC_SHA_256 , s Tmp, s Signature) SELON s ReqType CAS "GET" s EnteteHTTP = "x-amz-date:" + s DateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256( "" ) + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + s AWS_PM_LOG + "/" + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa( s Signature) CAS "PUT" s EnteteHTTP = "x-amz-date:" + s DateUTC + RC + ... "x-amz-content-sha256:" + s HashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + s AWS_PM_LOG + "/" + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa( s Signature) AUTRE CAS FIN RENVOYER s EnteteHTTP PROCEDURE INTERNE interne_CalculHashSha256( LOCAL s Data est une chaîne , b IsFile est un booléen = Faux ) s SigningKey est une chaîne SI b IsFile = Vrai ALORS s SigningKey = HashFichier ( HA_SHA_256 , s Data) SINON s SigningKey = HashChaîne ( HA_SHA_256 , s Data) FIN RENVOYER interne_Hexa( s SigningKey) FIN PROCEDURE INTERNE interne_Hexa( s Data est une chaîne , s SepFin est une chaîne = "" ) s Sign est une chaîne n Ind est un entier n Val est un entier s Sign = "" POUR n Ind = 1 _À_ Taille ( s Data) n Val = Asc ( s Data[ [ n Ind] ] ) s Sign + = NumériqueVersChaîne ( n Val, "02x" ) + s SepFin FIN RENVOYER s Sign FIN PROCEDURE INTERNE interne_DateHeureVersISO8601( ) dh DateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dh UTC est un DateHeure = DateHeureLocaleVersUTC ( dh DateHeure) s DateHeureIso est une chaîne = ChaîneConstruit ( AWS_ISO8601_FORMAT, ... NumériqueVersChaîne ( dh UTC.. Année , "04d" ) , ... NumériqueVersChaîne ( dh UTC.. Mois , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Jour , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Heure , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Minute , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Seconde , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Milliseconde , "03d" ) ) RENVOYER s DateHeureIso FIN PROCEDURE INTERNE interne_AWS4_SigDerivee( s Methode est une chaîne ) s DateKey est une chaîne s DateRegionKey est une chaîne s DateRegionServiceKey est une chaîne s SigningKey est une chaîne s DateKey = HashChaîne ( HA_HMAC_SHA_256 , DateDuJour ( ) , "AWS4" + s AWS_PM_PAS) s DateRegionKey = HashChaîne ( HA_HMAC_SHA_256 , s AWS_REGION, s DateKey) s DateRegionServiceKey = HashChaîne ( HA_HMAC_SHA_256 , s Methode, s DateRegionKey) s SigningKey = HashChaîne ( HA_HMAC_SHA_256 , "aws4_request" , s DateRegionServiceKey) RENVOYER s SigningKey FIN
Posté le 23 mars 2025 - 19:02
a écrit : Bonjour,
Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3
Bon courage,
Franck R.
Procedure pglb_EnteteAWS4( s ReqType est une chaîne , s URL est une chaîne , s TmpParam est une chaîne , s NomBucket est une chaîne , s WebUrl est une chaîne , s HashSHA est une chaîne ) s DateUTC est une chaîne s DateJour est une chaîne s Section est une chaîne s Final est une chaîne s Canonic est une chaîne s Tmp est une chaîne AWS_RC est une chaîne = Caract ( 10 ) s Signature est une chaîne s EnteteHTTP est une chaîne s AWS_REGION est une chaîne s AWS_PM_PAS est une chaîne s AWS_PM_LOG est une chaîne s AWS_PM_LOG = "votre login AWS" s AWS_PM_PAS = "votre mot de passe AWS" s AWS_REGION = "us-east-1" s DateUTC = interne_DateHeureVersISO8601( ) s DateJour = DateDuJour ( ) s Section = "s3" s Final = "aws4_request" SELON s ReqType CAS "GET" s Canonic = "GET" + AWS_RC + s URL + AWS_RC + s TmpParam + AWS_RC + ... "host:" + s NomBucket + "." + s WebUrl + AWS_RC + ... "x-amz-date:" + s DateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256( "" ) CAS "PUT" s Canonic = "PUT" + AWS_RC + s URL + AWS_RC + "" + AWS_RC + ... "host:" + s NomBucket + "." + s WebUrl + AWS_RC + ... "x-amz-content-sha256:" + s HashSHA + AWS_RC + ... "x-amz-date:" + s DateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + s HashSHA AUTRE CAS FIN s Tmp = "AWS4-HMAC-SHA256" + AWS_RC + s DateUTC + AWS_RC + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + AWS_RC + ... interne_CalculHashSha256( s Canonic, Faux ) s Signature = interne_AWS4_SigDerivee( "s3" ) s Signature = HashChaîne ( HA_HMAC_SHA_256 , s Tmp, s Signature) SELON s ReqType CAS "GET" s EnteteHTTP = "x-amz-date:" + s DateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256( "" ) + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + s AWS_PM_LOG + "/" + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa( s Signature) CAS "PUT" s EnteteHTTP = "x-amz-date:" + s DateUTC + RC + ... "x-amz-content-sha256:" + s HashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + s AWS_PM_LOG + "/" + s DateJour + "/" + s AWS_REGION + "/" + s Section + "/" + s Final + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa( s Signature) AUTRE CAS FIN RENVOYER s EnteteHTTP PROCEDURE INTERNE interne_CalculHashSha256( LOCAL s Data est une chaîne , b IsFile est un booléen = Faux ) s SigningKey est une chaîne SI b IsFile = Vrai ALORS s SigningKey = HashFichier ( HA_SHA_256 , s Data) SINON s SigningKey = HashChaîne ( HA_SHA_256 , s Data) FIN RENVOYER interne_Hexa( s SigningKey) FIN PROCEDURE INTERNE interne_Hexa( s Data est une chaîne , s SepFin est une chaîne = "" ) s Sign est une chaîne n Ind est un entier n Val est un entier s Sign = "" POUR n Ind = 1 _À_ Taille ( s Data) n Val = Asc ( s Data[ [ n Ind] ] ) s Sign + = NumériqueVersChaîne ( n Val, "02x" ) + s SepFin FIN RENVOYER s Sign FIN PROCEDURE INTERNE interne_DateHeureVersISO8601( ) dh DateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dh UTC est un DateHeure = DateHeureLocaleVersUTC ( dh DateHeure) s DateHeureIso est une chaîne = ChaîneConstruit ( AWS_ISO8601_FORMAT, ... NumériqueVersChaîne ( dh UTC.. Année , "04d" ) , ... NumériqueVersChaîne ( dh UTC.. Mois , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Jour , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Heure , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Minute , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Seconde , "02d" ) , ... NumériqueVersChaîne ( dh UTC.. Milliseconde , "03d" ) ) RENVOYER s DateHeureIso FIN PROCEDURE INTERNE interne_AWS4_SigDerivee( s Methode est une chaîne ) s DateKey est une chaîne s DateRegionKey est une chaîne s DateRegionServiceKey est une chaîne s SigningKey est une chaîne s DateKey = HashChaîne ( HA_HMAC_SHA_256 , DateDuJour ( ) , "AWS4" + s AWS_PM_PAS) s DateRegionKey = HashChaîne ( HA_HMAC_SHA_256 , s AWS_REGION, s DateKey) s DateRegionServiceKey = HashChaîne ( HA_HMAC_SHA_256 , s Methode, s DateRegionKey) s SigningKey = HashChaîne ( HA_HMAC_SHA_256 , "aws4_request" , s DateRegionServiceKey) RENVOYER s SigningKey FIN
Posté le 23 mars 2025 - 19:04
a écrit : Bonjour,
Je ne vois pas d'erreur sur votre code, dans mon cas je ne met pas les ChaineVersUTF8 dans le calcul de la signature
Je met ci-dessous le code que j'utilise en AWS4 pour nos connexion S3
Bon courage,
Franck R.
PROCÉDURE pglb_EnteteAWS4(sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne) sDateUTC est une chaîne sDateJour est une chaîne sSection est une chaîne sFinal est une chaîne sCanonic est une chaîne sTmp est une chaîne AWS_RC est une chaîne = Caract(10) sSignature est une chaîne sEnteteHTTP est une chaîne sAWS_REGION est une chaîne sAWS_PM_PAS est une chaîne sAWS_PM_LOG est une chaîne sAWS_PM_LOG = "votre login AWS" sAWS_PM_PAS = "votre mot de passe AWS" sAWS_REGION = "us-east-1" sDateUTC = interne_DateHeureVersISO8601() sDateJour = DateDuJour() sSection = "s3" // ou autre service "iam" sFinal = "aws4_request" SELON sReqType CAS "GET" // Requête de type GET sCanonic = "GET" + AWS_RC + sURL + AWS_RC + sTmpParam + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-date" + AWS_RC + interne_CalculHashSha256("") CAS "PUT" // Requête de type PUT, POST, PATCH... sCanonic = "PUT" + AWS_RC + sURL + AWS_RC + "" + AWS_RC + ... "host:" + sNomBucket + "." + sWebUrl + AWS_RC + ... "x-amz-content-sha256:" + sHashSHA + AWS_RC + ... "x-amz-date:" + sDateUTC + AWS_RC + ... AWS_RC + "host;x-amz-content-sha256;x-amz-date" + AWS_RC + sHashSHA AUTRE CAS FIN sTmp = "AWS4-HMAC-SHA256" + AWS_RC + sDateUTC + AWS_RC + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + AWS_RC + ... interne_CalculHashSha256(sCanonic, Faux) sSignature = interne_AWS4_SigDerivee("s3") sSignature = HashChaîne(HA_HMAC_SHA_256, sTmp, sSignature) SELON sReqType CAS "GET" // Chaine à transmettre dans l'entête sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + interne_CalculHashSha256("") + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-date, Signature=" + interne_Hexa(sSignature) CAS "PUT" sEnteteHTTP = "x-amz-date:" + sDateUTC + RC + ... "x-amz-content-sha256:" + sHashSHA + RC + ... "Authorization: AWS4-HMAC-SHA256 Credential=" + sAWS_PM_LOG + "/" + sDateJour + "/" + sAWS_REGION + "/" + sSection + "/" + sFinal + ... ", SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=" + interne_Hexa(sSignature) AUTRE CAS FIN RENVOYER sEnteteHTTP PROCÉDURE INTERNE interne_CalculHashSha256(LOCAL sData est une chaîne, bIsFile est un booléen = Faux) sSigningKey est une chaîne SI bIsFile = Vrai ALORS sSigningKey = HashFichier(HA_SHA_256, sData) SINON sSigningKey = HashChaîne(HA_SHA_256, sData) FIN RENVOYER interne_Hexa(sSigningKey) FIN PROCÉDURE INTERNE interne_Hexa(sData est une chaîne, sSepFin est une chaîne = "") sSign est une chaîne nInd est un entier nVal est un entier sSign = "" POUR nInd = 1 _À_ Taille(sData) nVal = Asc(sData[[nInd]]) sSign += NumériqueVersChaîne(nVal, "02x") + sSepFin FIN RENVOYER sSign FIN PROCÉDURE INTERNE interne_DateHeureVersISO8601() // Conversion de l'heure locale en heure UTC dhDateHeure est un DateHeure AWS_ISO8601_FORMAT est une chaîne = "%1%2%3T%4%5%6Z" dhUTC est un DateHeure = DateHeureLocaleVersUTC(dhDateHeure) sDateHeureIso est une chaîne = ChaîneConstruit(AWS_ISO8601_FORMAT,... NumériqueVersChaîne(dhUTC..Année,"04d"),... NumériqueVersChaîne(dhUTC..Mois,"02d"),... NumériqueVersChaîne(dhUTC..Jour,"02d"),... NumériqueVersChaîne(dhUTC..Heure,"02d"),... NumériqueVersChaîne(dhUTC..Minute,"02d"),... NumériqueVersChaîne(dhUTC..Seconde,"02d"),... NumériqueVersChaîne(dhUTC..Milliseconde,"03d")) RENVOYER sDateHeureIso FIN PROCÉDURE INTERNE interne_AWS4_SigDerivee(sMethode est une chaîne) sDateKey est une chaîne sDateRegionKey est une chaîne sDateRegionServiceKey est une chaîne sSigningKey est une chaîne sDateKey = HashChaîne(HA_HMAC_SHA_256, DateDuJour(), "AWS4"+ sAWS_PM_PAS) sDateRegionKey = HashChaîne(HA_HMAC_SHA_256, sAWS_REGION, sDateKey) sDateRegionServiceKey = HashChaîne(HA_HMAC_SHA_256, sMethode, sDateRegionKey) sSigningKey = HashChaîne(HA_HMAC_SHA_256, "aws4_request", sDateRegionServiceKey) RENVOYER sSigningKey FIN
bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure: "sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)" merci
Posté le 24 mars 2025 - 11:46
henri peuvrelle a écrit : bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure: "sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)" merci
Mettons que la requête souhaité soit celle-cihttps://nom-du-bucket-s3.s3.amazonaws.com/content/… sReqType = "GET" // ou "PUT" ... sUrl = "/content/" sTmpParam = "list-type=2&prefix=images%2Fmini" // chaine vide ou paramètres de l'url par exemple sNomBucket = "nom-du-bucket-s3" sWebUrl = "s3.amazonaws.com" // ou avec la région "s3-eu-west-3.amazonaws.com" sHashSHA = "" // ou Hash HashChaîne(HA_SHA_256, Body) du Body pour une requête de type PUT/POST/PATCH... Par exemple pour récupérer ListAllMyBuckets de la région de Paris sReqType = "GET" sUrl = "/" sTmpParam = "" sNomBucket = "nom-du-bucket-s3" sWebUrl = "s3-eu-west-3.amazonaws.com" sHashSHA = "" Cordialement, Franck.
Posté le 25 mars 2025 - 14:26
Franck R a écrit : henri peuvrelle a écrit :
bonjour pouriez vous preciser ce qu il faut mettre dans laes arguments de votre procedure: "sReqType est une chaîne, sURL est une chaîne, sTmpParam est une chaîne, sNomBucket est une chaîne, sWebUrl est une chaîne, sHashSHA est une chaîne)" merci
Mettons que la requête souhaité soit celle-ci
https://nom-du-bucket-s3.s3.amazonaws.com/content/… sReqType = "GET" // ou "PUT" ...
sUrl = "/content/"
sTmpParam = "list-type=2&prefix=images%2Fmini" // chaine vide ou paramètres de l'url par exemple
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3.amazonaws.com" // ou avec la région "s3-eu-west-3.amazonaws.com"
sHashSHA = "" // ou Hash HashChaîne(HA_SHA_256, Body) du Body pour une requête de type PUT/POST/PATCH...
Par exemple pour récupérer ListAllMyBuckets de la région de Paris
sReqType = "GET"
sUrl = "/"
sTmpParam = ""
sNomBucket = "nom-du-bucket-s3"
sWebUrl = "s3-eu-west-3.amazonaws.com"
sHashSHA = ""
Cordialement,
Franck.
merci , je ne m en sort pas voici ma requette "PUT" "https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt " je dois faire une erreur dans les arguments de la requete
Posté le 26 mars 2025 - 10:39
henri peuvrelle a écrit : Je n'ai pas accès au lien <Code>AccessDenied</Code>. mais si tu veux écraser ton fichier par un fichier contenant le mot : Bonjour sReqType = "PUT" sUrl = "/00002_20250303_110754.txt" sTmpParam = "" sNomBucket = "bibak-lambda-data" sWebUrl = "s3-eu-west-3.amazonaws.com" sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44" et surtout il ne faut pas oublier de modifier la section du code : sAWS_PM_LOG = "votre login AWS" sAWS_PM_PAS = "votre mot de passe AWS" sAWS_REGION = "eu-west-3" Cordialement, Franck.
Posté le 26 mars 2025 - 11:13
Franck R a écrit : > sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44" Oups, il faut que le hash soit en minuscule ! 9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44 Cordialement, Franck.
Posté le 27 mars 2025 - 10:24
Franck R a écrit : Franck R a écrit :
sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44"
Oups, il faut que le hash soit en minuscule !
9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44
Cordialement,
Franck.
je t envoie mon code qui ne marches pas: HTTPCréeFormulaire("Bibak") HTTPAjouteFichier("Bibak","File","00002_20250303_110754.txt") bib est une httpRequête bib..URL="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"//"… " lheure est une chaîne= DateHeureVersChaîne(DateHeureLocaleVersUTC(DateHeureSys()),"AAAAMMJJTHHMMSSZ") signa est une chaîne=pglb_EnteteAWS4("PUT" ,"/00002_20250303_110754.txt" ,"" , "bibak-lambda-data" , "s3.eu-west-3.amazonaws.com" , "9172e8eec99f144f72eca9a568759580edadb2cfd154857f07e657569493bc44" ) bib..URL="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt"+signa //sReqType = "PUT" //sUrl = "/00002_20250303_110754.txt" //sTmpParam = "" //sNomBucket = "bibak-lambda-data" //sWebUrl = "s3-eu-west-3.amazonaws.com" //sHashSHA = "9172E8EEC99F144F72ECA9A568759580EDADB2CFD154857F07E657569493BC44" //trace(signa) //signa=ExtraitChaîne(signa,3,",") //signa=ExtraitChaîne(signa,2,"=") //url_complete est une chaine="https://bibak-lambda-data.s3.eu-west-3.amazonaws.com/00002_20250303_110754.txt… ()+"%2Feu-west-3%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Signature="+signa // bib..Méthode=httpPut //bib..URL=url_complete //bib..Entête["AWS Region"]="eu-west-3" //bib..Entête["Service Name"]="s3" resp est une httpRéponse resp=HTTPEnvoieFormulaire("Bibak",bib) Info(resp..CodeEtat) Info(resp..Contenu)