Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Oblicza i weryfikuje kod HMAC (Hash-based Message Authentication Code). System HMAC, czasem nazywany kluczem uwierzytelniania wiadomości lub haszem, wykorzystuje kryptograficzną funkcję skrótu, taką jak SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 lub MD-5, stosowanej do wiadomości wraz z tajnym kluczem, by utworzyć podpis lub kod uwierzytelniania wiadomości. Termin „wiadomość” odnosi się do dowolnego strumienia bajtów. Nadawca wiadomości może też wysłać kod HMAC do odbiorcy, a odbiorca może użyć HMAC do uwierzytelnienia wiadomości.
Więcej informacji o HMAC znajdziesz w dokumencie HMAC: Keyed-Hashing for Message Authentication (rfc2104).
Sample
Generowanie HMAC
<HMAC name='HMAC-1'> <Algorithm>SHA256</Algorithm> <SecretKey ref='private.secretkey'/> <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <!-- optional --> <!-- The "message" can include fixed and multiple variable parts, including newlines and static functions. Whitespace is significant. --> <Message>Fixed Part {a_variable} {timeFormatUTCMs(timeFormatString1,system.timestamp)} {nonce} </Message> <!-- default encoding is base64 --> <Output encoding='base16'>name_of_variable</Output> </HMAC>
Weryfikacja HMAC
<HMAC name='HMAC-1'> <Algorithm>SHA256</Algorithm> <SecretKey ref='private.secretkey'/> <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <!-- optional --> <!-- The "message" can include fixed and multiple variable parts, including newlines and static functions. Whitespace is significant. --> <Message>Fixed Part {a_variable} {timeFormatUTCMs(timeFormatString1,system.timestamp)} {nonce} </Message> <!-- VerificationValue is optional. Include it to perform an HMAC check. --> <VerificationValue encoding='base16' ref='expected_hmac_value'/> <!-- default encoding is base64 --> <Output encoding='base16'>name_of_variable</Output> </HMAC>
Przetwarzanie podpisu i weryfikacja podpisu przebiega dokładnie tak samo. Zasada HMAC oblicza HMAC i może opcjonalnie zweryfikować obliczony podpis w odniesieniu do oczekiwanej wartości. Opcjonalny element VerificationValue (jeśli istnieje) nakazuje zasadom sprawdzanie obliczonej wartości w odniesieniu do znanej lub podanej wartości.
Odniesienie do elementu na potrzeby HMAC
Dokumentacja zasad zawiera opis elementów i atrybutów zasad HMAC.
Atrybuty stosowane do elementu najwyższego poziomu
<HMAC name="HMAC" continueOnError="false" enabled="true" async="false">
Poniższe atrybuty są wspólne dla wszystkich elementów nadrzędnych zasad.
Atrybut | Opis | Domyślnie | Obecność |
---|---|---|---|
nazwa |
Wewnętrzna nazwa zasady. Znaki, których możesz używać w nazwie, są ograniczone do: A-Z0-9._\-$ % . Interfejs Apigee wymusza jednak dodatkowe ograniczenia, takie jak automatyczne usuwanie znaków niealfanumerycznych.
Opcjonalnie możesz użyć elementu |
Nie dotyczy | Wymagane |
continueOnError |
Ustaw wartość false , aby zwracać błąd w przypadku niepowodzenia zasady. Jest to normalne działanie większości zasad.
Ustaw jako |
false | Opcjonalnie |
włączone |
Ustaw jako true , aby wymuszać zasadę.
Ustaw wartość |
prawda | Opcjonalnie |
async | Ten atrybut został wycofany. | false | Wycofano |
<Algorithm>
<Algorithm>algorithm-name</Algorithm>
Określa algorytm szyfrowania do obliczania HMAC.
Domyślnie | Nie dotyczy |
Obecność | Wymagane |
Typ | Ciąg znaków |
Prawidłowe wartości | SHA-1 , SHA-224 , SHA-256 , SHA-384 , SHA-512 i MD-5
Konfiguracja zasad akceptuje nazwy algorytmów bez rozróżnienia wielkości liter oraz ze znakiem myślnika między literami i cyframi lub bez niego . Na przykład |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Użyj oprócz atrybutu name, aby oznaczyć zasadę w edytorze serwera proxy interfejsu Apigee inną nazwą w języku naturalnym.
Domyślnie | Jeśli pominiesz ten element, zostanie użyta wartość atrybutu nazwa zasady. |
Obecność | Opcjonalnie |
Typ | Ciąg znaków |
<Message>
<Message>message_template_here</Message> or <Message ref='variable_here'/>
Określa ładunek wiadomości do podpisania. Dane wejściowe tego elementu obsługują szablony wiadomości (zastępowanie zmiennych), aby umożliwić uwzględnianie w czasie działania dodatkowych elementów, takich jak sygnatury czasowe, liczby jednorazowe, listy nagłówków i inne informacje. Na przykład:
<Message>Fixed Part {a_variable} {timeFormatUTCMs(timeFormatString1,system.timestamp)} {nonce} </Message>
Szablon wiadomości może zawierać stałe i zmienne części, w tym znaki nowego wiersza i funkcje statyczne. Odstępy są istotne.
Domyślnie | Nie dotyczy |
Obecność | Wymagane |
Typ | Ciąg znaków |
Prawidłowe wartości | Wartością tekstową może być dowolny ciąg znaków. Jeśli podasz atrybut ref , będzie on miał pierwszeństwo przed wartością tekstową. Zasada ocenia wartość tekstową lub wskazaną zmienną jako szablon wiadomości. |
<Dane wyjściowe>
<Output encoding='encoding_name'>variable_name</Output>
Określa nazwę zmiennej, którą zasada powinna ustawić za pomocą obliczonej wartości HMAC. Określa też kodowanie danych wyjściowych.
Domyślnie |
Domyślna zmienna wyjściowa to Domyślną wartością atrybutu |
Obecność | Opcjonalnie. Jeśli ten element nie jest używany, zasada ustawia zmienną przepływu hmac.POLICYNAME.output z wartością zakodowaną w formacie base64. |
Typ | Ciąg znaków |
Prawidłowe wartości | Do kodowania: Wielkość liter w wartościach nie jest rozróżniana. Wartością tekstową elementu |
<SecretKey>
<SecretKey encoding='encoding_name' ref='private.secretkey'/>
Określa tajny klucz używany do obliczania HMAC. Klucz jest odczytywany z wskazanej zmiennej i dekodowany zgodnie z określonym kodowaniem.
Domyślnie |
Nie ma wartości domyślnej dla wskazanej zmiennej; atrybut Jeśli nie ma atrybutu |
Obecność | Wymagane |
Typ | Ciąg znaków |
Prawidłowe wartości | Prawidłowe wartości dla Użycie atrybutu kodowania pozwala określić klucz, który zawiera bajty spoza zakresu drukowanych znaków UTF-8. Załóżmy na przykład, że konfiguracja zasad zawiera taki element: <SecretKey encoding='hex' ref='private.encodedsecretkey'/>
A załóżmy, że
W tym przypadku bajty klucza zostaną dekodowane jako: [53 65 63 72 65 74 31 32 33] (każdy bajt przedstawiony w postaci szesnastkowej). W innym przykładzie, jeśli |
<VerificationValue>
<VerificationValue encoding='encoding_name' ref='variable_name'/> or <VerificationValue encoding='encoding_name'>string_value</VerificationValue>
(Opcjonalnie) Określa wartość weryfikacji, a także algorytm kodowania, który został użyty do zakodowania wartości weryfikacyjnej. Zasada będzie używać tego algorytmu do dekodowania wartości.
Domyślnie | Brak domyślnej wartości weryfikacyjnej. Jeśli element jest obecny, ale brakuje atrybutu encoding , zasada używa domyślnego kodowania base64 |
Obecność | Opcjonalnie |
Typ | Ciąg znaków |
Prawidłowe wartości |
Prawidłowe wartości atrybutu kodowania to Kodowanie |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Ustaw jako false
, jeśli chcesz, aby zasada zgłaszała błąd, gdy jakakolwiek przywołana zmienna określona w zasadzie jest nierozwiązana. Ustaw jako true
, aby traktować każdą nierozwiązaną zmienną jako pusty ciąg znaków (wartość null).
Wartość logiczna ignoreUnresolvedVariables ma wpływ tylko na zmienne, do których odwołuje się szablon wiadomości. Zmienne SecretKey
i VerificationValue
mogą odwoływać się do zmiennej, ale oba te elementy muszą być możliwe do rozpoznania, więc ustawienie ignore
ich nie dotyczy.
Domyślnie | Fałsz |
Obecność | Opcjonalnie |
Typ | Wartość logiczna |
Prawidłowe wartości | prawda lub fałsz |
Zmienne przepływu
Zasada może ustawiać te zmienne podczas wykonywania.
Zmienna | Opis | Przykład |
---|---|---|
hmac.policy_name.message |
Zasada ustawia tę zmienną z obowiązującą wiadomością, w wyniku oceny szablonu wiadomości określonego w elemencie Message . |
hmac.HMAC-Policy.message = "Hello, World" |
hmac.policy_name.output |
Pobiera wynik obliczania HMAC, gdy element Output nie zawiera nazwy zmiennej. |
hmac.HMAC-Policy.output = /yyRjydfP+fBHTwXFgc5AZhLAg2kwCri+e35girrGw4= |
hmac.policy_name.outputencoding |
Pobiera nazwę kodowania wyjściowego. | hmac.HMAC-Policy.outputencoding = base64 |
Informacje o błędach
W tej sekcji opisujemy kody błędów i komunikaty o błędach, które są zwracane, a także zmienne błędów ustawiane przez Apigee, gdy ta zasada wywołuje błąd. Te informacje są ważne, jeśli opracowujesz reguły dotyczące błędów do obsługi takich błędów. Więcej informacji znajdziesz w sekcjach Co musisz wiedzieć o błędach zasad i Postępowanie w przypadku błędów.
Błędy w czasie wykonywania
Te błędy mogą wystąpić podczas wykonywania zasady.
Kod błędu | Stan HTTP | Występuje, gdy |
---|---|---|
steps.hmac.UnresolvedVariable |
401 | Ten błąd występuje, jeśli zmienna określona w zasadzie HMAC:
|
steps.hmac.HmacVerificationFailed |
401 | Weryfikacja HMAC nie powiodła się. Podana wartość weryfikacji nie pasuje do obliczonej wartości. |
steps.hmac.HmacCalculationFailed |
401 | Nie udało się obliczyć wartości HMAC. |
steps.hmac.EmptySecretKey |
401 | Wartość zmiennej klucza obiektu tajnego jest pusta. |
steps.hmac.EmptyVerificationValue |
401 | Zmienna przechowująca wartość weryfikacji jest pusta. |
Błędy wdrażania
Te błędy mogą wystąpić podczas wdrażania serwera proxy zawierającego te zasady.
Nazwa błędu | Stan HTTP | Występuje, gdy |
---|---|---|
steps.hmac.MissingConfigurationElement |
401 | Ten błąd występuje, gdy brakuje wymaganego elementu lub atrybutu. |
steps.hmac.InvalidValueForElement |
401 | Ten błąd występuje, jeśli wartość określona w elemencie algorytmu nie jest jedną z tych wartości: SHA-1 , SHA-224 , SHA-256 , SHA-512 lub MD-5 . |
steps.hmac.InvalidSecretInConfig |
401 | Ten błąd występuje, jeśli w polu SecretKey podano jawnie wartość tekstową. |
steps.hmac.InvalidVariableName |
401 | Ten błąd występuje, jeśli zmienna SecretKey nie zawiera prefiksu private (private. ). |
Zmienne błędów
Te zmienne są ustawiane, gdy wystąpi błąd środowiska wykonawczego. Więcej informacji znajdziesz w artykule Co musisz wiedzieć o błędach związanych z zasadami.
Zmienne | Gdzie | Przykład |
---|---|---|
fault.name="fault_name" |
fault_name to nazwa błędu podana w tabeli Błędy środowiska wykonawczego powyżej. Nazwa błędu to ostatnia część kodu. | fault.name Matches "UnresolvedVariable" |
hmac.policy_name.failed |
Zasada ustawia tę zmienną na wypadek niepowodzenia. | hmac.HMAC-Policy.failed = true |
Przykładowa odpowiedź na błąd
W przypadku obsługi błędów najlepiej jest zablokować część errorcode
odpowiedzi błędu. Nie polegaj na tekście w polu faultstring
, ponieważ może się on zmienić.
Przykładowa reguła błędu
<FaultRules> <FaultRule name="HMAC Policy Errors"> <Step> <Name>AM-Unauthorized</Name> <Condition>(fault.name Matches "HmacVerificationFailed")</Condition> </Step> <Condition>hmac.HMAC-1.failed = true</Condition> </FaultRule> </FaultRules>