Могу ли я зарегистрировать IDP с несколькими сертификатами на AWS IAM - PullRequest
0 голосов
/ 10 февраля 2020

Что у меня есть:

  • Служба жалоб OpenId (Rest), предоставляющая токены
  • Эта служба имеет несколько сертификатов (keyPairs) для подписи токенов в зависимости от некоторых факторов при запросе токен

    - Служба реализует 2 конечные точки OpenId (общеизвестные и сертификаты)

Что я сделал:

  • Я зарегистрировал службу как IDP в AWS службе IAM успешно (следовательно, мои две конечные точки OpenId работают по-другому AWS не принимают IDP)
  • Я создал роли в IAM, которые должны использоваться с использованием токенов службы IDP
  • Я получил два токена из службы IDP, которые будут использоваться для принятия роли (каждый подписан с различным ключом)

Проблема:

  • Ошибка AssumeRole и я получаю недопустимое исключение токена для обоих токенов.

Я попытался установить утверждение "kid" в токенах, каждый с соответствующим ребенком сертификата, и это не сработало: (..

Примечание:

  • Я принимаю роль, используя Java AWS API
  • Когда я удаляю один из сертификатов (из приведенного ниже примера ответа), оставшийся сертификат работает нормально. Так что проблема в том, чтобы иметь 2 сертификата, но мне нужно иметь, и AWS должен иметь способ работы с таким делом, я просто не знаю, как.

Пример того, как конечная точка моих сертификатов выглядит так:

{  
    "keys": [
        {
            "kid": "kid",
            "kty": "kty",
            "use": "use",
            "alg": "alg",
            "n": "nValue",
            "e": "eValue",
            "x5c": [
               "cert1"
            ],
            "x5t": "x5t=",
            "x5t#S256": "x5t#S256"
        },
        {
            "kid": "kid1",
            "kty": "kty",
            "use": "use",
            "alg": "alg",
            "n": "nValue",
            "e": "eValue",
            "x5c": [
                "cert2"
            ],
            "x5t": "x5t=",
            "x5t#S256": "x5t#S256"
        }
    ]
}

1 Ответ

0 голосов
/ 11 февраля 2020

Таким образом, проблема заключалась в том, что я пытался включить ребенка в «претензии» JWT.

Однако оказалось, что для того, чтобы AWS отличить guish, этот JWT был подписан этим ключом (из ответа jwks), он проверяет заголовки JWT. Если в заголовке обнаружен ребенок, он ищет в ответе jwk сертификат с соответствующим ребенком.

Итак, чтобы решить проблему, мне просто нужно было указать ребенка в "заголовках" JWT.

Так что, если вы находитесь в java:

public String buildToken(Key key) {
    Map<String, Object> claims = new HashMap();
    Map<String, Object> headers = new HashMap();

    claims.put(claimName, someClaim);
    ...
    headers.put(KID, KID_OF_THIS_TOKENS_CERTIFICATE);
    ...
    return Jwts.builder().setClaims(claims).setHeader(headers).signWith(SignatureAlgorithm.RS256, key).compact();
}
...