Cómo usar Firma Digital en SICOP desde GNU/Linux

Para quien utilice el sitio web del SICOP sabrá que se hace uso de un componente de firma. Este componente en la actualidad se ha publicado para Windows y macOS pero también funciona en GNU/Linux y no sería necesario usar Windows para estas tareas.

Para hacerlo funcionar, se pueden seguir los siguientes pasos:

  • Para que el componente inicie, ha de existir una carpeta llamada Documents dentro de nuestra carpeta de usuario (algo así como /home/tunombredeusuario/Documents/). La forma universal para crearla es mediante el comando mkdir ~/Documents (ojo porque es Documents, no Documentos).
  • Dirigirse al sitio web del Componente Firma, www.componentefirmacr.go.cr.
  • Clic en Descargas, clic en el botón Seleccionar a la derecha del Instalador Mac OS X (no importa si es para Mac aunque tengamos GNU/Linux).
  • Pedirá una dirección de correo electrónico por si se quieren recibir notificación de actualizaciones. Finalmente clic en Descargar.
  • Una vez descargado, el fichero Componente_Firma.pkg se puede desempaquetar con doble clic en Nautilus del entorno de escritorio GNOME. Si se utiliza otro entorno y la herramienta de descompresión no reconoce archivos pkg (xar) se puede descomprimir con la herramienta xar mediante xar -xf Componente_Firma.pkg. Se creará una carpeta Componente_Firma.
  • Doble clic en la carpeta y dentro habrá una carpeta llamada Main.pkg.
  • Doble clic en la carpeta y dentro habrá un archivo comprimido llamado Payload.
  • En Nautilus en algunos escritorios se puede desempaquetar con doble clic o se abrirá una herramienta de descompresión. Si no, se puede hacer clic secundario -> Extraer a… y elegir por ejemplo la carpeta actual, donde creará una carpeta Payload (1) o similar. También se puede descomprimir de la forma tradicional con cat Payload | gunzip -dc |cpio -i.
  • Doble clic en la carpeta descomprimida de Payload y aparecerá otra carpeta dentro llamada Componente_Firma.app.
  • Doble clic en la carpeta Componente_Firma.app y aparecerá otra carpeta dentro llamada Contents.
  • Doble clic en la carpeta Contents y aparecerán varias carpetas, entre ellas una llamada Java.
  • Doble clic en la carpeta Java. Aparecerá un archivo llamado MerlinkSignMV.jar.
  • En algunos sistemas se puede lanzar el jar con doble clic (Ubuntu) y se quedará cargado en memoria (no se abre ninguna ventana), en otros se puede lanzar desde la terminal con java -jar MerlinkSignMV.jar. Hay que ha ejecutarlo con java 8, no es compatible con la versión 11.

Tras realizar estos pasos se debería poder cargar el sitio web de SICOP en el navegador Chromium. En Firefox también funciona si se agrega la siguiente línea en el fichero /etc/hosts del sistema, ya que a partir de la versión 66 no permite la conexión desde un sitio web seguro (HTTPS) a local inseguro por websockets:

127.0.0.1   service.componentefirmacr.go.cr

Eso es todo. Ya se podrá iniciar sesión y hacer uso de Firma Digital para las operaciones habituales de la plataforma.

33 comentarios en “Cómo usar Firma Digital en SICOP desde GNU/Linux

  1. Juan Carlos:

    Hola sigo los pasos y me da este error:

    Error: Unable to access jarfile MerlinkSignMV.jar

    1. Francisco de la Peña:

      Hola Juan Carlos, si estás desde ubuntu, creo que los jar hay que marcarlos como ejecutables. Para ello, una vez el jar está fuera de la carpeta comprimida, hay que hacer clic secundario (clic derecho para diestros) y elegir Propiedades, allí en permisos hay que marcar la casilla de fichero ejecutable y aceptar. De esta forma debería poderse ejecutar con doble clic. También como requerimiento hay que tener instalado Java (sudo apt install default-jre).

      1. Juan Carlos:

        Muchísimas gracias! Esta increíble tu blog, varios post me han ayudado y el firmador digital que hicistes me fue de mucha utilidad. El lunes pruebo lo que me indicas ya que fue la máquina del trabajo que formatee para meterme en el mundo de Linux

        1. Francisco de la Peña:

          Gracias Juan Carlos, con mucho gusto. Si hay cualquier otro inconveniente me avisas. Quiero mejorar la documentación tanto para usuarios finales como también para desarrolladores para que las implementaciones que se usen en el país firmen o validen correctamente.

      1. Francisco de la Peña:

        Genial, muchísimas gracias valarauco, efectivamente funciona. Para uso personal y pruebas he montado esta línea a partir de tu script para descargar el pkg:
        curl http://www.componentefirmacr.go.cr/componenteFirmaCR/DownloadFile?hidden_seq=`curl --no-progress-meter http://www.componentefirmacr.go.cr/componenteFirmaCR/controladores.jsp | grep -E -m 1 -o "'([0-9]+)'" | tr -d "''"` -o Componente_Firma.pkg
        El dominio se puede sustituir por http://www.sicop.go.cr para usarlo por HTTPS. Lamentablemente hay distribuciones en las que curl y wget no reconocen el certificado por defecto y hacer la descarga un poco más segura podría requerir incrementar la complejidad del script y averiguar qué parámetros pueden ayudar, sin ignorar la confianza del certificado, para permitir la descarga de forma más confiable.
        Saludos.

  2. Adriana Díaz:

    Agradecemos mucho la información brindada.
    En Ubuntu 16 funciona pura vida, pero algo pasa en Ubuntu 18, en SICOP reconoce la tarjeta, el usuario, pide clave pero al validar se queda congelado y no hace nada.
    Tienen idea qué puede ser?
    Agradezco de antemano su ayuda.

    1. Francisco de la Peña:

      Gracias Adriana, habría que verificar la versión de java que se está usando, con java -version, quizás dé problemas con Java 11 y funcione con Java 8, ya que hay un cambio en la forma de acceder a módulos PKCS#11.

    2. Francisco de la Peña:

      Hola de nuevo, quizás esto ayude en la comunicación:

      Edite el fichero /etc/hosts y agregue la línea:

      127.0.0.1 service.componentefirmacr.go.cr

      1. Adriana Díaz:

        Hola, muchos éxitos en este 2020!!! gracias por tus respuestas.
        Probé lo del hosts y sigue igual, qué mal… gracias por tu ayuda… saludos

        1. Francisco de la Peña:

          Hola Adriana, gracias, igualmente. He probado con Ubuntu 18.04 LTS y me he topado con que Firefox por alguna razón extraña me falla al reconocer el certificado de GoDaddy de sicop.go.cr y eso quizás esté bloqueando la comunicación con websocket de alguna forma (Firefox en Fedora 31 sí me funcoina bien), pero con Chromium (sudo apt install chromium-browser) sí me está funcionando en esa versión de Ubuntu sin problemas. Le he enviado un pantallazo por correo con la muestra. Saludos.

    3. Francisco de la Peña:

      Otra posibilidad en que si se queda congelado con la versión vieja de libASEP11.so es porque hay que usar Java 8, para ello: instalar java 8 con “sudo apt install openjdk-8-jre” y luego si no se quiere eliminar Java 11, ejecutar: “sudo update-alternatives –config java” y elegir el número de opción correspondiente a la línea de Java 8. Entonces relanzar el comando “java -jar MerlinkSignMV.jar” y ya no fallará con excepción, ya que es incompatible con Java 11. Saludos.

  3. Gerardo Solís E:

    Acabo de instalar e ingresar a Sicop por Ubunto 18.04 y funciona perfectamente. Muchas gracias

  4. marcovx:

    me funcionó mas o menos bien cuando la pagina lo reconoce y me pide un “certificado” ya sea tarjeta /o archivo luego un PIN, que debo hacer acá ?

    1. Francisco de la Peña:

      Hola marcovx, en la actualidad creo que se inicia sesión con Firma Digital, por lo tanto se usa tarjeta y por tanto cuando solicita el PIN se ingresa la contraseña numérica de la tarjeta de Firma Digital, que deberá estar conectada al lector. Allí se podrá seleccionar el certificado de la tarjeta y el PIN es necesario para firmar el ingreso.

    2. marcovx:

      Lo hice con ubuntu y me va resultando con chrome ,ingreso bien a sicop y llego a una parte donde me pide un archivo / una tarjeta / pin, donde obtengo eso ?

      1. Krizthian:

        A mi me pasa igual. Aparece la ventana de “login” pero no reconoce el la tarjeta conectada. Sin embargo, al ejecutar el fimador_bccr si la reconoce, por ende no sería un problema de “reconocimiento del dispositivo y/o tarjeta”.

        1. Francisco de la Peña:

          Buenas, he recibido reportes de que el firmador del BCCR bloquea el acceso a Firma Digital en otros programas y que desactivándolo temporalmente se resuelve este inconveniente. ¿Podrían confirmar si esto lo resuelve?

  5. Marco Arias:

    Hola buenos días traté de seguir sus recomendaciones pero no me reconoce la tarjeta, estoy usando Ubuntu 20.4 con chrome version 92.0.4515.131 y baje la el paquete 3.0.10 del componente de la firma electronica y cuanto ejecuto desde el terminal el archivo .jar genera lo siguiente:
    java.io.IOException: /usr/lib/libASEP11.so: clase ELF errónea: ELFCLASS32/usr/lib/libASEP11.so
    at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
    at sun.security.pkcs11.wrapper.PKCS11.(PKCS11.java:144)
    at sun.security.pkcs11.wrapper.PKCS11$SynchronizedPKCS11.(PKCS11.java:1623)
    at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:159)
    at services.core.device.model.b.b(Unknown Source)
    at services.core.device.model.b.a(Unknown Source)
    at controller.a.c(Unknown Source)
    at controller.b.a(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.jetty.websocket.common.events.annotated.CallableMethod.call(Unknown Source)
    at org.eclipse.jetty.websocket.common.events.annotated.OptionalSessionCallableMethod.call(Unknown Source)
    at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextMessage(Unknown Source)
    at org.eclipse.jetty.websocket.common.message.SimpleTextMessage.messageComplete(Unknown Source)
    at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.appendMessage(Unknown Source)
    at org.eclipse.jetty.websocket.common.events.JettyAnnotatedEventDriver.onTextFrame(Unknown Source)
    at org.eclipse.jetty.websocket.common.events.AbstractEventDriver.incomingFrame(Unknown Source)
    at org.eclipse.jetty.websocket.common.WebSocketSession.incomingFrame(Unknown Source)
    at org.eclipse.jetty.websocket.common.extensions.ExtensionStack.incomingFrame(Unknown Source)
    at org.eclipse.jetty.websocket.common.Parser.notifyFrame(Unknown Source)
    at org.eclipse.jetty.websocket.common.Parser.parse(Unknown Source)
    at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(Unknown Source)
    at org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(Unknown Source)
    at org.eclipse.jetty.io.AbstractConnection$2.run(Unknown Source)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(Unknown Source)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)
    java.lang.NullPointerException

    agradezco la ayuda

    1. Francisco de la Peña:

      Buenos días Marco, es posible que la arquitectura de procesador de la librería (libASEP11.so) no corresponda con la de Java. Si el sistema es de 64 bit y Java también, entonces hay que usar una versión de la librería de 64 bit.
      Intente ejecutar el comando:
      hostnamectl
      Para saber qué arquitectura tiene su sistema Ubuntu. Gracias.

      1. Marco Arias:

        Muchas gracias Francisco, mi sistema es de bits, donde puedo conseguir la libreria faltante?
        gracias por tu respuesta

          1. Marco Arias:

            gracias por la guía, pero sigue con el mismo error y lo curioso es que el IDProtect si reconoce la tarjeta… pero el chrome no…

            1. Francisco de la Peña:

              ¿Podría revisar si la librería en la ruta indicada por Chrome es de 64 bit? Con el siguiente comando en una terminal:
              file /usr/lib/libASEP11.so
              Si no se trata de un enlace simbólico debería indicar que es de 64 bit, de lo contrario habría que reemplazarla.
              El IDProtect Pintool es posible que esté tomando la librería de la ruta /usr/lib/x64-athena/libASEP11.so que probablemente sí es de 64 bit.
              La guía lo que indica es crear un enlace simbólico en /usr/lib desde la ubicación original de esa librería. Si ya existiera, es posible que haya que eliminar el fichero existente antes de crear el enlace simbólico con el comando ln -s
              Saludos.

              1. Marco Arias:

                Excelente Francisco!!!!! ya funciona!!!! muchas gracias llevo desde las 9am pegado en esto 10.000.000.000 de gracias

  6. Marco Chacon:

    Instalador en MacOS Monterry
    Un detalle a compartir: “El IDProtect Pintool es posible que esté tomando la librería de la ruta /usr/lib/x64-athena/libASEP11.so que probablemente sí es de 64 bit.”
    Efectivamente, tengo configurado el Adode para firmar documentos, entonces para usar SICOP tuve que cerrar el Adobe. Me funciona sin problemas. Muchas gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada.