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"
}
Seguridad y Cifrado de Parámetros
En API Market la seguridad de los datos es prioritaria. Para proteger la información sensible que viaja en nuestras APIs (como RFC, CURP, CIEC u otros identificadores), ofrecemos un esquema de cifrado AES-128-ECB en los servicios Premium que permite garantizar confidencialidad sin perder compatibilidad con los sistemas externos a los que nos conectamos.
¿Por qué AES-128-ECB?
- Reversible: este método permite que los datos puedan ser descifrados de forma exacta en nuestros servidores para su envío a las plataformas de gobierno.
- Estático y determinístico: siempre que se cifre el mismo valor con la misma clave, el resultado será idéntico. Esto es necesario para mantener trazabilidad y evitar inconsistencias en las solicitudes.
- Estandarizado: OpenSSL y la mayoría de librerías modernas soportan este algoritmo, facilitando la implementación en cualquier lenguaje de programación.
⚠️ Aunque AES-ECB no es la opción más robusta para cifrado de grandes volúmenes de datos, lo elegimos porque en este contexto los parámetros son cortos, sensibles, y requieren reversibilidad exacta para interoperar con los servicios oficiales.
Configuración de Tokens y Políticas de Cifrado
Cada token en API Market puede tener configurada una clave secreta (secret
) que se usará para cifrar y descifrar parámetros.
Además, cada token cuenta con una política de cifrado (policy
) que define cómo nuestro sistema tratará las transacciones:
-
Requerida (
required
): todas las solicitudes deben enviarse cifradas. Nuestro sistema rechazará automáticamente cualquier parámetro recibido en texto plano. -
Opcional (
optional
): se aceptan tanto parámetros en texto plano como cifrados. -
Valor predeterminado: todos los tokens se crean inicialmente con la política
optional
.
Esto te da flexibilidad: puedes iniciar con la política opcional mientras integras tu sistema, y una vez que todo esté listo, endurecer la seguridad cambiando a la política requerida.
Opciones de Uso del Cifrado
Tienes dos caminos para manejar el cifrado en tus integraciones:
1. Cifrado descentralizado (tu propia implementación)
Puedes implementar localmente el mismo algoritmo en tu sistema, antes de enviar parámetros a nuestra API.
Esto te permite tener mayor control, ya que los datos nunca viajan en claro hacia nosotros.
Detalles técnicos:
- Algoritmo: AES-128-ECB
- Key: secret (16 caracteres)
- Modo: sin IV (ECB no requiere IV)
- Flag: OPENSSL_RAW_DATA para obtener bytes binarios en lugar de base64. Conversión: los bytes cifrados deben convertirse a hexadecimal en mayúsculas antes de enviarse.
Ejemplo en PHP:
$secret = "TU-CLAVE-SECRETA"; // Debe tener 16 caracteres
$param = "XAXX010101000"; // RFC de ejemplo
// Cifrar con AES-128-ECB → obtenemos bytes binarios
$encryptedBytes = openssl_encrypt($param, 'AES-128-ECB', $secret, OPENSSL_RAW_DATA);
// Convertir los bytes a hexadecimal
$hex = bin2hex($encryptedBytes);
// Convertir a mayúsculas para compatibilidad
$final = strtoupper($hex);
echo $final; // Ejemplo de salida: 9F1E2A...
De esta forma te aseguras de que tu implementación sea 100% compatible con la de API Market y los parámetros que envías ya llegarán cifrados a nuestra API.
2. Uso del Cifrador en nuestras APIs de administración
Si no deseas implementar el cifrado de tu lado, puedes usar nuestro endpoint de cifrador dentro de las APIs de administración.
- Para ello, tu token debe tener configurada una clave secreta (
secret
). - Nosotros nos encargaremos de cifrar recursivamente todos los parámetros que envíes en el request.
- Posteriormente, en los endpoints de consumo, la clave se usará de forma inversa para descifrar y procesar correctamente la información.
Esto reduce complejidad de tu lado, aunque implica que los parámetros sensibles llegarán en claro a nuestro endpoint de cifrado antes de ser protegidos.
Ejemplo de flujo usando el Cifrador de API Market
- Configuras tu clave secreta (
secret
) y tu política de cifrado (policy
) en el token desde nuestra plataforma. - Llamas a
/api/cifrador
con los parámetros en claro:{ "rfc": "XAXX010101000", "ciec": "12345678" }
- La respuesta devuelve los mismos parámetros cifrados:
{ "rfc": "9F1E2A...", "ciec": "AC48B9..." }
- Usas esa respuesta directamente en las llamadas a los endpoints productivos que tienen soporte de cifrado.
Buenas prácticas recomendadas
- Define siempre un
secret
robusto (16 caracteres recomendados). - Si tienes desarrolladores en distintos lenguajes, asegúrate de que todos implementen AES-128-ECB → HEX en mayúsculas de forma consistente.
- Para máxima seguridad, activa la política
required
en tu token una vez que tu integración esté lista. - Si requieres simplicidad durante pruebas iniciales, usa la política
optional
(valor por defecto).
📌 Con este esquema, puedes elegir entre seguridad máxima con cifrado propio o simplicidad usando nuestro cifrador. En ambos casos, garantizamos compatibilidad total y descifrado correcto en los servicios oficiales.