Changeset ce3da18 in murachi


Ignore:
Timestamp:
Jun 30, 2015, 6:04:15 PM (9 years ago)
Author:
antonioaraujob <aaraujo@…>
Branches:
master
Children:
b1392c3
Parents:
aa89290
Message:

Modificaciones para soportar la firma electrónica de archivos de cualquier tipo usando un contenedor BDOC.

Location:
murachi/src/main
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • murachi/src/main/java/ve/gob/cenditel/murachi/MurachiRESTWS.java

    raa89290 rce3da18  
    369369         * @apiSuccess {String} fileId Identificador único del archivo en el servidor
    370370         * @apiSuccess {Boolean} fileExist El archivo se cargó exitosamente en el servidor.
     371         * @apiSuccess {String} mimeType Tipo MIME del archivo verificado.
    371372         * @apiSuccess {String} error Extension not supported. En caso de que el archivo sea diferente de PDF y BDOC.
    372373         *
     
    398399         * @apiSuccess {String}   signatures.signerCertificateIssuer Emisor del certificado firmante.
    399400         * @apiSuccess {String}   signatures.signerCertificateValidTo Fecha de fin de validez del certificado.
     401         * @apiSuccess {String} signatures.signerCertificateSerial BDOC: Serial del certificado del firmante.
     402         * @apiSuccess {String} signatures.signatureProfile BDOC: Perfil de la firma.
     403         * @apiSuccess {String} signatures.signatureMethod BDOC: Algoritmo de firma utilizado.
     404         * @apiSuccess {String} signatures.signatureId BDOC: identificador de la firma.
     405         * @apiSuccess {String} signatures.signatureSigningTime BDOC: Hora y fecha en que se realiza la firma.
     406         * @apiSuccess {Boolean} signatures.signerCertificateIsValid BDOC: El certificado firmante es válido.
     407         * @apiSuccess {String} signatures.signerCertificateIssuer BDOC: Emisor del certificado firmante.
     408         * @apiSuccess {String} signatures.signatureValidationException BDOC: Exepciones de la validación de la firma.
     409         * @apiSuccess {String} signatures.isValid BDOC: Firma electrónica válida.
     410         * @apiSuccess {String} signatures.signerCertificateSubjectName BDOC: Nombre del sujeto firmante.
     411         *
     412         * @apiSuccess {Boolean}   containerValidation BDOC: Especifica si el contenedor posee una estructura válida. 
     413         * @apiSuccess {Number}   numberOfDataFiles BDOC: Cantidad de archivos incluidos en el contenedor BDOC.
     414         * @apiSuccess {Object[]} dataFiles BDOC: Lista de archivos incluidos en el contenedor.
     415         * @apiSuccess {String} dataFiles.name BDOC: Nombre del archivo incluido en el contenedor.
     416         * @apiSuccess {String} dataFiles.dataFileSize BDOC: Tamaño del archivo incluido en el contenedor.
     417         * @apiSuccess {String} dataFiles.filename BDOC: Nombre del archivo incluido en el contenedor.
     418         * @apiSuccess {String} dataFiles.mediaType BDOC: Tipo MIME del archivo incluido en el contenedor.
     419         * @apiSuccess {Object[]} signatures BDOC: Lista de firmas del contenedor BDOC
     420         *
     421         *
    400422         *
    401423         * @apiExample Example usage:
     
    15351557        private JSONObject verifySignaturesInBdoc(String bdocFile) {
    15361558       
     1559                logger.debug("verifySignaturesInBdoc("+bdocFile+")");
    15371560                System.out.println("verifySignaturesInBdoc(String bdocFile)");
     1561               
    15381562                JSONObject jsonSignatures = new JSONObject();
    15391563
     
    15561580                {
    15571581                        container = Container.open(bdocFile, configuration);
     1582                        logger.debug("Container.open("+bdocFile+", DIGIDOC4J_CONFIGURATION)");
    15581583                } catch(DigiDoc4JException e)
    15591584                {
     
    15721597                       
    15731598                        jsonSignatures.put("fileId", idFile);
    1574                         jsonSignatures.put("mimeType", "application/pdf");
     1599                        jsonSignatures.put("mimeType", "application/vnd.etsi.asic-e+zip");
    15751600                       
    15761601                        // informacion de archivos dentro del contenedor
     
    15851610                        jsonSignatures.put("numberOfSignatures", numberOfSignatures);
    15861611                       
     1612                        System.out.println("->container.validate()");
    15871613                        ValidationResult validationResult = container.validate();
     1614                        System.out.println("...container.validate()");
     1615                       
     1616                       
    15881617                        List<DigiDoc4JException> exceptions = validationResult.getContainerErrors();
     1618                        System.out.println("...validationResult.getContainerErrors()");
    15891619                       
    15901620                        boolean isDDoc = container.getDocumentType() == DocumentType.DDOC;
     
    16331663                }
    16341664                //verifyBdocContainer(container);               
    1635                 jsonSignatures.put("validation", "executed");                           
     1665                //jsonSignatures.put("validation", "executed");                         
    16361666                return jsonSignatures;
    16371667        }
     
    16431673         */
    16441674        private JSONArray getJSONFromBDOCDataFiles(List<DataFile> dataFilesList) {
     1675               
     1676                System.out.println("getJSONFromBDOCDataFiles(List<DataFile> dataFilesList)");
     1677                logger.debug("getJSONFromBDOCDataFiles(List<DataFile> dataFilesList)");
     1678               
    16451679                JSONArray jsonDataFileArray = new JSONArray();
    16461680               
     
    16491683                        JSONObject tmpJsonDataFile = new JSONObject();
    16501684                        DataFile df = dataFilesList.get(i);
     1685                        System.out.println("...dataFilesList.get(i)");
     1686                                               
    16511687                        tmpJsonDataFile.put("dataFileSize", Long.toString(df.getFileSize()));
     1688                        logger.debug("dataFileSize: " + Long.toString(df.getFileSize()));
     1689                       
    16521690                        tmpJsonDataFile.put("filename", df.getId());
     1691                        logger.debug("filename: " + df.getId());
     1692                       
    16531693                        tmpJsonDataFile.put("mediaType", df.getMediaType());
     1694                        logger.debug("mediaType: " + df.getMediaType());
     1695                       
    16541696                        tmpJsonDataFile.put("name", df.getName());
     1697                        logger.debug("name: " + df.getName());
     1698                       
    16551699                        jsonDataFileArray.put(tmpJsonDataFile);
    16561700                }
     
    16601704               
    16611705                //return jsonDataFile;
     1706                System.out.println("...saliendo");
    16621707                return jsonDataFileArray;
    16631708        }
     
    16701715         */
    16711716        private static HashMap<String, String> verifyBDOCSignature(Signature signature, DocumentType documentType) {
     1717                logger.debug("verifyBDOCSignature(Signature signature, DocumentType documentType)");
    16721718               
    16731719                HashMap<String, String> signatureMap = new HashMap<String, String>();
     
    16801726                        System.out.println("Signature " + signature.getId() + " is not valid");
    16811727                signatureMap.put("isValid", Boolean.toString(false));
     1728               
     1729                logger.debug("Signature " + signature.getId() + " is not valid");
     1730               
    16821731                int counter = 1;
    16831732               
     
    16991748              }
    17001749                }
    1701                 else{
    1702                        
     1750                else{                   
    17031751                        System.out.println("Signature " + signature.getId() + " is valid");
    1704                 signatureMap.put("isValid", Boolean.toString(true));
     1752                        logger.debug("Signature " + signature.getId() + " is valid");
     1753                signatureMap.put("isValid", Boolean.toString(true));           
    17051754                }
    17061755                signatureMap.put("signatureId", signature.getId());
     
    17351784                signatureMap.put("signerCertificateIsValid", Boolean.toString(false));
    17361785        }
    1737        
    1738        
    1739        
     1786               
    17401787                return signatureMap;
    17411788        }
    17421789       
    17431790       
     1791        @POST
     1792        @Path("/bdocs")
     1793        @Consumes(MediaType.APPLICATION_JSON)
     1794        @Produces(MediaType.APPLICATION_JSON)
     1795        public Response presignBdoc(PresignParametersBdoc presignPar, @Context HttpServletRequest req) throws MurachiException {
     1796               
     1797                logger.info("/bdocs");
     1798               
     1799                PresignHash presignHash = new PresignHash();
     1800
     1801                // obtener el id del archivo a firmaer
     1802                String fileId = presignPar.getFileId();
     1803               
     1804                // cadena con el certificado
     1805                String certHex = presignPar.getCertificate();
     1806                System.out.println("certificado en Hex: " + certHex);
     1807
     1808                String city = presignPar.getCity();
     1809                logger.debug("city: " + city);
     1810               
     1811                String state = presignPar.getState();
     1812                logger.debug("state: " + state);
     1813               
     1814                String postalCode = presignPar.getPostalCode();
     1815                logger.debug("postalCode: " + postalCode);
     1816               
     1817                String country = presignPar.getCountry();
     1818                logger.debug("country: " + country);
     1819               
     1820                String role = presignPar.getRole();
     1821                logger.debug("role: " + role);
     1822               
     1823                CertificateFactory cf;
     1824                X509Certificate signerCert;
     1825               
     1826                //
     1827                String hashToSign = "";
     1828                               
     1829               
     1830                SignedInfo signedInfo;
     1831               
     1832                fileId = presignPar.getFileId();
     1833                String sourceFile = SERVER_UPLOAD_LOCATION_FOLDER + fileId;
     1834                System.out.println("archivo a firmar: " + sourceFile);
     1835                logger.debug("archivo a firmar: " + sourceFile);
     1836               
     1837                String sourceFileMimeType = getMimeTypeWithTika(sourceFile);
     1838                logger.debug("mimeType del archivo a firmar: " + sourceFileMimeType);
     1839               
     1840                certHex = presignPar.getCertificate();
     1841                System.out.println("certificado en Hex: " + certHex);
     1842                logger.debug("certificado firmante en Hex: " + certHex);
     1843               
     1844                try
     1845                {
     1846                       
     1847               
     1848                Security.addProvider(new BouncyCastleProvider());
     1849                Container container = null;
     1850               
     1851                Configuration configuration = new Configuration(Configuration.Mode.PROD);
     1852               
     1853                configuration.loadConfiguration(DIGIDOC4J_CONFIGURATION);
     1854               
     1855                configuration.setTslLocation(DIGIDOC4J_TSL_LOCATION);
     1856       
     1857                container = Container.create(Container.DocumentType.BDOC, configuration);
     1858               
     1859                SignatureParameters signatureParameters = new SignatureParameters();
     1860            SignatureProductionPlace productionPlace = new SignatureProductionPlace();
     1861            productionPlace.setCity(city);
     1862            productionPlace.setStateOrProvince(state);
     1863            productionPlace.setPostalCode(postalCode);
     1864            productionPlace.setCountry(country);
     1865            signatureParameters.setProductionPlace(productionPlace);
     1866            signatureParameters.setRoles(asList(role));
     1867            container.setSignatureParameters(signatureParameters);
     1868            container.setSignatureProfile(SignatureProfile.B_BES);
     1869               
     1870                container.addDataFile(sourceFile, sourceFileMimeType);
     1871               
     1872                cf = CertificateFactory.getInstance("X.509");
     1873               
     1874                InputStream in = new ByteArrayInputStream(hexStringToByteArray(certHex));
     1875               
     1876                signerCert = (X509Certificate) cf.generateCertificate(in);
     1877               
     1878                signedInfo = container.prepareSigning(signerCert);
     1879               
     1880                hashToSign = byteArrayToHexString(signedInfo.getDigest());
     1881                //System.out.println("presignBdoc - hash: " + byteArrayToHexString(signedInfo.getDigest()));
     1882                System.out.println("presignBdoc - hash: " + hashToSign);
     1883                logger.debug("presignBdoc - hash: " + hashToSign);
     1884               
     1885                // establecer el nombre del archivo a serializar
     1886                String serializedContainerId = sourceFile + "-serialized";
     1887               
     1888                // serializar el archivo
     1889                serialize(container, serializedContainerId);
     1890               
     1891               
     1892                // almacenar los objetos necesarios para realizar el postsign en una sesion
     1893                HttpSession session = req.getSession(true);
     1894                session.setAttribute("hashToSign", hashToSign);                         
     1895                session.setAttribute("fileId", fileId);
     1896                session.setAttribute("serializedContainerId", serializedContainerId);
     1897               
     1898               
     1899               
     1900                } catch(IOException e)
     1901                {
     1902                        presignHash.setError(e.getMessage());
     1903                        presignHash.setHash("");
     1904                        return Response.status(500).entity(presignHash).build();
     1905                } catch(CertificateException e)
     1906                {
     1907                        presignHash.setError(e.getMessage());
     1908                        presignHash.setHash("");
     1909                        return Response.status(500).entity(presignHash).build();
     1910                }
     1911                       
     1912                       
     1913                // creacion del json
     1914                JSONObject jsonHash = new JSONObject();
     1915                jsonHash.put("hashToSign", hashToSign);
     1916                                       
     1917                                       
     1918                presignHash.setHash(hashToSign);
     1919                presignHash.setError("");
     1920               
     1921               
     1922                logger.debug("presignBdoc: "+ presignHash.toString());
     1923                return Response.status(200).entity(presignHash).build();                       
     1924        }
     1925       
     1926       
     1927        @POST
     1928        @Path("/bdocs/resenas")
     1929        @Consumes(MediaType.APPLICATION_JSON)
     1930        @Produces(MediaType.APPLICATION_JSON)   
     1931        public Response postsignBdoc(PostsignParameters postsignPar, @Context HttpServletRequest req) throws IOException, MurachiException {
     1932               
     1933                logger.info("/bdocs/resenas");
     1934
     1935                // cadena con la firma
     1936                String signature = postsignPar.getSignature();
     1937                System.out.println("firma en Hex: " + signature);
     1938                logger.info("firma en Hex: " + signature);
     1939               
     1940                HttpSession session = req.getSession(false);
     1941               
     1942                String fileId = (String) session.getAttribute("fileId");
     1943                System.out.println("fileId: " + fileId);
     1944                logger.debug("fileId: " + fileId);
     1945               
     1946                String serializedContainerId = (String) session.getAttribute("serializedContainerId") + ".bin";
     1947               
     1948               
     1949                System.out.println("serializedContainerId: " + serializedContainerId);
     1950                logger.debug("serializedContainerId: " + serializedContainerId);
     1951               
     1952                String signedBdoc = SERVER_UPLOAD_LOCATION_FOLDER + fileId + ".bdoc";
     1953               
     1954                try {
     1955                        Container deserializedContainer = deserializer(serializedContainerId);
     1956                       
     1957                        byte[] signatureInBytes = hexStringToByteArray(signature);
     1958                       
     1959                        deserializedContainer.signRaw(signatureInBytes);
     1960                        deserializedContainer.save(signedBdoc);
     1961                        logger.debug("archivo firmado escrito en: " + signedBdoc);
     1962                       
     1963                       
     1964                       
     1965                } catch (ClassNotFoundException e) {
     1966                        //e.printStackTrace();
     1967                       
     1968                        JSONObject jsonError = new JSONObject();
     1969                                               
     1970                        System.out.println("sgn == null");
     1971                        logger.error("error: " + e.getMessage());
     1972                                                       
     1973                        jsonError.put("error", e.getMessage());
     1974                        return Response.status(500).entity(jsonError).build();                         
     1975                }
     1976                               
     1977                // en este punto el archivo bdoc debe estar disponible en la ruta
     1978                // SERVER_UPLOAD_LOCATION_FOLDER + fileId;             
     1979                System.out.println("Archivo firmado correctamente");
     1980                logger.debug("Archivo firmado correctamente");
     1981                       
     1982                PostsignMessage message = new PostsignMessage();
     1983                message.setMessage("{\"signedFile\":"+fileId + ".bdoc}");
     1984               
     1985               
     1986                JSONObject jsonFinalResult = new JSONObject();
     1987                jsonFinalResult.put("signedFileId",fileId + ".bdoc");
     1988               
     1989                logger.info(jsonFinalResult.toString());
     1990                return Response.status(200).entity(jsonFinalResult.toString()).build();
     1991        }
     1992       
     1993       
    17441994        private static void verifyBdocContainer(Container container) {
     1995                logger.debug("verifyBdocContainer(Container container)");
     1996               
    17451997            ValidationResult validationResult = container.validate();
    17461998
     
    17672019              if (signatureValidationResult.size() == 0) {
    17682020                System.out.println("Signature " + signature.getId() + " is valid");
     2021                logger.debug("Signature " + signature.getId() + " is valid");
    17692022              } else {
    17702023                System.out.println("Signature " + signature.getId() + " is not valid");
     2024                logger.debug("Signature " + signature.getId() + " is not valid");
    17712025                for (DigiDoc4JException exception : signatureValidationResult) {
    17722026                  System.out.println((isDDoc ? "        " : "   Error: ")
     
    17762030              if (isDDoc && isDDocTestSignature(signature)) {
    17772031                System.out.println("Signature " + signature.getId() + " is a test signature");
     2032                logger.debug("Signature " + signature.getId() + " is a test signature");
    17782033              }
    17792034            }
     
    21942449        @Consumes(MediaType.APPLICATION_JSON)
    21952450        @Produces(MediaType.APPLICATION_JSON)
    2196         public PresignHash presignBdoc(PresignParameters presignPar, @Context HttpServletRequest req) {
    2197                
    2198                 System.out.println("presignBdoc: ");
     2451        public PresignHash presignBdoc2(PresignParameters presignPar, @Context HttpServletRequest req) {
     2452               
     2453                System.out.println("presignBdoc2: ");
    21992454               
    22002455               
  • murachi/src/main/java/ve/gob/cenditel/murachi/PresignParameters.java

    rb3b099f rce3da18  
    44/**
    55 * Clase PresignParameters que representa el objeto que se mapea al JSON
    6  * que se envia a /archivos/prepararfirmapdf
     6 * que se envia a /archivos/pdfs
    77 *
    88 * @author aaraujo
  • murachi/src/main/resources/log4j.properties

    r0eae502 rce3da18  
    1010# Redirect log messages to a log file, support file rolling.
    1111log4j.appender.file=org.apache.log4j.RollingFileAppender
    12 log4j.appender.file.File=/var/log/tomcat7/MurachiRESTWS.log
     12#log4j.appender.file.File=/var/log/tomcat7/MurachiRESTWS.log
     13log4j.appender.file.File=/tmp/MurachiRESTWS.log
    1314log4j.appender.file.MaxFileSize=5MB
    1415log4j.appender.file.MaxBackupIndex=10
Note: See TracChangeset for help on using the changeset viewer.