firma implementada
This commit is contained in:
parent
af9032371d
commit
296b45fcf6
7 changed files with 126 additions and 10 deletions
12
bin/nodemecu
12
bin/nodemecu
|
@ -32,6 +32,10 @@ case $com in
|
||||||
read -p "intervalo: " entrada_usuario
|
read -p "intervalo: " entrada_usuario
|
||||||
funcion_configurar intervalo $entrada_usuario
|
funcion_configurar intervalo $entrada_usuario
|
||||||
echo ""
|
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'
|
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)
|
monitor)
|
||||||
$install_dir/monitor.sh
|
$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
|
exit
|
||||||
|
|
27
funciones
27
funciones
|
@ -2,14 +2,37 @@
|
||||||
#set -x
|
#set -x
|
||||||
get_stack () {
|
get_stack () {
|
||||||
if [[ ! -z $1 && $1 == "wc" ]];then
|
if [[ ! -z $1 && $1 == "wc" ]];then
|
||||||
ls $registros | wc -l
|
ls -I "*.sign" $registros | wc -l
|
||||||
else
|
else
|
||||||
ls $registros | tail -1
|
ls -I "*.sign" $registros | tail -1
|
||||||
fi
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ case $modo in
|
||||||
;;
|
;;
|
||||||
sensores)
|
sensores)
|
||||||
funcion_datos_sensores
|
funcion_datos_sensores
|
||||||
;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ mkdir -v $registros_corruptos
|
||||||
mkdir -v $envios_fallidos
|
mkdir -v $envios_fallidos
|
||||||
mkdir -v $historicos
|
mkdir -v $historicos
|
||||||
mkdir -v $registros
|
mkdir -v $registros
|
||||||
|
mkdir -v $private_key_dir
|
||||||
echo "
|
echo "
|
||||||
Copiado de archivos
|
Copiado de archivos
|
||||||
"
|
"
|
||||||
|
|
76
nodemecu
Executable file
76
nodemecu
Executable 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
|
||||||
|
|
||||||
|
|
|
@ -20,3 +20,5 @@ contador=$directorio_instalacion/contador
|
||||||
lock=$directorio_instalacion/lock
|
lock=$directorio_instalacion/lock
|
||||||
funciones=$directorio_instalacion/funciones
|
funciones=$directorio_instalacion/funciones
|
||||||
arduinos_py=$directorio_instalacion/arduinos.py
|
arduinos_py=$directorio_instalacion/arduinos.py
|
||||||
|
private_key_dir=$directorio_instalacion/llaves
|
||||||
|
private_key=$private_key_dir/$nombre.pem
|
||||||
|
|
16
registrador
16
registrador
|
@ -11,14 +11,17 @@ for registro_json in $registros/*;do
|
||||||
done
|
done
|
||||||
|
|
||||||
while :;do
|
while :;do
|
||||||
|
|
||||||
|
# archivo a procesar
|
||||||
|
file=$(get_stack)
|
||||||
|
|
||||||
# si no hay servidor definido se reinicia el bucle
|
# si no hay servidor definido se reinicia el bucle
|
||||||
# espera el intervalo definido o 1 minuto.
|
# 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
|
# si no hay nada en el directorio registros reinicia el bucle
|
||||||
# espera el intervalo definido o 1 minuto.
|
# espera el intervalo definido o 1 minuto.
|
||||||
file=$(get_stack)
|
|
||||||
[ -z $file ] && sleep ${intervalo:-1}m && continue
|
[ -z $file ] && sleep ${intervalo:-1}m && continue
|
||||||
|
|
||||||
# si no respone el ping reinica el bucle
|
# 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
|
# echo "$(date +%Y-%m-%d-%H:%M:%S) - $url - $test_url" >> /opt/nodemecu/errors.log && sleep 300 && continue
|
||||||
#fi
|
#fi
|
||||||
|
|
||||||
|
# firma de registros
|
||||||
sing_file $registros/$file
|
sign_file $registros/$file
|
||||||
firma="$(cat $registros/$file.sign)"
|
firma="$(cat $registros/$file.sign)"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local_transaction_uuid=$(jq -r '."transaction_uuid"' $registros/$file)
|
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)"
|
remote_response="$(echo $remote_transaction | cut -d '~' -f 1)"
|
||||||
server_error="$(echo $remote_transaction | cut -d '~' -f 2)"
|
server_error="$(echo $remote_transaction | cut -d '~' -f 2)"
|
||||||
if [ ${#remote_response} -eq 36 ];then
|
if [ ${#remote_response} -eq 36 ];then
|
||||||
|
|
||||||
if [ $local_transaction_uuid == $remote_response ]; 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"
|
echo -e "$remote_response: \e[92mOK\e[0m"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue