Changes between Initial Version and Version 1 of actividades_2018_pruebas_cer_dig_lib_crypto


Ignore:
Timestamp:
Jun 6, 2018, 11:06:26 AM (6 years ago)
Author:
aosorio
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • actividades_2018_pruebas_cer_dig_lib_crypto

    v1 v1  
     1= Pruebas con la librería "crypto" =
     2
     3[[br]]
     4
     5Para la librería javaScript Crypto:  se necesita una función que me permita firmar el hash recibido desde el servicio Murachí.
     6Para 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''
     7
     8{{{
     9function importCryptoKeyPkcs8(privateKey,extractable)
     10        {
     11        var privateKeyInfoDerBuff = privateKeyToPkcs8(privateKey);
     12        //Importa la clave en la webcrypto
     13        return crypto.subtle.importKey(
     14                'pkcs8',
     15                privateKeyInfoDerBuff,
     16                { name: "RSASSA-PKCS1-v1_5", hash:{name:"SHA-256"}},
     17                extractable,
     18                ["sign"]);
     19        }
     20}}}
     21
     22donde la variable ''privateKey'' corresponde a la variable donde se almaceno la clave privada en la función ''getCertificate()''
     23La función ''privateKeyToPkcs8'' transforma la clave priva en formato ''pkcs8''
     24
     25{{{
     26function privateKeyToPkcs8(privateKey)
     27        {
     28        var rsaPrivateKey = forge.pki.privateKeyToAsn1(privateKey);
     29        var privateKeyInfo = forge.pki.wrapRsaPrivateKey(rsaPrivateKey);
     30        var privateKeyInfoDer = forge.asn1.toDer(privateKeyInfo).getBytes();
     31        var privateKeyInfoDerBuff = stringToArrayBuffer(privateKeyInfoDer);
     32        return privateKeyInfoDerBuff;
     33        }
     34}}}
     35
     36Definida 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 hash. Independientemente de la librería que se use para firmar el hash se va a utilizar la siguiente configuración de la petición $.ajax para el envió del hash
     37
     38{{{
     39function SingHash()
     40        {
     41        console.log("*.... SingFile ....*");
     42        importCryptoKeyPkcs8(privateKey,true).then(function(cryptoKey)
     43                {
     44                var digestToSign = forge.util.decode64(digestToSignB64);
     45                var digestToSignBuf = stringToArrayBuffer(digestToSign);
     46                crypto.subtle.sign(
     47                        {name: "RSASSA-PKCS1-v1_5"},
     48                        cryptoKey,
     49                        digestToSignBuf)
     50                        .then(function(signature){
     51                                sign = arrayBufferToString(signature);
     52                                signatureB64 = forge.util.encode64(sign);
     53                                signatureHEX = forge.util.bytesToHex(signatureB64);
     54                                signatureBytesHex = forge.util.bytesToHex(signature); //hash firmado
     55                        });
     56                });
     57        }
     58}}}
     59
     60Una 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.
     61Opciones de configuración de la petición $.ajax: para el envío del hash
     62 * '''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".
     63 * '''type:''' Esatblece el tipo de petición, para esta sección vamos a utilizar "POST".
     64 * '''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”.
     65 * ''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}).
     66 * ''contentType:'' Establece el tipo de codificación que se va a utilizar, para esta sección es "application/json".
     67 * '''xhrFields''' y '''headers:''' ya indicado al principio de esta sección.
     68
     69Código de la función javaScript "SignFilePDF()" sección 3:
     70
     71{{{
     72document.getElementById("seccion2").innerHTML = responseString;
     73var json_x = data;
     74var hash = json_x['hash'];
     75alert("hash recibido del servidor "+hash);
     76var hashtype = "SHA-256";
     77var lang = "eng";
     78SingHash()
     79signature =  signatureBytesHex;
     80    $.ajax({
     81         type: 'POST',
     82         contentType: 'application/json',
     83         url:"https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/pdfs/resenas",
     84         dataType: 'json',
     85         data: JSON.stringify({"signature":signature}),
     86         xhrFields: {withCredentials: true},
     87         headers: {"Authorization":"Basic YWRtaW46YWRtaW4="},
     88         success: function(data, textStatus, jqXHR){
     89             var responseString = JSON.stringify(data);
     90             document.getElementById("seccion3").innerHTML = responseString;
     91             alert('Archivo firmado correctamente: ' + data['signedFileId']);
     92            document.getElementById("seccion4").innerHTML = "Descargar archivo firmado: https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/descargas/" + data['signedFileId'];
     93         } // repuesta del ajax 3
     94     }) //ajax 3
     95
     96}}}
     97
     98Si 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.