Firmado de paquetes

Ejemplo de estructura de paquete firmado

Para obtener la clave pública con la que Plexo firma los paquetes que se reciben, se consume la siguiente URL:

Para firmar el mensaje canonizado, se debe utilizar algoritmo de hashing SHA512 y de padding PKCS1.

Ejemplo de una llamada al método Authorize.

{
"Object": (1)
{(6)----> Comienza área de firmado----
"Fingerprint":"8D3225D6A04C8A5EB8D69139A3389E0619C6D292", (3)
"Object": (2)
{
"Client":"PlexoTest",
"Request":
{
"Action":35,
"ClientInformation":
{
"Name":"Francisco Vidal",
"Address":"Av Italia 2020",
"Email":"fvidal@plexo.com.uy",
"Cellphone":"099999999",
"Identification":"12345567",
"IdentificationType":"1"
},
"DoNotUseCallback":false,
"LimitIssuers":["4","4_1","11","15"],
"MetaReference":"fvidal@plexo.com.uy",
"OptionalMetadata":"Socio #17826",
"RedirectUri":"http://plexo.com.uy/callback/redirect",
"Type":0
}
},
"UTCUnixTimeExpiration":1532094228935 (4) ----> Fin área de firmado---
},
"Signature":"iUxW9w...WA=" (5)
}

El Objeto (2) Contiene información de ClientSignedRequest<Authorization>, envuelto por la estructura de Objeto (1) firmado (SignedObject).

El Fingerprint (3) indica con qué llave fue firmado el paquete (se obtiene del PFX generado por Plexo y que se debe instalar en el servidor del Cliente) y UTCUnixTimeExpiration (4) es la expiración de la firma (hasta cuando se debería confiar en el paquete firmado).

El signature (5) es el hash de (6) (la llave que encierra la información de Fingerprint, Object(2) y UTCUnixTimeExpiration). Debe considerarse que para la creación de Signature el objeto (6) fue previamente canonizado:

VER: Canonización de los JSON de Plexo para verificar las firmas.

Verificación de origen de paquetes

Canonización de los JSON de Plexo para verificar las firmas

  1. Se serializa el objeto Object (2) del JSON, hijo del objeto principal.

  2. Se ordenan alfabéticamente las propiedades del JSON, incluidos todos los hijos recursivamente (Cuando nos referimos alfabéticamente es usando el sentido de las computadoras, es decir 'a' minúscula es mayor que 'Z' mayúscula).

  3. Cualquier propiedad que sea nula no debe ser incluida en el firmado, aunque esta se encuentre en el objeto.

  4. Cualquier propiedad que no sea nullable debe ser incluida en el firmado, aunque esta no se encuentre en el objeto, en tal caso con el valor defecto. (ej: enteros).

  5. Para los campos de tipo enumerado se debe enviar el número asociado al mismo sin comillas.

  6. En el caso de fechas se asume ISO 8601 local, con la correcta zona horaria.

  7. Los números se deben pasar sin comillas.

  8. Cualquier espacio o indentación debe ser removido del JSON.

  9. Se agregan los valores del Fingerprint y UTCUnixTimeExpiration.

  10. Se transforma el resultado 'string' a un array de bytes usando UTF-8 para su verificación o firmado.

  11. En el caso de firmar el resultado de la firma se incluye en el campo Signature, usando base64.

En resumen, se debe firmar el contenido de (6) que incluye el Fingerprint (3), Object (2) y UTCUnixTimeExpiration (4). El resultado, se transforma en un array de bytes utilizando UTF-8, y se pasa a un string utilizando Base64. El valor resultante viaja en el campo Signature (5).

Last updated