Implementación del Motor de Firma Digital - Refirma Invoker Integration - del RENIEC
Refirma Invoker es parte de la ReFirma Suite y su uso es gratuito para las Entidades Públicas del Perú, su funcionamiento lo puede ver acá
La versión v1.1.7 es el último lanzamiento
Para mayor información de esta implementación puede ver en el siguiente video
En caso conozcas Java revisa la implementación de Refirma Invoker construido con Java acá
- Soporte para firmar varios documentos (ReFirma PCX)
- Api Rest, puede integrarse en cualquier proyecto web (Php, Python, Java, etc)
- Json Web Tokens (JWT)
- Soporte para protocolo https (SSL/TLS)
- Un paper https://cutt.ly/yN0cAXL
- Refirma Suite https://bit.ly/2ktJRY2
- Guía de integración invoker https://bit.ly/34wctnn
- Argumentos invoker https://bit.ly/2J5nDHY
Para ejecutar Refirma Invoker Integration es necesario que el Representante de la Entidad Pública firme digitalmente un contrato que se encuentra en la Plataforma EREP luego debe de enviar un correo a identidadigital@reniec.gob.pe solicitando la creación de los identificadores [clientId] y [clientSecret] para el uso de Refirma Invoker en el Sistema de Gestión Documental de su institución.
- Levantamos un contenedor de refirma-invoker
docker run -d --name refirma-invoker -p 80:80 -p 9091:9091 -e CLIENT_ID=mi_client_id -e CLIENT_SECRET=mi_cliente_secret jumanor/refirma-invoker:1.0.0
- Probamos el example01 (el proceso de firma de los clientes solo esta disponible para Sistema Operativo Windows)
http://127.0.0.1/example01/test.html
Esta disponible un video de la instalación en el siguiente enlace
Esta implementación usa 7-zip que normalmente ya viene instalada en LINUX; sin embargo, en WINDOWS tendra que instalar manualmente y verificar que se puede acceder desde el terminal.
Windows
C:\Users\Jumanor>7z i
Linux
jumanor@ubuntu:~$7z i
Para instalar 7z en Centos 7 seguir los siguientes pasos:
- Abrir un terminal
- yum install epel-release (instalamos repositorio epel)
- yum install p7zip (instalamos p7zip)
- ln -s /usr/bin/7za /usr/bin/7z (creamos enlace simbolico a 7z)
Para instalar 7z en Windows 10 seguir los siguientes pasos:
- Descargar e instalar 7z de aquí
- La ruta de instalacion por defecto es C:\Program Files\7-Zip
- Abrir un cmd (simbolo de sistema o consola de comandos)
- setx path "%path%;C:\Program Files\7-Zip" (actualizamos la variable de entorno path)
Se compilo Refirma Invoker Integration para Windows y Linux, y estan disponibles en los releases.
-
Descargue el ejecutable
Windows 64-bit: main.exe
Linux 64-bit: main
-
Copia la carpeta public del repositorio esta contiene 2 imagenes: iFirma.png e iLogo.png
-
Crea un archivo config.properties con los siguientes parametros :
# Identificador proporcionado por RENIEC clientId=K57845459hkj # Identificador proporcionado por RENIEC clientSecret=TYUOPDLDFDG # Direccion Ip y Puerto de escucha ReFirma Invoker Integration serverAddress=0.0.0.0:9091 # Clave secreta para generar Tokens secretKeyJwt=muysecretokenjwt # Usuario que accedera a la API userAccessApi=usuarioAccesoApi # Tiempo de expiración del Token en minutos. Ejemplo 5 minutos (Opcional) timeExpireToken=5 # Maximo tamaño del archivo 7z en bytes. Ejemplo 10 megas (Opcional) maxFileSize7z=10485760 # Certificado SSL/TLS (Opcional) #certificateFileTls=C:\Users\jumanor\cert.pem #certificateFileTls=/home/jumanor/cert.pem # Clave Privada SSL/TLS (Opcional) #privateKeyFileTls=C:\Users\jumanor\key.pem #privateKeyFileTls=/home/jumanor/key.pem
-
En caso desee habilitar protocolo https es necesario que ingrese los siguientes parametros :
# Certificado SSL/TLS (Opcional) certificateFileTls=/etc/letsencrypt/live/midominio.com/fullchain.pem # Clave Privada SSL/TLS (Opcional) privateKeyFileTls=/etc/letsencrypt/live/midominio.com/privkey.pem
-
Ejecuta ReFirma Invoker Integration
Windows
main.exe
Linux
./main
Estan disponibles videos del funcionamiento (ejemplos) en los siguientes enlaces: enlace1.
Refirma Invoker usa Microsoft Click Once para invocar a Refirma PCX.
-
Si esta usando navegador Chome o Firefox instala los siguientes plugins para habilitar Microsoft Click Once:
-
En caso use el navegador Edge no es necesario instalar nada adicional (Recomendable).
-
Copia la carpeta example de este repositorio en un Servidor Web (ver el siguiente video para mayor detalle)
3.1. En caso use Visual Studio Code instale el plugin Live Server que habilita un Servidor Web Embebido (Recomendable).
-
Ingresa a cualquier ejemplo que desee probar ejecutando http://a.b.c.d/example01/test.html
A continuación un manera simplicada del uso de Refirma Invoker Integration con JavaScript del lado del Cliente:
//Listamos los documentos que se desean firmar digitalmente
let pdfs=[];
pdfs[0]={url:"http://miservidor.com/docs1.pdf",name:"doc1"};
pdfs[1]={url:"http://miservidor.com/docs2.pdf",name:"doc2"};
//Enviamos la posicion en donde se ubicara la representación gráfica de la firma digital
let firmaParam={};
firmaParam.posx=10;
firmaParam.posy=12;
firmaParam.reason="Soy el autor del documento pdf";
firmaParam.stampSigned="http://miservidor.com/estampillafirma.png";//parametro opcional
firmaParam.pageNumber=0; //parametro opcional, pagina donde se pondra la firma visible
//Llamamos a Refirma Invoker Integration con la dirección ip en donde se ejecuta main.exe o main
let firma=new RefirmaInvoker("http://192.168.1.10:9091");
//Muy importante !!!
//El Sistema de Gestion Documental se encarga de la autenticación y envía un token al Cliente
//Este método se usa solo como demostración no se debe de usar en el Cliente
let token=await firma.autenticacion("usuarioAccesoApi");
//Realiza el proceso de Firma Digital
let url_base=await firma.ejecutar(pdfs,firmaParam,token);
//En este caso obtenemos los documentos firmados digitalmente y los enviamos a un frame
document.getElementById("frame1").src=url_base+"/"+encodeURI("doc1")+"/"+encodeURI(token);
document.getElementById("frame2").src=url_base+"/"+encodeURI("doc2")+"/"+encodeURI(token);
Esta implementación de Refirma Invoker Integration se puede usar en cualquier proyecto web (Php, Java, Python, etc) solo tiene que consumir las Api Rest implementadas, para controlar el acceso se usa JSON Web Tokens (JWT)
El Sistema de Gestión Documental autentica a los Usuarios normalmente contra una Base de Datos, despues de la autencación satisfactoria se debe de consumir el API REST /autenticacion de ReFirma Invoker y enviar el token al Cliente.
A continuacion algunos ejemplos de captura del token de autenticación:
Ejemplo con Python
import requests
import json
api_url = "http://127.0.0.1:9091/autenticacion"
param={"usuarioAccesoApi":"usuarioAccesoApi"}
response = requests.post(api_url,json=param)
if response.status_code == 200:
token=response.json().get("data")
print(token)
Ejemplo con Php
$params=array("usuarioAccesoApi"=>"usuarioAccesoApi");
$postdata=json_encode($params);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/json',
'content' => $postdata
)
);
$context = stream_context_create($opts);
@$response = file_get_contents("http://127.0.0.1:9091/autenticacion", false, $context);
if(isset($http_response_header) == true){
$status_line = $http_response_header[0];
preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);
$status = $match[1];
if ($status == 200){
$obj=json_decode($response,true);
$token=$obj["data"];
echo $token;
}
}
Por favor contribuya usando Github Flow. Crea un fork, agrega los commits, y luego abre un pull request.
Copyright © 2022 Jorge Cotrado.
This project is MIT licensed.