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
|
||||
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
|
||||
|
|
27
funciones
27
funciones
|
@ -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"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ case $modo in
|
|||
;;
|
||||
sensores)
|
||||
funcion_datos_sensores
|
||||
;
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
|
|
|
@ -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
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
|
||||
funciones=$directorio_instalacion/funciones
|
||||
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
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue