Seguridad
Aquí encontrarás información de las APIs, componentes o características que debes tener presente cuando consumes nuestros productos de APIs.
Introducción
Este documento tiene el objetivo de ser una guía práctica para generar y validar JWTs. JWT (JSON Web Tokens) es un estándar abierto que define una forma compacta y autocontenida para compartir información entre dos componentes como objetos JSON. Esta información puede ser verificada ya que se encuentra firmada digitalmente. Los JWTs pueden ser firmados usando un secreto (Con el algoritmo HMAC) o con un par de llaves privada y pública usando RSA o ECDSA.
Un JWT puede ser firmado o cifrado, para este escenario usamos JWTs firmados y en su forma compacta. Un JWT tiene tres elementos:
- Header: es el que contiene la información de que algoritmo se usa para firmar el mensaje
- Payload: es la información a compartir que se quiere firmar y verificar digitalmente
- Signature: es la firma resultado del procesamiento del header y el payload con el algoritmo definido en el header y la llave privada o secreto establecido.
La forma compacta del JWT se conforma de los 3 elementos anteriores separados por punto de la siguiente manera: base64URL(Header).base64URL(Payload).Signature.
Donde el Signature es la firma y se genera firmando el header y el payload.
Ejemplo:
Signature = RSASHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), llavePrivada)
Y al final queda una cadena similar a esta:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.POstGetfAytaZS82wHcjoTyoqhMyxXiWdR7Nn7A29DNSl0EiXLdwJ6xC6AfgZWF1bOsS_TuYI3OG85AmiExREkrS6tDfTQ2B3WXlrr-wp5AokiRbz3_oB4OxG-W9KcEEbDRcZc0nH3L7LzYptiy1PtAylQGxHTWZXtGz4ht0bAecBgmpdgXMguEIcoqPJ1n3pIWk_dUZegpqx0Lka21H6XxUTxiy8OcaarA8zdnPUnV6AmNP3ecFawIFYdvJB_cm-GvpCSbr8G8y_Mllj8f4x9nBH8pQux89_6gUY618iYv7tuPWBFfEbLxtF2pZS6YC1aSfLQxeNe8djT9YjpvRZA
Instalación y configuración SSL
Para iniciar con la generación de un JWT es necesario tener instalado OpenSSL, aquí veremos el paso a paso de su instalación para el sistema operativo Windows.
- Descargaremos el instalador desde la página SHINING LIGTH PRODUCTIONS desde aquí escogeremos la versión para desarrolladores y el tipo de sistema operativo según sea el caso (win32 o win64)
- Ejecutar el archivo de instalación descargado y seguir las instrucciones como lo muestra las siguientes imágenes:
Al finalizar la instalación nos mostrara la siguiente ventana, desmarcamos las casillas y damos click en Finish.
Para comprobar la correcta instalación de OpesSSL y su versión instalada. Procedemos a abrir una ventana de comandos (CMD) y escribimos la siguiente instrucción: openssL version y presionamos la tecla Enter
Luego de comprobar que la instalación fue correcta procedemos con la generación del JWT.
Generar el JWT
Para generar un JWT usando el algoritmo RS256 se debe contar con una llave privada para firmarlo y con un certificado para verificarlo.
Esta sección presenta:
- Como generar una llave privada y certificado de prueba.
- Como generar un JWT de prueba.
- Como verificar sin un JWT es válido con el certificado.
Llave privada y llave pública
Para pruebas
Para pruebas se puede usar un certificado autofirmado, para generarlo se puede usar openssl, el git bash tiene esta herramienta:
Comando:
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
Información de EJEMPLO:
- Country Name: CO
- State or Province: ANTIOQUIA
- Locality Name: MEDELLIN
- Organization Name: Mi Organization S.A
- Organizational Unit Name: BANCOLOMBIA
- Common Name: nombreapp.apps.ambientesbc.com
El Common Name es el nombre de dominio de la app para la que se genera el certificado, para efectos de prueba en este caso se asignó el valor nombreapp.apps.ambientesbc.com.
Como resultado se generan dos archivos, la llave privada y el certificado, el primer archivo es el que se usa para firmar el JWT y el segundo es el que se puede usar como llave publica con la cual verificamos la firma del JWT. Al abrirlas con un editor de texto
Key.pem (llave privada)
Certificate.pem (Certificado que contiene llave pública)
Herramienta de prueba para generar y validar JWT
Para generar un JWT con la llave privada de prueba se puede usar la herramienta online https://jwt.io/.
Generar JWT
Para las pruebas se deben ingresan los datos:
Algorithm: RS256
generar un nuevo Payload con los siguientes pasos.
Donde:
- iss: es un el nombre de quien genera el JWT, para el caso del banco se debe asignar el AW de la aplicación que genera el JWT.
- sub: identifica para quien se genera el token, debe ser API Key o client_id de la APP en el portal.
- aud: Identifica el grupo o la audiencia para quien se genera el JWT, este dato puede ser un arreglo, para API Connect debe ser APIGateway_XXX (Donde el xxx son las letras del API GW donde está expuesta la API: LAN, DMZ, AWS).
- exp: Es la fecha en la cual el token expira. Es un número en formato NumericDate. Es un timestamp en segundos. Ejemplo: 1588628816.194 o 1588628816. El JWT deja de ser valido una vez se pase de esta fecha. Para producción este valor no puede ser mayor a 1 minuto después de la fecha de generación del token.
- iat: es la fecha en la cual se genera el token. Es un número en formato NumericDate. Es un timestamp en segundos. Ejemplo: 1588628816.194 o 1588628816.
Nota: Ejemplo para generar estos valores en Javascript
var iat = new Date()/1000; //1588630053.851 var exp = iat + 60*60; //1588633653.851
- nonce: es un valor aleatorio de más de 10 caracteres hexadecimales o 20 numéricos.
- Ejemplo para generar estos valores en Javascript con nonce de 12 de longitud, el exp en el ejemplo es de 1 hora después de la fecha de generación del token para efectos de prueba:
let iat = new Date()/1000; let exp = iat + 60*60; let min = 17592186044416;//Hex 1000000000000 let max = 281474976710655;//Hex ffffffffffff let nonce = Math.floor((Math.random() * (max - min + 1)) + min).toString(16); let jwtPayload = { iss: "AW1234001", sum: "bcf78354-c07a-4273-a26a-49b20acd8e45", aud: "APIGateway_DMZ", exp: exp, iat: iat, nonce: nonce } console.log(JSON.stringify(jwtPayload));
- Este código se pude ejecutar en Google Chrome en la consola de inspeccionar (dando f12 o clic derecho->inspeccionar)
Se pega en la sección de payload lo que se imprime en consola
Y en verify signature donde dice private Key se pega el texto de la llave privada.
Esto hace que en la sección que dice Encoded se genere un JWT válido que se puede enviar a la API.
El JWT generado
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJOb21icmVBUFAiLCJzdW0iOiJiY2Y3ODM1NC1jMDdhLTQyNzMtYTI2YS00OWIyMGFjZDhlNDUiLCJhdWQiOiJCYW5jb2xvbWJpYSIsImV4cCI6MTU4ODYzNDUxOC41NTMsImlhdCI6MTU4ODYzMDkxOC41NTN9.lFnJ0JdgLXYYjHxLVfsmi1crRnVTzpbpfBatQwQpSuGIuekSc9oGvRekVGQeL5so4qr2_7h1mlLN7JkT4s8YUzJiDwy7dIFfs_ebYj5oDqAVTVJN_6KgZUtAdaIaP5pcDX7WOstSZNXfeAcOiXBy4kG-DiRW8KHoNrNN9-pnPOKv4wrhpDTTgAzoILlMwgiakA3ayXXoUUIARnrj7emyJ6DDuT1DDFwPMj64tD4db_8xDKf7Pwb7VWUIXb4HxGUY4cuXIuIO4SW7J9T1JCeBQLTmo6_ttrZaFLfyzlJnGAd_Cp5-gE5K1A-iMp77f7VyaXZctjj8eEP6JYB5OlJoBg
Verificar JWT
Si se desea verificar un JWT se deben ingresar el JWT a verificar en el campo “Encoded” e ingresar en donde dice Public Key or Certificate el certificado con el que se va a verificar el JWT.
Enviar el certificado público para poder adjuntarlo a la aplicación, poder autenticarse y realizar el consumo.
⚠️ Aquí te hemos brindado unos consejos generales sobre cómo crear y validar certificados y tokens JWT (JSON Web Tokens) en entornos de desarrollo. No es una guía definitiva ni asesoría legal o de seguridad. Es esencial entender que las prácticas recomendadas aquí son para pruebas y desarrollo, no se sugiere aplicarlas en entornos reales sin primero revisarlas con expertos en seguridad. Así mismo, generar tokens JWT involucra información delicada y claves privadas, compartirlas acá o en otro lado es un riesgo.
Cualquier acción que tomes basada en esta información es bajo tu responsabilidad.
JWT (JSON Web Token) es un estándar abierto que define una forma compacta y autocontenida para compartir información entre dos componentes como objetos JSON.
Los JWT pueden ser firmados usando un secreto (Con el algoritmo HMAC) o con un par de llaves privada y pública usando RSA o ECDSA.
Tiene tres elementos:
- Header: Contiene la información de que algoritmo se usa para firmar el mensaje
- Payload: Es la información a compartir que se quiere firmar y verificar digitalmente
- Signature: Es la firma resultado del procesamiento del header y el payload con el algoritmo definido en el header y la llave privada o secreto establecido.
La forma compacta se conforma de los 3 elementos anteriores separados por punto de la siguiente manera:
base64URL(Header).base64URL(Payload).Signature
Para el consumo de las API usamos JWT firmados de forma asimétrica (usando llave publica y llave privada) en su forma compacta.
Cómo generar el certificado
Como indicábamos para asegurar la identidad del consumidor durante la comunicación entre la aplicación y el API es necesario generar un certificado.
Se debe generar la llave pública y privada.
Datos para generar el certificado
Información de ejemplo
Características recomendadas
|
Generación certificado
Puede utilizar la herramienta OpenSSL para la creación del certificado.
opensslreq -newkey rsa:2048 -nodes -keyoutkey.pem -x509 -days 365 -outcertificate.pem 2. Ingresa a JSON Web Tokens -jwt.io en explorador de internet y configura RS256. 3. Abre la herramienta de desarrollador en el navegador web. |
Código NodeJS
let iat= new Date()/1000; let exp= iat+ 600*60; let min = 17592186044416;//Hex1000000000000 let max= 281474976710655;//Hexffffffffffff let nonce= Math.floor((Math.random() * (max-min + 1)) + min).toString(16); let jwtPayload= { iss: "PruebaPayAPP", sum: "ccb2eebf-889c-47b6-ad55-75346cf70a08", aud: “APIGateway_DMZ", scope:"ScopeBetween" , exp: exp, iat: iat, nonce: nonce } console.log(JSON.stringify(jwtPayload)); 2. Copiar y pegar JSON generado en campo PAYLOAD DATA. |
Ingresar resultado en el Payload
|
Una API Key actúa como un Token de autenticación secreto, o como un identificador único. Estas claves vienen junto con un conjunto de derechos de acceso para la API asociada.
La diferencia entre OAuth 2.0 y JWT, es que, OAuth es un framework que autoriza accesos a recursos de diversas aplicaciones por medio de un token, mientras que JWT es un protocolo de autenticación que genera, envía y valida el token de acceso.
Es decir, que cumplen objetivos diferentes en el proceso de seguridad y protección de datos.
OAuth (Open Authorization) es un framework y estándar de seguridad que da a la aplicación cliente acceso a los datos del usuario, con ámbito (scope) y tiempos limitados.
Este estándar no proporciona al consumidor las credenciales del usuario, desacoplando la autenticación y autorización de los datos.
Y al especificar los ámbitos de una API en el registro de la aplicación cliente, esta puede obtener un token de acceso a un recurso concreto, por lo tanto, OAuth no es un protocolo de autenticación.
Gracias a la autorización limitada a datos valiosos para el uso y consumo de las APIs, con un token de acceso, podemos proporcionarte una experiencia de acceso sin interrupciones y de inicio de sesión único, velando por la seguridad y la protección de los datos de nuestros usuarios.
OAuth provee diferentes tipos de flujo para la autenticación/autorización:
- Authorization Code (Código de Autorización):En esta configuración, el usuario se autentica junto con el servidor de recursos y da al consentimiento de la app, el acceso a sus recursos protegidos sin delegar el nombre de usuario/contraseña a la app.
- Implicit (Implícito): Este es un flujo para aplicaciones de una sola página (Single-Page Applications)
- Resource Owner Password Credentials (Flujo Password): se envían las credenciales del usuario final a través de la aplicación consumidora, permitiendo a la misma, conocer las credenciales.
- Client Credentials (Flujo de Aplicación): Es usado cuando la aplicación consumidora no tiene interacción directa con el cliente y es una aplicación de confianza, debido que, para ejecutar este flujo, no se requiere de la autorización del usuario para acceder a su información. Los únicos datos que se validan en el servidor de OAuth son las credenciales de la aplicación consumidora.
De acuerdo con el flujo valida en la sección de seguridad de la API, que flujo está configurado para así mismo configurarlo en la aplicación consumidora.
A continuación, te brindamos el paso a paso para configurar el OAuth, en pruebas hechas en postman.
- Ubícate en la pestaña de Authorization.
- Selecciona en type: OAuth 2.0.
- En el campo Grant Type selecciona la opción de acuerdo con el flujo de la API
- En el campo Access Token URL, verifica que la url sea la correspondiente.
- Registra tus credenciales de Client ID y Cliente Secret, que debes tener generadas al crear la aplicación en el portal.
- Registra el scope correspondiente a la capacidad a consumir, éste lo encuentras en el path de la operación.
- Oprime el botón Get New Access Toke
- Aparecerá en una nueva ventana el token generado, en la cual deberás oprimir el botón Use Token.