Проверьте в автономном режиме Azure AD сгенерированный JWT - PullRequest
1 голос
/ 17 января 2020

Я получаю сообщение об ошибке при проверке сгенерированного токена Azure AD. Это текущая настройка:

  • У меня есть токен, который можно вставить на https://jwt.io, и я вижу на правой панели правильные утверждения. Я предполагаю, что токен правильно отформатирован. Я также вижу в заголовках, что kid = piVlloQDSMKxh1m2ygqGSVdgFpA и alg: RS256. Я правильно установил тип al go на RS256 для проверки.

  • Я пошел на https://login.microsoftonline.com/common/discovery/keys, чтобы найти ключ publi c, и нашел то же самое kid = piVlloQDSMKxh1m2ygqGSVdgFpA. Поэтому я скопировал соответствующий ключ publi c (строка в поле x5c) и обернул его в правильные строки, чтобы сделать его PKCS # 8 . совместимы:

    * * ----- тысяча двадцать два BEGIN CERTIFICATE ----- MIIDBTCCAe2gAwIBAgIQMCJcgWf4l5xPpeoEwB7DKDANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE5MTExNTAwMDAwMFoXDTI0MTExNDAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANF4YcKZhKTfo * * 1 023 / HhN5cYlT5cEniV0aWuUMxgPAKcG1xolfupYhlOHjFwVN / QOaxcuk3YqGguD + sZ7PiHcJSzFnTkdvD + DtMoW1U6nDf5FuDeAEKJ7JQf7RjiRoViYxZHKrEPHG4iZ + kOhV6DQA16ISTt7ALXVB8gTTF3OvItubk2E3v6sgirgtvdE5Mkd4MTJcO67bgdUCAwEAAaMhMB8wHQYDVR0OBBYEFEXiTeLGkA2LgAjQOrT2KChpgwCgMA0GCSqGSIb3DQEBCwUAA4IBAQA6GqtYZDQzym0yxfL2NnlSbJP / lLhSQOqbPBdN6DWQ / 3duk + e08Ix5qy63hzW + qQR0PAkFEcooL5 + bdheS66tFJpVejEcqCSKUVvwOUe6GY / ju752dlB7anBB9An362khehCxqydYNS5Igl0rtcP7dKC3ZBn1m2B9ULsyx46iNpfHQHHv9NKU2vVq2CtNc95CFktwjUwlyWMgbfI / DzPX / cC6KnglqsuVVBO7 +1 027 * Если это не видно выше, есть \n после -----BEGIN CERTIFICATE----- и до -----END CERTIFICATE-----
    • Этот ключ publi c скопирован в ключевую часть publi c это, и в моем коде это публичный c ключ RSA.
    • Я также попытался отформатировать, используя PKCS # 1 , я не добился большего успеха

    Это продолжает быть недействительным. Даже не истек, явно недействителен, как в jwt.io, так и в моем коде.

    Если токен правильный, моя методология верна? Я нашел разные учебники по подготовке .pem по-разному. Если мой токен неверен, как я могу проверить это помимо получения от него претензий?

1 Ответ

2 голосов
/ 17 января 2020

Вам нужно сгенерировать ключ publi c из modulus и exponent.

Вы можете получить их из https://login.microsoftonline.com/{tenantId_or_commom}/discovery/v2.0/keys

enter image description here

Вот образец java для справки:

    public static PublicKey getPublicKey(String encodedModulus, String encodedExponent) throws NoSuchAlgorithmException, InvalidKeySpecException {
        byte[] modulus = Base64.getUrlDecoder().decode(encodedModulus);
        byte[] exponent = Base64.getUrlDecoder().decode(encodedExponent);

        StringBuilder sb = new StringBuilder();
        for (byte b : modulus) {
            sb.append(String.format("%02x", b));
        }
        String sm = sb.toString();

        sb = new StringBuilder();
        for (byte b : exponent) {
            sb.append(String.format("%02x", b));
        }
        String se = sb.toString();

        BigInteger bm = new BigInteger(sm,16);
        BigInteger be = new BigInteger(se,16);

        KeyFactory rsa = KeyFactory.getInstance("RSA");
        PublicKey publicKey = rsa.generatePublic(new RSAPublicKeySpec(bm, be));

        return publicKey;
    }


    public static void main(String[] args) throws Exception {
        String modulus = "0XhhwpmEpN-jDBapnzhFbtvEU2BpLLcaLzlXm4mlT2MwKZlXRUUam2vI0URDUYRKaa4O62BCWSSGOv2LGQ6tMD5oU-Dqkuf44bo1hLufIqAALUymssfRurTrLd0fqVA9ZCF3fA8_7xQi5r370m4h-G71ez8eE3lxiVPlwSeJXRpa5QzGA8ApwbXGiV-6liGU4eMXBU39A5rFy6TdioaC4P6xns-IdwlLMWdOR28P4O0yhbVTqcN_kW4N4AQonslB_tGOJGhWJjFkcqsQ8cbiJn6Q6FXoNADXohJO3sAtdUHyBNMXc68i25uTYTe_qyCKuC290TkyR3gxMlw7rtuB1Q";
        String exponent = "AQAB";
        byte[] bytes = getPublicKey(modulus, exponent).getEncoded();
        String encodedString = new String(Base64.getEncoder().encode(bytes));

        System.out.println("-----BEGIN PUBLIC KEY-----");
        System.out.println(encodedString);
        System.out.println("-----END PUBLIC KEY-----");

        System.out.println();
    }

Вы получите следующие выходные данные:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0XhhwpmEpN+jDBapnzhFbtvEU2BpLLcaLzlXm4mlT2MwKZlXRUUam2vI0URDUYRKaa4O62BCWSSGOv2LGQ6tMD5oU+Dqkuf44bo1hLufIqAALUymssfRurTrLd0fqVA9ZCF3fA8/7xQi5r370m4h+G71ez8eE3lxiVPlwSeJXRpa5QzGA8ApwbXGiV+6liGU4eMXBU39A5rFy6TdioaC4P6xns+IdwlLMWdOR28P4O0yhbVTqcN/kW4N4AQonslB/tGOJGhWJjFkcqsQ8cbiJn6Q6FXoNADXohJO3sAtdUHyBNMXc68i25uTYTe/qyCKuC290TkyR3gxMlw7rtuB1QIDAQAB
-----END PUBLIC KEY-----

И затем вы можете использовать его в jwt.io: enter image description here

...