@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:
npm i @nodecfdi/credentials --save
pnpm add @nodecfdi/credentials
yarn add @nodecfdi/credentials
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 certificadoconsole.info(certificado.legalName()); // Nombre del propietario del certificadoconsole.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 certificadoconsole.info(certificado.legalName()); // Nombre del propietario del certificadoconsole.info(certificado.branchName()); // Nombre de la sucursal (en CSD, FIEL está vacia)console.info(certificado.serialNumber().bytes()); // Número de serie del certificado