wiki:notasVarias

Notas varias de desarrollo

Configuration.java

La configuración de digidoc4j se carga desde un archivo en formato yaml

El archivo de configuración se encuentra en: ./resources/digidoc4j.yaml

HowTo

PDF y biblioteca iText

Un documento PDF pude contener los siguientes tipos estándar de firmas:

  • una o más firmas de aprobación (approval).
  • Como máximo una firma certificada. Esta firma puede definir diferentes permisos.

Para definir el tipo de firma se debe establecer el nivel de certificación en la clase PdfSignatureAppearance.

PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
...
appearance.setCertificationLevel(certificationLevel);

El parámetro certificationLevel puede tomar uno de los siguientes valores:

  • NOT_CERTIFIED para crear una firma ordinaria tipo approval.
  • CERTIFIED_NO_CHANGES_ALLOWED para crear una firma de certificación también conocida como firma de autor. Después de aplicar la firma no se permitirán cambios sobre el documento.
  • CERTIFIED_FORM_FILLING crea una firma de certificación para el autor del documento pero otras personas pueden todavía llenar campos formulario o agregar firmas approval sin invalidar la firma.
  • CERTIFIED_FORM_FILLING_AND_ANNOTATIONS crea una firma de certificación para el autor del documento pero otras personas pueden todavía llenar campos formularios o agregar firmas approval así como anotaciones sin invalidar la firma.

Creación de TSL

Electronic Signatures and Infrastructures (ESI) Trusted Lists

ETSI TS 119 612 V1.2.1 (2014-04)

Error de Firefox al cargar un archivo PDF en un formulario

https://stackoverflow.com/questions/13272523/incorrect-content-type-for-pdf-file-with-firefox

http://kb.mozillazine.org/MimeTypes.rdf

http://www.fvue.nl/wiki/Wrong_mime-type_when_uploading_pdf

Editar el archivo /home/usuario/.mozilla/firefox/xxx.default/mimeTypes.rdf en la sección del mimetype PDF para que quede como se muestra a continuación:

<RDF:Description RDF:about="urn:mimetype:application/pdf"
                   NC:fileExtensions="pdf"
                   NC:description="documento PDF"
                   NC:value="application/pdf"
                   NC:editable="true">
    <NC:handlerProp RDF:resource="urn:mimetype:handler:application/pdf"/>
  </RDF:Description>

Firma de BDOC con SHA-256

Se debe agregar al archivo /usr/java/jdk1.7.0_21/jre/lib/security/java.security una entrada para BouncyCastle? (ver security.provider.2):

security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC

Recursos

/bdocs: ejecuta el proceso de presign de contenedor BDOC.

/bdocs/resenas: ejecuta el proceso de postsign de contenedor BDOC.

/bdocs/cargas: crea un contenedor BDOC con los archivos subidos del formulario, lo serializa y retorna el identificados unico del contenedor.

/bdocs/cargas/{containerId} : recibe los archivos enviador a través del formulario, deserializa el contenedor identificado con containerId, agrega los archivos al contenedor, serializa de nuevo el contenedor y retorna el identificador del contendor.

/bdocs/archivos/{containerId} : retorna el numero de dataFiles que se encuentran en un contenedor.

/bdocs/archivos/{containerId}/{dataFileId} : Descarga el archivo dataFileId que se encuentra dentro del contenedor containerId BDOC.

/bdocs/archivos/papelera/{containerId}/{dataFileId} : elimina el archivo dataFileId que se encuentra dentro del contenedor containerId BDOC.

/bdocs/archivos/lista/{containerId} : retorna información de los dataFile que se encuentran dentro del contenedor containerId BDOC. Esta información incluye el nombre del archivo, el tamaño y el tipo mime.

/bdocs/firmas/{containerId} : retorna el numero de firmas que tiene el contenedor.

/bdocs/firmas/pre : calcula el hash de un contenedor existente y lo retorna al cliente; el contenedor se serializa en el servidor para luego completar la firma.

/bdocs/firmas/post : inserta el hash cifrado en el cliente al contenedor para completar el proceso de firma del contenedor. Se almacena el contenedor firmado y se retorna al cliente el identificador del archivo para su posterior descarga.

Estadísticas de uso del servicio

Para mantener un registro básico de las estadísticas de uso del servicio Murachi se utiliza una base de datos Postgresql.

En el servidor donde se ejecuta el servicio se debe crear una base de datos de Postgresql con el siguiente nombre databasemurachi.

La estructura de la base de datos es la siguiente:

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.1.18
-- Dumped by pg_dump version 9.1.18
-- Started on 2015-09-22 13:27:07 VET

SET statement_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

--
-- TOC entry 167 (class 3079 OID 11645)
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- TOC entry 1886 (class 0 OID 0)
-- Dependencies: 167
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- TOC entry 162 (class 1259 OID 17070)
-- Dependencies: 5
-- Name: signatures; Type: TABLE; Schema: public; Owner: aaraujo; Tablespace: 
--

CREATE TABLE signatures (
    signature_id integer NOT NULL,
    type character(4) NOT NULL
);


ALTER TABLE public.signatures OWNER TO aaraujo;

--
-- TOC entry 166 (class 1259 OID 17086)
-- Dependencies: 5
-- Name: signatures_error; Type: TABLE; Schema: public; Owner: aaraujo; Tablespace: 
--

CREATE TABLE signatures_error (
    signature_error_id integer NOT NULL,
    type character(4) NOT NULL
);


ALTER TABLE public.signatures_error OWNER TO aaraujo;

--
-- TOC entry 165 (class 1259 OID 17084)
-- Dependencies: 166 5
-- Name: signatures_error_signature_error_id_seq; Type: SEQUENCE; Schema: public; Owner: aaraujo
--

CREATE SEQUENCE signatures_error_signature_error_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.signatures_error_signature_error_id_seq OWNER TO aaraujo;

--
-- TOC entry 1887 (class 0 OID 0)
-- Dependencies: 165
-- Name: signatures_error_signature_error_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: aaraujo
--

ALTER SEQUENCE signatures_error_signature_error_id_seq OWNED BY signatures_error.signature_error_id;


--
-- TOC entry 161 (class 1259 OID 17068)
-- Dependencies: 5 162
-- Name: signatures_signature_id_seq; Type: SEQUENCE; Schema: public; Owner: aaraujo
--

CREATE SEQUENCE signatures_signature_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.signatures_signature_id_seq OWNER TO aaraujo;

--
-- TOC entry 1888 (class 0 OID 0)
-- Dependencies: 161
-- Name: signatures_signature_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: aaraujo
--

ALTER SEQUENCE signatures_signature_id_seq OWNED BY signatures.signature_id;


--
-- TOC entry 164 (class 1259 OID 17078)
-- Dependencies: 5
-- Name: verifications; Type: TABLE; Schema: public; Owner: aaraujo; Tablespace: 
--

CREATE TABLE verifications (
    verification_id integer NOT NULL,
    type character(4) NOT NULL
);


ALTER TABLE public.verifications OWNER TO aaraujo;

--
-- TOC entry 163 (class 1259 OID 17076)
-- Dependencies: 164 5
-- Name: verifications_verification_id_seq; Type: SEQUENCE; Schema: public; Owner: aaraujo
--

CREATE SEQUENCE verifications_verification_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.verifications_verification_id_seq OWNER TO aaraujo;

--
-- TOC entry 1889 (class 0 OID 0)
-- Dependencies: 163
-- Name: verifications_verification_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: aaraujo
--

ALTER SEQUENCE verifications_verification_id_seq OWNED BY verifications.verification_id;


--
-- TOC entry 1763 (class 2604 OID 17073)
-- Dependencies: 162 161 162
-- Name: signature_id; Type: DEFAULT; Schema: public; Owner: aaraujo
--

ALTER TABLE ONLY signatures ALTER COLUMN signature_id SET DEFAULT nextval('signatures_signature_id_seq'::regclass);


--
-- TOC entry 1765 (class 2604 OID 17089)
-- Dependencies: 165 166 166
-- Name: signature_error_id; Type: DEFAULT; Schema: public; Owner: aaraujo
--

ALTER TABLE ONLY signatures_error ALTER COLUMN signature_error_id SET DEFAULT nextval('signatures_error_signature_error_id_seq'::regclass);


--
-- TOC entry 1764 (class 2604 OID 17081)
-- Dependencies: 164 163 164
-- Name: verification_id; Type: DEFAULT; Schema: public; Owner: aaraujo
--

ALTER TABLE ONLY verifications ALTER COLUMN verification_id SET DEFAULT nextval('verifications_verification_id_seq'::regclass);


--
-- TOC entry 1874 (class 0 OID 17070)
-- Dependencies: 162 1879
-- Data for Name: signatures; Type: TABLE DATA; Schema: public; Owner: aaraujo
--

COPY signatures (signature_id, type) FROM stdin;
\.


--
-- TOC entry 1878 (class 0 OID 17086)
-- Dependencies: 166 1879
-- Data for Name: signatures_error; Type: TABLE DATA; Schema: public; Owner: aaraujo
--

COPY signatures_error (signature_error_id, type) FROM stdin;
\.


--
-- TOC entry 1890 (class 0 OID 0)
-- Dependencies: 165
-- Name: signatures_error_signature_error_id_seq; Type: SEQUENCE SET; Schema: public; Owner: aaraujo
--

SELECT pg_catalog.setval('signatures_error_signature_error_id_seq', 1, false);


--
-- TOC entry 1891 (class 0 OID 0)
-- Dependencies: 161
-- Name: signatures_signature_id_seq; Type: SEQUENCE SET; Schema: public; Owner: aaraujo
--

SELECT pg_catalog.setval('signatures_signature_id_seq', 1, false);


--
-- TOC entry 1876 (class 0 OID 17078)
-- Dependencies: 164 1879
-- Data for Name: verifications; Type: TABLE DATA; Schema: public; Owner: aaraujo
--

COPY verifications (verification_id, type) FROM stdin;
\.


--
-- TOC entry 1892 (class 0 OID 0)
-- Dependencies: 163
-- Name: verifications_verification_id_seq; Type: SEQUENCE SET; Schema: public; Owner: aaraujo
--

SELECT pg_catalog.setval('verifications_verification_id_seq', 1, false);


--
-- TOC entry 1771 (class 2606 OID 17091)
-- Dependencies: 166 166 1880
-- Name: signatures_error_pkey; Type: CONSTRAINT; Schema: public; Owner: aaraujo; Tablespace: 
--

ALTER TABLE ONLY signatures_error
    ADD CONSTRAINT signatures_error_pkey PRIMARY KEY (signature_error_id);


--
-- TOC entry 1767 (class 2606 OID 17075)
-- Dependencies: 162 162 1880
-- Name: signatures_pkey; Type: CONSTRAINT; Schema: public; Owner: aaraujo; Tablespace: 
--

ALTER TABLE ONLY signatures
    ADD CONSTRAINT signatures_pkey PRIMARY KEY (signature_id);


--
-- TOC entry 1769 (class 2606 OID 17083)
-- Dependencies: 164 164 1880
-- Name: verifications_pkey; Type: CONSTRAINT; Schema: public; Owner: aaraujo; Tablespace: 
--

ALTER TABLE ONLY verifications
    ADD CONSTRAINT verifications_pkey PRIMARY KEY (verification_id);


--
-- TOC entry 1885 (class 0 OID 0)
-- Dependencies: 5
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


-- Completed on 2015-09-22 13:27:07 VET

--
-- PostgreSQL database dump complete
--


En el servidor se debe cargar el script sql anterior en la base de datos creada previamente.

Para obtener un JSON con las estadísticas básicas del servicio se utiliza el siguiente recurso: https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/estadisticas. Por ejemplo:

{"numeroDeFimasIncompletas":"0","numeroDeVerificaciones":"0","numeroDeFirmasEjecutadas":"3"}

Conectarse como postgres

su postgres

Crear un usuario con privilegios para crear una base de datos

createuser -P aaraujo

Crear una base de datos

createdb -O aaraujo databasemurachi

Asignar privilegios del usuario a la base de datos

psql

GRANT ALL PRIVILEGES ON DATABASE databasemurachi TO aaraujo;

Cargar script sql

psql -U postgres -f murachi.sql -d databasemurachi
Last modified 9 years ago Last modified on Sep 22, 2015, 1:42:59 PM

Attachments (5)