es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El método jsonwebtoken.verify está generando un error debido al token de Keycloak.

Utilizo el endpoint /auth/realms//protocol/openid-connect/certs y codifico la clave pública x5c devuelta por este endpoint en el código para intentar que funcione de la siguiente manera (envuelta en etiquetas BEGIN RSA/END RSA):

let x5c = "MIICnTCCAYUCBgF9TkI2ijANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdldmlkZW5zMB4XDTIxMTEyMzE5MjMyMVoXDTMxMTEyMzE5MjUwMVowEjEQMA4GA1UEAwwHZXZpZGVuczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALgx8kfUyhUz6146LcXJHykE5d/kfkJGHZ1+AH4wfk0Z1rGeNqRUH7bllutre2xrq/EfuKGkuUul8uf7WH3GTyOFJyr1MECnzilYdN8onobpVHXr3SwANCACMsh6tFc6oiQT0XEt1ovzTzB6vxA6qmmsdLPG9giJ9eNqJNHHQiIJosF3yBBoNFDiQDonRNdWNQz5JVxbsdIOhFrdD+mDU0ry9FIs6qMAvD84QVBOzJr/IOCdSy3bfWYyAUsLHqoJbytAzl5EgjVSU2UT+HLs7M2wfZoRGITztmvkcPjqd7PnSOuuAimonwP7uKHtvG+edRabyHaBDSemEA1LUs7+FGkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAIh4QCe6Y3fJtDV6nBi/E3CGo/SIjDCmNnOV413QtmwODZSWFqo6pxs2fJoDb8jIkTf+l8/bI+mKEesXK1CptBpXXyo7Il0jhk5M0c1VT7EkLa/jkVFNr0CoB3UmH56/29Qp8+Xr8TaejGjgS8HoxAMpSFrtjPlKElCcy8dVQgRMxFonry5Iipd4vutc8Afe/GLzJew0IJ5Az1VUum3bJD0IfeecB8F+YOMmaET0oJIQyfdUxVI985Ui30q4K8/p34+WqwvNy2x4vuulvDVRBsHG64PStzhqZQfsfi59lOps4WvYlQ1JEHTu3acZMyTzij6wrVTAFoh1C3FptZ0wPoQ==";
let pemEncoded = `-----BEGIN RSA PUBLIC KEY-----\n${x5c}\n-----END RSA PUBLIC KEY-----\n`;
const payload = verify(token, pemEncoded, { "algorithms": ["RS256"] }));

Pero no creo que tenga el PEM correcto y he estado todo el día intentando encontrar cómo configurar este certificado para su verificación. El error dice “error:0D0680A8:asn1 encoding routines:asn1checktlen:wrong tag”. El token es válido, pero no le gusta mi certificado. ¿Alguna idea de qué estoy haciendo mal aquí?

Imagen del depurador

¿Cuál es la forma correcta de pasar este certificado al método jsonwebtoken.verify en este caso? ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el formato de la clave pública x5c. Al codificar una clave pública en formato PEM, la clave en sí misma debe ser decodificada en base64 y luego cada línea debe ser envuelta con “—–BEGIN CERTIFICATE—–” y “—–END CERTIFICATE—–“. Debería lucir algo como esto:

    -----BEGIN CERTIFICATE-----
    MIICnTCCAYUCBgF9TkI2ijANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdldmlkZW5z
    MB4XDTIxMTEyMzE5MjMyMVoweTEfMB0GA1UEAwwWZm9vLWJhc2U2NC1lbmNvZGVkMIIB
    IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr5NK5l5ZY45zVPJjyCM7P+zE/dWo
    fzdW8xvZa61b2wfrf96OgO6U8vHqeA3qjIOXimxD3ZE2x0ZfPuTgvbuwWA4exR0I4l4y
    HaB/s+ST06Npckte8xWyW54KFvZwUGQzUjIplU/Br6Ug/6aiLq3aTfqqcjMswTmTDAvI
    7VscRzdr8ULE7GYhfZFy4dJ1DsMSRog9glxjwfSPp/Xya3zba3tYNPkhKj2QlO+xsNMd
    GlsM1b8CSC+oAaXCwCxbYz5aO+UAa5yBaKjEi2QRYmh9HVCSx/JgKjPRZQNwNWr5N5zA
    5yNmojKPSRUhYMnR9Xx8KjGKZOLcMwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBOxTjr
    DokvfnWRV7RzZO4sm8NA0guu88vBczTX7p/YWIjx8W1Bvd6vzpwiuf2dBk6dozU6mjyM
    v1C9hHl0chsb+THZ/uSWgK5av5z0wYCh5/F0yKj5WCWTt9Ev1dDHbGKZpCRrSYBGGtMh
    3hYHXtKj2tMBc/QjcjXq3V7uj/6vSxT7Ls82IcSmV7a4PHvC4ks7owU9XjK6mZyclIXv
    PPWgYPBFT/iQwLjhbU6vAPU6SAyaMU+9kE7DBnhxv28F1J+A1+H6w2+bzgPv6UJMa6ae
    kht3qas3+/1MhIl2MWHSsKz/XDF1OY4a4J4C7VtVeR9dNbvVAKjv
    -----END CERTIFICATE-----
    

    En el código, debes decodificar la cadena en base64 de la clave pública x5c y luego envolverla en las etiquetas “—–BEGIN CERTIFICATE—–” y “—–END CERTIFICATE—–” para obtener el formato PEM correcto.

    let x5c = "MIICnTCCAYUCBgF9TkI2ijANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdldmlkZW5z";
    let decoded = Buffer.from(x5c, 'base64').toString('ascii');
    let pemEncoded = `-----BEGIN CERTIFICATE-----\n${decoded}\n-----END CERTIFICATE-----\n`;
    const payload = verify(token, pemEncoded, { "algorithms": ["RS256"] });
    

Comments are closed.