Saltearse al contenido

@nodecfdi/credentials

Esta librería ha sido creada para poder trabajar con los archivos CSD y FIEL del SAT. De esta forma, se simplifica el proceso de firmar, verificar firma y obtener datos particulares del archivo de certificado así como de la llave pública.

  • El CSD (Certificado de Sello Digital) es utilizado para firmar Comprobantes Fiscales Digitales.

  • La FIEL (o eFirma) es utilizada para firmar electrónicamente documentos (generalmente usando XML-SEC) y está reconocida por el gobierno mexicano como una manera de firma legal de una persona física o moral.

Con esta librería no es necesario convertir los archivos generados por el SAT a otro formato, se pueden utilizar tal y como el SAT los entrega.

Esta librería ha sido inspirada por la versión para php https://github.com/phpcfdi/credentials

Primeros pasos

Está libreria tiene peerDependencies luxon por lo que es recomendable instalarlas previo a instalar la libreria credentials.

Instalación

Para comenzar a utilizar la libreria lo primero que hay que hacer es instalarla, corre el siguiente comando en tu terminal:

Ventana de terminal
npm i @nodecfdi/credentials --save

Con esto ya tendremos la libreria instalada y lista para ser usada.

Uso básico

Para usarla basicamente es muy parecido entre la variante ServerSide y la variante ClientSide, difiere en que el modo ServerSide se puede guardar archivos directamente en un path especificado o leer desde el path especificado, en cambio en ClientSide solo se puede obtener el base64 o el raw String y construir desde un string binary.

Uso ServerSide

import { readFileSync } from 'node:fs';
import { Credential } from '@nodecfdi/credentials/node';
const certFilePath = 'file/certificado.cer';
const keyFilePath = 'file/certificado.key';
const passPhrase = '12345678a'; // Contraseña para abrir la llave privada
const fiel = Credential.openFiles(certFilePath, keyFilePath, passPhrase);
const sourceString = 'Texto a firmar';
const signature = fiel.sign(sourceString);
console.info(signature);
const verify = fiel.verify(sourceString, signature);
console.info(verify);
const certificado = fiel.certificate();
console.info(certificado.rfc()); // RFC del certificado
console.info(certificado.legalName()); // Nombre del propietario del certificado
console.info(certificado.branchName()); // Nombre de la sucursal (en CSD, FIEL está vacia)
console.info(certificado.serialNumber().bytes()); // Número de serie del certificado

Uso ClientSide

import { Credential } from '@nodecfdi/credentials/browser';
const readFileAsync = async (file: File): Promise<string> => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function (evt) {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsBinaryString(file);
});
};
const certificate = document.getElementById('certificateUpload').files[0];
const privateKey = document.getElementById('privateKeyUpload').files[0];
const certContent = await readFileAsync(certificate);
const keyContent = await readFileAsync(privateKey);
const passPhrase = '12345678a';
const fiel = Credential.create(certContent, keyContent, passPhrase);
const sourceString = 'Texto a firmar';
const signature = fiel.sign(sourceString);
console.info(signature);
const verify = fiel.verify(sourceString, signature);
console.info(verify);
const certificado = fiel.certificate();
console.info(certificado.rfc()); // RFC del certificado
console.info(certificado.legalName()); // Nombre del propietario del certificado
console.info(certificado.branchName()); // Nombre de la sucursal (en CSD, FIEL está vacia)
console.info(certificado.serialNumber().bytes()); // Número de serie del certificado