firma implementada

This commit is contained in:
Sergio Pernas 2022-03-11 14:10:48 -03:00
parent af9032371d
commit 296b45fcf6
7 changed files with 126 additions and 10 deletions

View file

@ -32,6 +32,10 @@ case $com in
read -p "intervalo: " entrada_usuario
funcion_configurar intervalo $entrada_usuario
echo ""
echo "Creando juego de llaves"
source $config
generate_private_key
echo ""
echo "El modo de operación por defecto es 'test' y se envían datos simulados, cambie a 'sensores' con el comando 'sudo nodemecu modo sensores'
"
;;
@ -54,6 +58,14 @@ case $com in
monitor)
$install_dir/monitor.sh
;;
cllave)
if [ -z $nombre ]; then
echo "Debe establecer primero el nombre del dispositivo"
else
echo "Creando juego de llaves"
generate_private_key
fi
;;
*)
exit

View file

@ -2,14 +2,37 @@
#set -x
get_stack () {
if [[ ! -z $1 && $1 == "wc" ]];then
ls $registros | wc -l
ls -I "*.sign" $registros | wc -l
else
ls $registros | tail -1
ls -I "*.sign" $registros | tail -1
fi
}
# Generar una llave privada ECDSA si no existe
generate_private_key () {
test -f "$private_key" && return 1
ssh-keygen -t ecdsa -f "$private_key" -N "" -m PEM
}
# Firmar el archivo usando la llave privada.
#
# Uso: sign_file archivo.json
# Devuelve: archivo.json.sign
sign_file () {
local _file="$1"
test ! -f "$_file" && return 1
if ! openssl dgst -sha512 -sign "$private_key" "$_file" | base64 | tr -d "\n" > "$_file.sign" ; then
rm -f "$_file.sign"
return 1
fi
echo "$_file.sign"
}

View file

@ -14,7 +14,7 @@ case $modo in
;;
sensores)
funcion_datos_sensores
;
;;
esac

View file

@ -38,6 +38,7 @@ mkdir -v $registros_corruptos
mkdir -v $envios_fallidos
mkdir -v $historicos
mkdir -v $registros
mkdir -v $private_key_dir
echo "
Copiado de archivos
"

76
nodemecu Executable file
View file

@ -0,0 +1,76 @@
#!/bin/bash
if [ $UID -ne 0 ]; then
echo "Ejecute 'sudo $0'"
exit
fi
# LECTURA FICHERO DE CONFIGURACION
config=/etc/nodemecu.conf
source $config
source $funciones
[ -z $1 ] && exit
com=$1
case $com in
configurar)
echo "Complete los cambios a continuación:
"
echo "Nombre del dispositivo."
read -p "nombre: " -a entrada_usuario
funcion_configurar nombre ${entrada_usuario[@]}
echo ""
echo "Servidor de entrega de datos."
read -p "servidor (ej. https://url.del/servidor): " entrada_usuario
funcion_configurar servidor $entrada_usuario
echo ""
echo "Intervalo de toma de muestras, entre 1 y 60 minutos."
read -p "intervalo: " entrada_usuario
funcion_configurar intervalo $entrada_usuario
echo ""
echo "Creando juego de llaves"
source $config
generate_private_key
echo ""
echo "El modo de operación por defecto es 'test' y se envían datos simulados, cambie a 'sensores' con el comando 'sudo nodemecu modo sensores'
"
;;
nombre)
funcion_configurar $@
;;
servidor)
funcion_configurar $@
;;
intervalo)
funcion_configurar $@
;;
modo)
funcion_configurar $@
;;
captura)
funcion_captura $2
;;
monitor)
$install_dir/monitor.sh
;;
cllave)
if [ -z $nombre ]; then
echo "Debe establecer primero el nombre del dispositivo"
else
echo "Creando juego de llaves"
generate_private_key
fi
;;
*)
exit
;;
esac

View file

@ -20,3 +20,5 @@ contador=$directorio_instalacion/contador
lock=$directorio_instalacion/lock
funciones=$directorio_instalacion/funciones
arduinos_py=$directorio_instalacion/arduinos.py
private_key_dir=$directorio_instalacion/llaves
private_key=$private_key_dir/$nombre.pem

View file

@ -11,14 +11,17 @@ for registro_json in $registros/*;do
done
while :;do
# archivo a procesar
file=$(get_stack)
# si no hay servidor definido se reinicia el bucle
# espera el intervalo definido o 1 minuto.
[ -z $servidor ] && echo "no se ha definido un servidor de entrega" && sleep ${intervalo:-1}m && continue
#[ -z $servidor ] && echo "no se ha definido un servidor de entrega" && sleep ${intervalo:-1}m && continue
# si no hay nada en el directorio registros reinicia el bucle
# espera el intervalo definido o 1 minuto.
file=$(get_stack)
[ -z $file ] && sleep ${intervalo:-1}m && continue
# si no respone el ping reinica el bucle
@ -34,20 +37,19 @@ while :;do
# echo "$(date +%Y-%m-%d-%H:%M:%S) - $url - $test_url" >> /opt/nodemecu/errors.log && sleep 300 && continue
#fi
sing_file $registros/$file
# firma de registros
sign_file $registros/$file
firma="$(cat $registros/$file.sign)"
local_transaction_uuid=$(jq -r '."transaction_uuid"' $registros/$file)
remote_transaction=$(curl -s --connect-timeout 0,9 --show-error -w "~%{http_code}" -X POST -H "X-Signature: $firma" -H "Content-Type: application/json" -d @$registros/$file $servidor 2> $curl_err)
remote_transaction=$(curl -s --connect-timeout 1,5 --show-error -w "~%{http_code}" -X POST -H "X-Signature: $firma" -H "Content-Type: application/json" -d @$registros/$file $servidor 2> $curl_err)
remote_response="$(echo $remote_transaction | cut -d '~' -f 1)"
server_error="$(echo $remote_transaction | cut -d '~' -f 2)"
if [ ${#remote_response} -eq 36 ];then
if [ $local_transaction_uuid == $remote_response ]; then
mv $registros/$file $historicos
mv $registros/$file $registros/$file.sign $historicos
echo -e "$remote_response: \e[92mOK\e[0m"
fi
else