AWS4-HMA C -SHA256 EC2 API в чистой оболочке - PullRequest
0 голосов
/ 20 января 2020

Мне нужно взаимодействовать с AWS EC2 API, используя pure / bin / sh, поэтому я не могу использовать ни один из Amazon SDK. Для запросов API требуется, чтобы подпись ключа добавлялась к заголовку аутентификации в запросе http. Сигнатура создается из серии вложенных вызовов аутентификации сообщений на основе хеширования (hma c), функций:

hmac0(key, data)
hmac1(hmac0,data)
hmac2(hmac1,data)
...
...
...

Amazon предоставляет схему практики и некоторые практические значения, чтобы убедиться, что все работает.

Вот схема практики:

kSecret = your secret access key
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")

Вот значения практики:

secret = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
date = '20120215'
region = 'us-east-1'
service = 'iam'

Вот то, к чему должны вычисляться значения при хешировании:

kDate    = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d'
kRegion  = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c'
kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa'
kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

Вот мои значения:

969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d
d5283a1e52c40d102c9d079674392d795194b78c03cc7e115d5c2581f8db44a6
49b3571d4532b7d85f1c1529a13d9482578d93fb32f5458f3a2767864e218666
18d7bdb43f9843d73d8547b90e9c8ed5ac8f61d2f55086f354b9e8366cfe7

Мое первое значение верное, но остальные неверны.

Вот как я подошел к этому:

#!/bin/sh

KEY="wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"
KEY_TAG="AWS4"
TAGGED_KEY="$KEY_TAG$KEY"
DATE="20120215"
REGION="us-east-1"
SERVICE="iam"
SIGNING="aws4_request"

kDate() {
    echo -n $DATE | openssl dgst -sha256 -hmac $TAGGED_KEY | sed 's/^.* //'
}
kRegion() {
    echo -n $REGION | openssl dgst -sha256 -hmac kDate | sed 's/^.* //'
}
kService() {
    echo -n $SERVICE | openssl dgst -sha256 -hmac kRegion | sed 's/^.* //'
}
kSigning() {
    echo -n $SIGNING | openssl dgst -sha256 -hmac kService | sed 's/^.* //'
}

# Print values
kDate
kRegion
kService
kSigning

Даже когда я использую литеральные значения вместо функций, они ошибаются. Также вот еще один тест, который я позаимствовал из Википедии, чтобы проверить свою функцию, и он работает:

TEST="The quick brown fox jumps over the lazy dog"
KEY="key"

kTest() {
    echo -n $TEST | openssl dgst -sha256 -hmac $KEY | sed 's/^.* //'
}

f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

Что мне здесь не хватает?

...