Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: tuxmartin 12. 05. 2018, 15:48:39
-
Ahoj,
potrebuju periodicky stahovat skript a spoustet ho v bashi. Abych mel jistotu, ze ho nikdo neupravil, rad bych overoval gpg podpis.
Verejny GPG klic si na pc, kde se bude stahovat nahraju rucne a navic ho nechci importovat, ale overovat primo ze souboru:
martin@martin:~/test$ cat test.sh
#!/bin/bash
echo "ok"
martin@martin:~/test$ gpg -u 1D9883AE -a --sign --detach-sig --output test.sh.asc test.sh
martin@martin:~/test$
martin@martin:~/test$ gpg --no-default-keyring --keyring ./x.gpg --verify test.sh.asc test.sh 2>/dev/null && bash test.sh || echo "gpg_verify_error"
ok
martin@martin:~/test$
# PO ZMENE SOUBORU SE NESPUSTI:
martin@martin:~/test$ sed -i 's/ok/OK/g' test.sh
martin@martin:~/test$ cat test.sh
#!/bin/bash
echo "OK"
martin@martin:~/test$ gpg --no-default-keyring --keyring ./x.gpg --verify test.sh.asc test.sh 2>/dev/null && bash test.sh || echo "gpg_verify_error"
gpg_verify_error
martin@martin:~/test$
Tohle krasne funguje.
Jenze ja nechci soubory ukladat na disk (budou se stahovat casto), ale mit je v promennych. Zkousel jsem:
martin@martin:~/test$ python -m SimpleHTTPServer 8080 &
martin@martin:~/test$
martin@martin:~/test$ curl http://localhost:8080/test.sh
#!/bin/bash
echo "ok"
martin@martin:~/test$ curl http://localhost:8080/test.sh.asc
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iQIcBAABAgAGBQJa9uxCAAoJEBD8Q3R7umFHW/EQALRXXnrJ+aTyVo2zmvA6ayMc
...
martin@martin:~/test$
martin@martin:~/test$ script=$(curl -s http://localhost:8080/test.sh); sign=$(curl -s http://localhost:8080/test.sh.asc);
martin@martin:~/test$ echo $script
#!/bin/bash echo "ok"
martin@martin:~/test$ echo -e $script
#!/bin/bash echo "ok"
martin@martin:~/test$ script=$(curl -s http://localhost:8080/test.sh); sign=$(curl -s http://localhost:8080/test.sh.asc); gpg --no-default-keyring --keyring ./x.gpg --verify $sign $script 2>/dev/null && echo $script | bash || echo "gpg_verify_error"
gpg_verify_error
martin@martin:~/test$
Cilem tedy je:
# script=$(curl -s http://localhost:8080/test.sh); sign=$(curl -s http://localhost:8080/test.sh.asc); gpg --no-default-keyring --keyring ./x.gpg --verify $sign $script 2>/dev/null && echo $script | bash || echo "gpg_verify_error"
Prvni problem - kdyz si pres echo vypisu promennou, zalomeni radku jsou pryc.
Druhy problem - umi gpg overovat z promennych, jako to mam na ukazce?
Zkousim to vic, nez hodinu, ale stale jsem na nic neprisel :-(
-
kdyz si pres echo vypisu promennou, zalomeni radku jsou pryc.
dej si nazev promenne v echu do uvozovek "
..
martin@martin:~/test$ gpg --no-default-keyring --keyring ./x.gpg --verify $sign $script
..
nejsem ted na linux pc, ale myslim, ze problem je, ze misto filename souboru kterej obsahuje podpis string tam davas rovnou string podpisu a souboru.
Koukni se do manu co je potreba aby soubor a podpis sel ze STDIN, a/nebo si oba soubory vytvor nekde v /dev/shm v ramdisku, jestli ti je líto disk I/O.
-
Diky za tip.
Nasel jsem tento prispevek: https://lists.gnupg.org/pipermail/gnupg-devel/2002-November/019343.html
A podle neho zkousim:
martin@martin:~/test$ script=$(curl -s http://localhost:8080/test.sh)
martin@martin:~/test$ sign=$(curl -s http://localhost:8080/test.sh.asc)
martin@martin:~/test$
martin@martin:~/test$ echo "$script"
#!/bin/bash
echo "ok"
martin@martin:~/test$ echo "$sign" | head -n1
-----BEGIN PGP SIGNATURE-----
martin@martin:~/test$
martin@martin:~/test$ gpg --no-default-keyring --keyring ./x.gpg --enable-special-filenames --verify - '-&5' <test.sh.asc 5<test.sh 2>/dev/null && echo "$script" | bash || echo "gpg_verify_error"
ok
martin@martin:~/test$
Pri predani cesty k souboru funguje krasne.
Problem je, ze se mi nedari predat obsah promennych:
martin@martin:~/test$ gpg --no-default-keyring --keyring ./x.gpg --enable-special-filenames --verify - '-&5' <(echo "$sign") 5<(echo "$script") 2>/dev/null && echo "$script" | bash || echo "gpg_verify_error"
Stale blika kurzor a na neco to ceka.
-
Tak jsem problem trochu obesel a timto to prohlasuju za hotove:
gpg --export -u 896F4A1D > public.gpg
gpg -u 896F4A1D -a --clearsign --output test.sh.asc test.sh
cmd=$(curl -s http://localhost:8080/test.sh.asc | gpg --no-default-keyring --keyring ./public.gpg --decrypt 2> /dev/null); [ $? -eq 0 ] && echo "$cmd" | bash || echo "gpg_verify_error"