Changes between Version 16 and Version 17 of actividades_2018_pruebas


Ignore:
Timestamp:
May 31, 2018, 9:16:37 AM (6 years ago)
Author:
pbuitrago
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • actividades_2018_pruebas

    v16 v17  
    592592
    593593luego se envía el hash cifrado con el método $.ajax al sistema Murachí para completar la firma del archivo pdf
     594
     595'''Pruebas con la librería "crypto"'''
     596
     597Para la librería javaScript Crypto:  se necesita una función que me permita firmar el hash recibido desde el servicio Murachí.
     598Para este caso, como obtuvimos el certificado del firmarte y la clave privada con la librería forge en la función ''getCertificate'', necesitamos importar la clave privada para que pueda ser utilizada por la librería ''Crypto''
     599
     600{{{function importCryptoKeyPkcs8(privateKey,extractable)
     601        {
     602        var privateKeyInfoDerBuff = privateKeyToPkcs8(privateKey);
     603        //Importa la clave en la webcrypto
     604        return crypto.subtle.importKey(
     605                'pkcs8',
     606                privateKeyInfoDerBuff,
     607                { name: "RSASSA-PKCS1-v1_5", hash:{name:"SHA-256"}},
     608                extractable,
     609                ["sign"]);
     610        }
     611}}}
     612
     613donde la variable ''privateKey'' corresponde a la variable donde se almaceno la clave privada en la función ''getCertificate()''
     614La función ''privateKeyToPkcs8'' transforma la clave priva en formato ''pkcs8''
     615
     616{{{function privateKeyToPkcs8(privateKey)
     617        {
     618        var rsaPrivateKey = forge.pki.privateKeyToAsn1(privateKey);
     619        var privateKeyInfo = forge.pki.wrapRsaPrivateKey(rsaPrivateKey);
     620        var privateKeyInfoDer = forge.asn1.toDer(privateKeyInfo).getBytes();
     621        var privateKeyInfoDerBuff = stringToArrayBuffer(privateKeyInfoDer);
     622        return privateKeyInfoDerBuff;
     623        }
     624}}}
     625
     626Definida estas funciones se presenta la función encargada de realizar la firma  del hash usando la libreria ''crypto'', para la misma se necesita la clave privada y el hash a firmar. Independientemente de la función que se utilice para firma el
     627== hash ==
     628 se usara esta función para enviarlo al servidor Murachí y completar la firma electrónica.
     629
     630{{{function SingHash()
     631        {
     632        console.log("*.... SingFile ....*");
     633        importCryptoKeyPkcs8(privateKey,true).then(function(cryptoKey)
     634                {
     635                var digestToSign = forge.util.decode64(digestToSignB64);
     636                var digestToSignBuf = stringToArrayBuffer(digestToSign);
     637                crypto.subtle.sign(
     638                        {name: "RSASSA-PKCS1-v1_5"},
     639                        cryptoKey,
     640                        digestToSignBuf)
     641                        .then(function(signature){
     642                                sign = arrayBufferToString(signature);
     643                                signatureB64 = forge.util.encode64(sign);
     644                                signatureHEX = forge.util.bytesToHex(signatureB64);
     645                                signatureBytesHex = forge.util.bytesToHex(signature); //hash firmado
     646                        });
     647                });
     648        }
     649}}}
     650
     651Una ves firmado el hash con el certificado firmante (almacenado en la variable signatureBytesHex) se procede a enviar al servicio Murachí para completar la firma, para este proceso de envío usando el metodo $ajax.
     652Opciones de configuración de la petición $.ajax: para el envío del hash
     653 * '''url:''' Establece la URL en donde se realiza la petición, para esta sección es "https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs/resenas".
     654 * '''type:''' Esatblece el tipo de petición, para esta sección vamos a utilizar "POST".
     655 * '''dataType:''' Establece el formato de la respuesta que es permitido, si el servidor devuelve información con un formato diferente al especificado el código fallará. Para esta sección se establece “json”.
     656 * ''data:'' Establece la información que se enviará al servidor. Para esta sección se enviá el hash que se obtiene de la siguiente manera: JSON.stringify({"signature":signature.hex}).
     657 * ''contentType:'' Establece el tipo de codificación que se va a utilizar, para esta sección es "application/json".
     658 * '''xhrFields''' y '''headers:''' ya indicado al principio de esta sección.
     659
     660Código de la función javaScript "SignFilePDF()" sección 3:
     661
     662{{{document.getElementById("seccion2").innerHTML = responseString;
     663var json_x = data;
     664var hash = json_x['hash'];
     665alert("hash recibido del servidor "+hash);
     666var hashtype = "SHA-256";
     667var lang = "eng";
     668SingHash()
     669signature =  signatureBytesHex;
     670    $.ajax({
     671         type: 'POST',
     672         contentType: 'application/json',
     673         url:"https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs/resenas",
     674         dataType: 'json',
     675         data: JSON.stringify({"signature":signature}),
     676         xhrFields: {withCredentials: true},
     677         headers: {"Authorization":"Basic YWRtaW46YWRtaW4="},
     678         success: function(data, textStatus, jqXHR){
     679             var responseString = JSON.stringify(data);
     680             document.getElementById("seccion3").innerHTML = responseString;
     681             alert('Archivo firmado correctamente: ' + data['signedFileId']);
     682            document.getElementById("seccion4").innerHTML = "Descargar archivo firmado: https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/descargas/" + data['signedFileId'];
     683         } // repuesta del ajax 3
     684     }) //ajax 3
     685
     686}}}
     687
     688Si la petición tiene éxito la repuesta de esta sección se procesa a través de la función success: donde se le pase tres parámetros, data: que corresponde al resultado de la petición formateado según el valor del parámetro dataType (respuesta del servidor), textStatus: que corresponde a una cadena que describe el estado y jpXHR: que es un objeto que permite ejecutar varias funciones.