USANDO NODE.JS PARA FIRMA DIGITAL

nodejs-new-pantone-black

Teniendo en vigencia en Bolivia el Decreto Supremo N° 1793 que aprueba el Reglamento a la Ley N° 164, que en su Capitulo I, se refiere a Certificado y Firma Digital, conociendo además de la importancia de usar los certificados digitales dentro de una infraestructura de clave publica.

El presente articulo propone usar Node.js, para el acceso y administración en el token y el firmado digital.

Cabe señalar que para las pruebas realizadas, se utilizó el token de marca ePass2003.

Conceptos generales utilizados

Public Key Infrastructure (PKI), es una combinación de hardware y software, políticas y procedimientos de seguridad que permiten la ejecución con garantías de operaciones criptográficas como el cifrado, la firma digital o el no repudio de transacciones electrónicas.

Certificate Signing Request (CSR),o también conocido como Certification Request, es un mensaje enviado desde un solicitante de una autoridad de certificación con el fin de solicitar un certificado de identidad digital.

Clave Publica de Certificados (CRT), formato de exportación de clave pública de certificados digitales.

OpenSC, es un conjunto de herramientas de software y bibliotecas para trabajar con tarjetas inteligentes, con énfasis en tarjetas inteligentes con capacidades criptográficas. OpenSC alivia la autenticación, cifrado y firmas digitales. OpenSC implementa APIS para PKCS # 15 y PKCS # 11.

Hardware Security Module (HSM), es un dispositivo criptográfico basado en hardware que genera, almacena y protege claves criptográficas y suele aportar aceleración hardware para operaciones criptográficas.

Public Key Cryptography Standards (PKCS), son un grupo de estándares de criptografía de clave pública elaborado y publicado por RSA Security Inc.

PKCS 11, interfaz de dispositivo criptográfico («Cryptographic Token Interface» o cryptoki), Define un API genérico de acceso a dispositivos criptográficos, entre los mas usuales se tiene son los token, tarjetas inteligentes.

PKCS 15, estándar de formato de información de dispositivo criptográfico, que define un estándar que permite a los usuarios de dispositivo criptográficos identificarse con aplicaciones independientemente de la implementación del PKCS#11 (crytoki) u otro API.

Acceso al token desde NODE.JS

Dentro las alternativas exploradas para el acceso a Node.js, se puede mencionar las siguientes:

Llamar a comandos de pkcs11-tool desde Node.js

Usando el conjunto de librerías y utilidades proveídas por OpenSC que facilitan acciones en firmas digitales, implementando la API PKCS # 11 y PKCS # 15, se utilizó el siguiente segmento de código que de manera inicial lista los objetos:

var shell = require('shelljs/global');
var MODULE = '/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so';
var PASS = '*********';
var COMMAND = 'pkcs11-tool --module '+MODULE+' --login --list-objects --pin '+PASS;
var result = exec(COMMAND);

Donde podemos ver el resultado de la siguiente manera:

i1

Emplear librería

Dentro las diferentes librerías npm que brindan servicios a tokens, se realizo las pruebas con Graphene, que como indica la descripción del autor es una interfaz estándar para interactuar con dispositivos de cifrado de hardware tales como tarjetas inteligentes y módulos de seguridad de hardware (HSM).

Y mediante el siguiente segmento de código nos muestra de manera muy general el slot en el cual se esta trabajando:

var lib = "/usr/lib/softhsm/libsofthsm.so";
var graphene = require("graphene-pk11");
var Module = graphene.Module;

var mod = Module.load(lib, "SoftHSM");
mod.initialize();
// get slots
var slots = mod.getSlots(true);
if (slots.length > 0) {
  for (var i = 0; i < slots.length; i++) {
    var slot = slots.items(i);
    console.log("Slot #" + slot.handle);
    console.log("\tDescription:", slot.slotDescription);
    console.log("\tSerial:", slot.getToken().serialNumber);
    console.log("\tPassword(min/max): %d/%d", slot.getToken().minPinLen, slot.getToken().maxPinLen);
    console.log("\tIs hardware:", !!(slot.flags & graphene.SlotFlag.HW_SLOT));
    console.log("\tIs removable:", !!(slot.flags & graphene.SlotFlag.REMOVABLE_DEVICE));
    console.log("\tIs initialized:", !!(slot.flags & graphene.SlotFlag.TOKEN_PRESENT));
    console.log("\n\nMechanisms:");
    console.log("Name h/s/v/e/d/w/u");
    console.log("========================================");
    function b(v) {
      return v ? "+" : "-";
    };
    function s(v) {
      v = v.toString();
      for (var i_1 = v.length; i_1 < 27; i_1++) {
        v += " ";
      }
      return v;
    };
    var mechs = slot.getMechanisms();
    for (var j = 0; j < mechs.length; j++) {
      var mech = mechs.items(j);
      console.log(s(mech.name) +
        b(mech.flags & graphene.MechanismFlag.DIGEST) + "/" +
        b(mech.flags & graphene.MechanismFlag.SIGN) + "/" +
        b(mech.flags & graphene.MechanismFlag.VERIFY) + "/" +
        b(mech.flags & graphene.MechanismFlag.ENCRYPT) + "/" +
        b(mech.flags & graphene.MechanismFlag.DECRYPT) + "/" +
        b(mech.flags & graphene.MechanismFlag.WRAP) + "/" +
        b(mech.flags & graphene.MechanismFlag.UNWRAP));
    }
  }
}
mod.finalize();

i2

Librerías Java

Conjunto de librerías desarrolladas en Java y que pueden servir para la interacción con Node y se encuentran publicadas en https://gitlab.geo.gob.bo/bid/firma-digital.

var java = require("java");
java.classpath.push("GestionToken-1.jar/");

var Principal = java.import("adsib.gob.bo.app.Principal");
Principal.main([""], function(error){
  console.log(error);
});

i3

Acciones alternativas para interactuar con el token

Interactuar directamente con C mediante paquetes como ffi

Que como indica la web del autor, node-ffi es un complemento para Node.js, para la carga y llamado a las bibliotecas dinámicas utilizando JavaScript. Puede ser utilizado para crear enlaces a bibliotecas nativas sin necesidad de ecribir codigo C ++.

Emplear librería Bullwark

Que al igual que Graphene es un complemento de Node.js nativa que utiliza RSA PKCS # 11 para realizar operaciones criptográficas.

El mismo proporciona una capa para C, lo que permite evitar escribir el add-on en C++.

Adicionalmente Node.js permite realizar los siguiente:

Firmado XML con NODE.js con xml-crypto

Que permite firmar digitalmente y cifrar bajo Node.js.

Generación de CRT con Node.js con apeman-crt

Descripción: Genera Certificados, solicitando los datos necesarios.

También una alternativa para la presentación es utilizar Electrón, que permite escribir aplicaciones multiplataforma utilizando JavaScript, HTML y CSS.

Además de generar ejecutables para:

Windows (32/64 bit)
OS X
Linux (x86/x86_64)

Otras alternativas para la interacción con el token

Para terminar, podríamos indicar que existen otros lenguajes de programación que se llevan bien para la interacción de tokens y proyectos desarrollados en Python como pyscard y pkcs11wrap.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *