Primeros pasos
Seguridad
En Apimarket, la seguridad es una prioridad absoluta. Por eso, te explicaremos técnicamente cómo mantenemos estándares de seguridad elevados, asegurando la privacidad y protección en las diversas capas de interacción con nuestros servicios.
Seguridad en la capa de red y de transporte
En Apimarket, implementamos rigurosas medidas de seguridad en la capa de transporte para garantizar una comunicación segura. Nuestro servidor está configurado para operar solo con HTTPS, para una transmisión de datos cifrada y segura. Utilizamos certificados SSL de Let's Encrypt para asegurar la autenticidad y la integridad de la comunicación entre el cliente y el servidor. Estos certificados, junto con una configuración estricta de ciphers SSL, fortalecen la seguridad de nuestras conexiones.
Además, empleamos diversas tácticas de seguridad para proteger contra explotaciones y ataques comunes. Hacemos uso del encabezado Strict-Transport-Security (HSTS) para asegurar que los navegadores interactúen con nuestro sitio web exclusivamente a través de conexiones seguras HTTPS. También implementamos medidas como cabeceras de seguridad adicionales para prevenir ataques de scripts entre sitios (XSS), hacer cumplir la política de mismo origen y controlar las políticas de referenciación.
La configuración del servidor de Apimarket incorpora varias medidas avanzadas para mejorar la seguridad de las comunicaciones SSL/TLS y la resolución de nombres de dominio:
SSL Stapling
La activación de SSL Stapling permite al servidor proporcionar pruebas de la validez del certificado SSL/TLS directamente durante el proceso de establecimiento de la conexión. Esta práctica mejora la eficiencia y la seguridad, reduciendo la necesidad de que los clientes verifiquen el certificado de forma independiente, lo que acelera la conexión y disminuye la carga en los servidores de certificación. Verificar la validez de los certificados grapados antes de su entrega a los clientes aumenta la confianza y la seguridad en la autenticación del certificado.
IPv6
La utilización de múltiples servidores DNS, incluyendo los que ofrecen soporte IPv6, asegura una resolución de nombres de dominio más fiable y rápida. Esta diversidad en los servidores DNS contribuye a la continuidad y el rendimiento óptimo del sitio web, traduciendo eficientemente los nombres de dominio a direcciones IP.
Certificado SSL de Confianza
El uso de certificados SSL/TLS de una autoridad de certificación reconocida como Let's Encrypt garantiza que las conexiones con el servidor sean auténticas y seguras. La inclusión de certificados intermedios en la cadena de certificados asegura una cadena de confianza completa hasta la raíz de la autoridad de certificación. Estas configuraciones colectivas han resultado en una seguridad robusta en las comunicaciones del servidor, lo que se refleja en la calificación de A+ obtenida en la evaluación de SSL Labs, un referente en la industria para analizar y calificar la seguridad de las implementaciones SSL/TLS.
TLS 1.3 y HTTP/2
ApiMarket soporta la implementación de TLS 1.3, la versión más reciente y segura del protocolo de seguridad, es un aspecto crucial. TLS 1.3 ofrece mejoras significativas en seguridad y rendimiento en comparación con versiones anteriores. Proporciona una protección más robusta contra ataques de intermediarios y reduce la latencia al acelerar el proceso de handshake, lo que significa que las conexiones seguras se establecen más rápidamente. Además, TLS 1.3 simplifica y agiliza el protocolo al eliminar opciones obsoletas y menos seguras.
Advertencia: Configuración Requerida para TLS 1.3 y HTTP/2 Para establecer una comunicación exitosa utilizando TLS 1.3 y HTTP/2, es necesario realizar una configuración específica en tu lenguaje de programación. Estas opciones no suelen encuentrarse activadas por defecto. Asegúrate de revisar y ajustar tu entorno de desarrollo para aprovechar los beneficios de seguridad y rendimiento que ofrecen TLS 1.3 y HTTP/2.
Seguridad en la capa de aplicación
Hemos desarrollado una avanzada solución de cifrado para proteger los datos transmitidos entre su aplicación y nuestras APIs. Cabe destacar que este servicio de cifrado es opcional y no es un requisito obligatorio para el uso de nuestros servicios.
Esta solución incluye el uso de JSON Web Encryption (JWE) y algoritmos específicos, diseñados para asegurar la protección efectiva de su información.
Configuración para el Uso de JWE Nota Importante: Si decide utilizar el protocolo JWE para el cifrado de datos, es esencial enviar el encabezado x-encryption: true en sus solicitudes. Esto indica que se está utilizando JWE y no se están enviando datos en texto plano.
JSON Web Encryption (JWE)
Utilizamos JWE para el cifrado de los datos transmitidos. JWE es un estándar que permite cifrar contenido en un formato JSON estructurado, garantizando la seguridad de los datos sensibles durante su transmisión.
Cifrado de Contenido
Para el cifrado del contenido, usamos el algoritmo A256GCM
. Este es un avanzado algoritmo de cifrado simétrico que proporciona una protección robusta
y efectiva contra diversos tipos de ataques cibernéticos. Su capacidad para asegurar la confidencialidad de los datos lo convierte en una opción fiable para
proteger la información sensible. Este algoritmo es conocido por su eficiencia en el cifrado, garantizando así una seguridad integral sin comprometer el rendimiento.
Cifrado de Claves
Utilizamos el avanzado algoritmo RSA_OAEP_256
para el cifrado de claves. Este algoritmo se fundamenta en el intercambio de claves elípticas,
proporcionando así una capa adicional de seguridad. Para acceder a nuestra clave pública en formato JSON, puede utilizar el endpoint /api/v2/apimarket/public-key
.
Optamos por el formato JSON debido a su compatibilidad con el estándar JWK (JSON Web Key), que facilita la expresión de claves en un formato JSON claro y estructurado.
Este formato es particularmente útil en el entorno de las tecnologías que emplean JWT (JSON Web Token) y JWE (JSON Web Encryption).
En consecuencia, hemos decidido no ofrecer nuestra clave pública en el formato PKCS#1 (.pem), priorizando así la eficiencia y la interoperabilidad del formato JSON.
Buenas Prácticas de Seguridad
- Seguridad de Credenciales: Es vital mantener seguras sus claves de API y credenciales. No las comparta y almacénelas en un lugar seguro.
- Monitoreo de Actividad: Se recomienda revisar periódicamente los registros de transacciones para detectar cualquier actividad inusual o sospechosa.
Para más información y mejores prácticas de seguridad, visite OWASP.
Ejemplo: crear tokens con tu CIEC y RFC
-
Obtención de la Clave Pública:
-
Desarrollador (Tú): Realiza una solicitud GET a
/api/v2/apimarket/public-key
, incluyendo el token de autorización (Bearer token) en el encabezado.
-
Desarrollador (Tú): Realiza una solicitud GET a
-
Retorno de la Clave Pública:
- ApiMarket: Responde con la clave pública en formato JSON. Se recomienda guardar esta clave para evitar solicitarla en cada interacción con los servicios de Apimarket.
-
Encriptación de la Información:
- Desarrollador: Utiliza la clave pública para encriptar la información a enviar. Emplea los algoritmos RSA_OAEP_256 y A256GCM. La información encriptada debe
- incluir campos como
iat
(tiempo de emisión),nbf
(tiempo de validez),exp
(tiempo de expiración),iss
(emisor),aud
(destinatario) ypayload
(datos a transmitir).- Un JSON que ejemplifica los campos obligatorios (iat, nbf, exp, iss, aud) y propiamente tu carga útil (payload):
{ "iat": "now()", "nbf": "now()", "exp": "now() + 3600", "iss": "Api Market Remote Call", "aud": "apimarket.mx", "payload": { "rfc": "", "ciec": "", "name": "", "description": "" } }
- Un JSON que ejemplifica los campos obligatorios (iat, nbf, exp, iss, aud) y propiamente tu carga útil (payload):
Recuerda que necesitarás utilizar una biblioteca compatible que maneje JWT y JWE, por ejemplo en C#:
using Jose;
using System.IO;
using Newtonsoft.Json;
using system;
Jwk public_key = Jwk.FromJson(File.ReadAllText("public.key"), JWT.DefaultSettings.JsonMapper);
var data_ = new
{
iat = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
nbf = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
exp = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + 3600,
iss = "Api Market Remote Call",
aud = "apimarket.mx",
payload = new
{
empresa= emp.NombreComercial,
name= "AAA",
permissions = new string[] { "use_buscar_credito" }
}
};
string payload = JsonConvert.SerializeObject(data);
string token = Jose.JWT.Encode(payload, public_key, JweAlgorithm.RSA_OAEP_256, JweEncryption.A256GCM);
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://apimarket.mx/api/v2/apimarket/tokens");
request.Headers.Add("Accept", "application/json");
request.Headers.Add("Authorization", "Bearer "+ Constantes.API_KEY_API_MARKET);
request.Headers.Add("x-encryption", "true");
Jwk public_key = Jwk.FromJson(Constantes.API_KEY_MARKET_PUBLIC, JWT.DefaultSettings.JsonMapper);
string payload = JsonConvert.SerializeObject(data_);
string token = Jose.JWT.Encode(payload, public_key, JweAlgorithm.RSA_OAEP_256, JweEncryption.A256GCM);
var content = new StringContent($"\"{token}\"", null, "application/json");
request.Content= content;
var response = await client.SendAsync(request);
-
Envío de la Información Encriptada
- Desarrollador: Envía la información encriptada en el cuerpo (body) de la solicitud, junto con el encabezado x-encryption: true.
Ejemplo de una petición para crear un nuevo token usando curl sería:
curl -X POST https://apimarket.mx/api/v2/apimarket/tokens \
-H "x-encryption: true" \
--data "eyJlcGsiOnsia3R5IjoiT0tQIiwiY3J2IjoiWDI1NTE5IiwieCI6ImUwcWh2UTBwazl4T2NqU1BaOVgyRlBMSi1VV"
-
Desencriptación y Verificación de la Información
- ApiMarket: Recibe, desencripta y verifica la autenticidad y validez de la información, asegurando la coherencia y la integridad de los datos.
-
Almacenamiento de la Información:
- ApiMarket: Una vez verificada, realizamos la operación que solicitaste.
El endpoint https://apimarket.mx/api/v2/apimarket/tokens en POST
respondería con una estructura JSON como la siguiente:
{
"id": "valor_id_del_token",
"name": "nombre_del_token",
"limit": "limite_del_token",
"api_token": "un_nuevo_token"
}