Stran 1 od 1

Digitalno podpisovanje na webu

OdgovorObjavljeno: 20 Mar 2018, 01:51
Napisal/-a seba
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?

Re: Digitalno podpisovanje na webu

OdgovorObjavljeno: 20 Mar 2018, 08:49
Napisal/-a Kroko
Narediti boš moral podpisno komponento.
Pred leti sem se s tem resno ukvarjal. Nekje bi moral imeti ravno tak primer, kot ga želiš.

Re: Digitalno podpisovanje na webu

OdgovorObjavljeno: 20 Mar 2018, 22:14
Napisal/-a blasny
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

Re: Digitalno podpisovanje na webu

OdgovorObjavljeno: 20 Mar 2018, 22:45
Napisal/-a seba
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.