无法使用x5c(x509)公共证书验证JWT

问题描述 投票:0回答:1

更新我正在尝试使用下面的x5c / x509公钥值以编程方式验证JWT访问令牌。我可以通过将令牌和x5c值插入外部网站而不是使用JavaScript / jsrsasign以编程方式将其工作。任何建议将不胜感激。

这是OIDC提供商的公共JSON Web密钥集。

    {
        "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"]);

我应该在base64解码之前/之后将BEGIN / END PUBLIC KEY字符串添加到x5c值吗?是的,多亏了亚当

我需要在验证前处理x5c值吗?

返回响应 - 已解码:false

先感谢您。

javascript encryption jwt x509 jwk
1个回答
0
投票

这个答案可能无法帮助您回答所有问题,但我必须编写它以提高解决方案的安全性。

我的印象是我应该使用x5c值, 我需要在验证前处理x5c值吗?

从安全角度来看 - 请勿使用x5c证书直接验证签名。在这种情况下,任何人都可以提供自己的证书并欺骗任何身份。

x5t / x5t#S256标头用于识别签名者的目的 - 检查您是否信任x5c或x5t#S256(或其颁发者)在指定的iss下提供的证书,然后才应验证签名。 x5t标头使您的服务能够验证来自多个IdP(身份提供者/令牌发布者)的令牌,或者在不失去对serice提供者的信任的情况下更新签名者的证书。

如果您只信任使用单个证书的单个身份提供者,则可以直接使用提供者的证书,而无需对提供的标头执行任何操作。

对于解决方案 - 似乎亚当在评论中是正确的,我建议你使用KEYUTIL加载/解析证书

© www.soinside.com 2019 - 2024. All rights reserved.