Не удается проверить JWT, используя открытый сертификат x5c (x509) - PullRequest
0 голосов
/ 18 марта 2019

ОБНОВЛЕНО Я пытаюсь проверить токен доступа JWT программно, используя значение открытого ключа x5c / x509 ниже. Я могу заставить это работать, подключая токены и значения x5c к внешним веб-сайтам, но не программно, используя JavaScript / jsrsasign. Любые предложения будут с благодарностью.

Вот открытый набор веб-ключей JSON провайдера OIDC.

    {
        "keys": [
            {
                "kty": "RSA",
                "kid": "server",
                "use": "sig",
                "alg": "RS256",
                "n": "gLZO9w1OT_SWO-KbqiU0k3HevHggiY70XbDqgE1YaqhD-MwFUWNudExzF3oB28NYWYg5v6CJY0F-pUNtgukDM6ARDlh0n4xIvBRlnUnCTCx7pYOjpfXbTv49tlXmh4-ddh8EeQBLrF92u5UYs0tnZd8843mvYWohUNH1X1hM08-hpk7xCiy4XdwbeSlH757D2d5E0J0dGtZ744-dB2ZRCw2Vms_mk4Yyny4ifx2j2gIhikbb7WGmsTR2sWrtuhgZ_EBNUvrD0O54xbhQNTTFQ1pi9UZxo_gYc5Gp5fLcSOK6SDBKXbDS5hhy1vFyoa0xdgFv-xpem7YzmkKqzfjC9w",
                "e": "AQAB",
                "x5c": [
                    "MIIDMDCCAhigAwIBAgIEFIopYzANBgkqhkiG9w0BAQsFADBaMQkwBwYDVQQGEwAxCTAHBgNVBAgTADEJMAcGA1UEBxMAMQkwBwYDVQQKEwAxCTAHBgNVBAsTADEhMB8GA1UEAxMYZmNpc2Rldi5pY2UuaWJtY2xvdWQuY29tMB4XDTE4MTAwMTE4MTYyOFoXDTI4MDkyODE4MTYyOFowWjEJMAcGA1UEBhMAMQkwBwYDVQQIEwAxCTAHBgNVBAcTADEJMAcGA1UEChMAMQkwBwYDVQQLEwAxITAfBgNVBAMTGGZjaXNkZXYuaWNlLmlibWNsb3VkLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIC2TvcNTk/0ljvim6olNJNx3rx4IImO9F2w6oBNWGqoQ/jMBVFjbnRMcxd6AdvDWFmIOb+giWNBfqVDbYLpAzOgEQ5YdJ+MSLwUZZ1Jwkwse6WDo6X1207+PbZV5oePnXYfBHkAS6xfdruVGLNLZ2XfPON5r2FqIVDR9V9YTNPPoaZO8QosuF3cG3kpR++ew9neRNCdHRrWe+OPnQdmUQsNlZrP5pOGMp8uIn8do9oCIYpG2+1hprE0drFq7boYGfxATVL6w9DueMW4UDU0xUNaYvVGcaP4GHORqeXy3EjiukgwSl2w0uYYctbxcqGtMXYBb/saXpu2M5pCqs34wvcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAdtN9znA9a6luPAQurcQn8kJBlllslRWsNPMhPWpMtYaMLx6JhmDICGbaYZBGUboedwnUaEk6tE2b+EVlUE/tnaKVJms2cmCCFExQQrTHmRfFI/Vi/esVqAnz1E2dB61LMnQ2AeebXAZ/C7hRt1uXVboXr5Zokppr4FRS9QsjSK4dhcXxhfglTKJOPZ4dkSexhe6hybpL8XdGhoyf2SyNXCy5iYX0zQ5BmJaLimOcJyasZ/A7/YgsVbQyAe6Ubno6/sIUuOZ+J+snZsBSLViqcftGVPUkIWamv/yNQcEJrDWa4C+sr+9Yb7uFjuj4gDY0jvGkGmu53g0K8Vks+IfAdQ=="
                ],
                "x5t#S256": "nTAGJuFFrm-vNBdkLVNmuePwTmlXr0T87IppgJPRT9k"
            }
        ]
    }

Вот код, который я использую для проверки токена доступа с x5c. У меня сложилось впечатление, что я должен использовать значение x5c, но если есть другой способ, который мне подходит. Просто нужно проверить токен с указанными выше значениями под ключами.

// break line every 64 characters.

x5cValue = x5cValue.replace(/(.{64})/g, "$1\n");

// base64 decode

var x5cValueAtob = atob(x5cValue);

// Add Begin / END certificate

x5cValue = "-----BEGIN CERTIFICATE-----\n" + x5cValueAtob + "\n-----END CERTIFICATE-----";

var decoded = KJUR.jws.JWS.verify(accessTokenJson, rawContent, ["RS256"]);

Должен ли я добавлять строки BEGIN / END PUBLIC KEY к значению x5c до / после декодирования base64? да, спасибо Адаму

Нужно ли обрабатывать значение x5c перед проверкой?

Возвращенный ответ - расшифровано: false

Заранее спасибо.

1 Ответ

0 голосов
/ 19 марта 2019

Этот ответ может не помочь вам ответить на все ваши вопросы, но я должен написать его, чтобы повысить безопасность решения.

У меня сложилось впечатление, что я должен использовать значение x5c,
Нужно ли обрабатывать значение x5c перед проверкой?

С точки зрения безопасности - не использовать сертификат x5c для прямой проверки подписи. В этом случае любой может просто предоставить свой собственный сертификат и подделать любую личность.

Цель, если заголовок x5t / x5t # S256 предназначен для идентификации подписавшего - проверьте, доверяете ли вы сертификату, предоставленному x5c или x5t # S256 (или его эмитентом) под указанным iss , только тогда вы следует проверить подпись. Заголовки x5t позволяют вашей службе проверять токен от нескольких IdP (поставщиков удостоверений / поставщиков токенов) или обновлять сертификат подписавшего, не теряя доверия к поставщикам услуг.

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

Для решения - кажется, Адам прав в комментариях, я также предлагаю вам использовать KEYUTIL для загрузки / анализа сертификата

...