Digitalno podpisovanje na webu

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Digitalno podpisovanje na webu

OdgovorNapisal/-a seba » 20 Mar 2018, 01:51

Torej, rad bi implementiral Sigen-CA identifikacijo uporabnikov in digitalno podpisovanje dokumentov.
Identifikacija gre, digitalno podpisovanje pa ni šans.

Identifikacijo uporabnikov sem naredil enostavno, tako, da sem v nginx configuraciji dodal:
Koda: Izberi vse
    ssl_client_certificate /etc/nginx/all.pem;
    ssl_verify_client optional_no_ca;
    ssl_verify_depth 2;

V all.pem imam enega za drugim nanizane certifikate iz SI-CA.

Za ssl_verify_client lahko imamo več opcij: on zahteva vedno veljaven certifikat (glede na CA, oz. all.pem v našem primeru), optional zahteva ali veljaven certifikat z istimi pogoji kakor on ali, da ni certifikata, z optional_no_ca pa je uporabnik lahko brez certifikata, s certifikatom, ki je veljaven po prejšnjih kriterijih ali pa s certifikatom, ki ni del našega CA oz. all.pem.

ssl_verify_depth pa pove, koliko globoko naj preverja, če je certifikat veljaven. V našem primeru mora biti vsaj 2, drugače ne dela.

Poleg te kode sem dodal še naslednjo kodo v konfiguracijo od nginx:
Koda: Izberi vse
    fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
    fastcgi_param SSL_CLIENT_VERIFY $ssl_client_verify;

Le ta pošlje PHP-ju, ki dela preko fpm, v $_SERVER array dodatni dve vrednosti in sicer: SSL_CLIENT_CERT nam da uporabnikov certifikat v pem obliki, SSL_CLIENT_VERIFY pa nam vrne ali je uporabnik podal certifikat in če je ta veljaven, konkretno NONE za brez certifikata, SUCCESS za ustrezno preverjen certifikat glede na CA in FAILED pri uporabi certifikata, ki ni del CA.

Iz skripte v PHP-ju lahko potem izluščimo podatke o certifikatu na sledeč način:
Koda: Izberi vse
<?php
$status = $_SERVER['SSL_CLIENT_VERIFY']; //status certifikata
var_dump($status);

$str = $_SERVER['SSL_CLIENT_CERT']; //uporabnikov certifikat
$str = strtr($str, array("\t" => ''));   //iz neznanega razloga doda nginx tabe, ki jih openssl ne prebavi, zato moramo jih odstraniti
$arr = openssl_x509_parse($str);
var_dump($arr);
?>


No, zaplete se pa pri digitalnem podpisovanju. Rad bi npr. imel eno tekstovno polje, kjer uporabnik napiše nek spis, potem pa pritisne "podpiši dokument" in v drugo tekstovno polje vrne podpis tega dokumenta, ki ga nato uporabnik lahko naloži na strežnik. Primer je na vladni strani a žal se ne da uporabiti ProXsign brez licence na lastni spletni strani; enostavno vrne napako. Zanima me, če obstajajo kakšne nativne, free oz. standardne rešitve. WebCrypto API je sicer implementiran v vseh modernih browserjih, a ne podpira, kakor razumem, podpisovanje s temi PKCS12 digitalnimi potrdili, ki jih uporabnik sam naloži (npr. Sigen-CA). Naj bi se nekoč dalo v Firefoxu nativno preko window.crypto.signText, ampak je to zdaj ukinjeno.

A torej kdo pozna standardno rešitev za digitalno podpisovanje z digitalnimi potrdili na uporabniški strani?
Uporabniški avatar
seba
 
Prispevkov: 406
Pridružen: 17 Jan 2015, 22:20
Zahvalil se je: 32 krat
Prejel zahvalo: 106 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 13

Re: Digitalno podpisovanje na webu

OdgovorNapisal/-a Kroko » 20 Mar 2018, 08:49

Narediti boš moral podpisno komponento.
Pred leti sem se s tem resno ukvarjal. Nekje bi moral imeti ravno tak primer, kot ga želiš.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4742
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 677 krat
Prejel zahvalo: 1636 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Digitalno podpisovanje na webu

OdgovorNapisal/-a blasny » 20 Mar 2018, 22:14

Zelo dolgo ni obstajal standarden nacin za podpisovanje v brskalnikih. Podpisno komponento je bilo treba razvijat za vsak brskalnik posebej. Tezava je, da je treba te komponente stalno prilagajati brskalnikom. Npr. Firefox je ukinil API, ki so ga nekatere komponente uporabljale.

Zadnji dve leti ne sledim vec temu podrocju. Zgleda, da se koncno nekaj premika z WebCrypto, ampak podpora v brskalnikih je zaenkrat uboga

Podpisovanje s PKI pa naj bi bilo podprto. Tu imajo primer
blasny
 
Prispevkov: 437
Pridružen: 18 Jan 2015, 16:48
Zahvalil se je: 314 krat
Prejel zahvalo: 122 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 15

Re: Digitalno podpisovanje na webu

OdgovorNapisal/-a seba » 20 Mar 2018, 22:45

blasny je napisal/-a:Zelo dolgo ni obstajal standarden nacin za podpisovanje v brskalnikih. Podpisno komponento je bilo treba razvijat za vsak brskalnik posebej. Tezava je, da je treba te komponente stalno prilagajati brskalnikom. Npr. Firefox je ukinil API, ki so ga nekatere komponente uporabljale.

Zadnji dve leti ne sledim vec temu podrocju. Zgleda, da se koncno nekaj premika z WebCrypto, ampak podpora v brskalnikih je zaenkrat uboga

Podpisovanje s PKI pa naj bi bilo podprto. Tu imajo primer


Naj bi bilo, ampak ne z inštaliranimi certifikati, kar je totalen fail.

Napisal sem danes idejo: http://seba.eu.org/css/podpisovanje.html
Ideja ni še dokončana niti približno, mnenje dobrodošlo.
Dal sem ene par ljudem, pa se jim zdi OK in ne vidijo nekih lukenj.
Uporabniški avatar
seba
 
Prispevkov: 406
Pridružen: 17 Jan 2015, 22:20
Zahvalil se je: 32 krat
Prejel zahvalo: 106 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 13


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost