== Notas varias de desarrollo == [https://github.com/open-eid/digidoc4j/blob/master/src/org/digidoc4j/Configuration.java Configuration.java] La configuración de digidoc4j se carga desde un archivo en formato [https://es.wikipedia.org/wiki/YAML yaml] El archivo de configuración se encuentra en: {{{./resources/digidoc4j.yaml}}} [https://github.com/open-eid/digidoc4j/blob/master/src/prototype/HowTo.java 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 == [http://www.etsi.org/deliver/etsi_ts/119600_119699/119612/01.02.01_60/ts_119612v010201p.pdf Electronic Signatures and Infrastructures (ESI) Trusted Lists] ETSI TS 119 612 V1.2.1 (2014-04) [[Image(tsl.png)]] == 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: {{{ }}} == 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 }}}