NGINX – overovani uzivatele klientskymi SSL certifikaty

Na autentizaci uzivatele v prohlizeci se nejcasteji pouziva nejaky zpusob primo nad webserverem, nebo si aplikace resi autentizaci sama. Pokud se overeni deje primo nad webserverem, pouziva se nejcasteji http basic, nebo http digest autentizace.
Protoze se cim dal casteji prosazuje sifrovane HTTPS otevira se nam nova moznsot overeni – klientske SSL certifikaty.

Misto klasickeho dialogu pro zadani jmena a hesla k http basic auth se prohlizec overi svym klientskym ssl certifikatem. Server certifikat overi a uzivateli pristup povoli, nebo zamitne.

Oproti heslu je zde nesrovnatelne vetsi bezpecnost. Heslo typu „nbusr123“ a 4096 bitovy RSA klic se proste neda srovnavat…
Nelze opomenout i nevyhodu – certifikaty. Kazdy klient musi mit vygenerovany svuj certifikat a mit ho naiportovany ve svem prohlizeci. Soukrome klice je dobre chranit heslem, jinak odcizeni klice = ztrata hesla. Certifiakty je v pripade kompromitace mozne pomoci CA revokovat.

Dost nudneho uvodu – jdeme nastavovat!

Na ukazku pouzijeme nginx webserver. Zvolil jsem ho hlavne pro jeho rychle a jednoduche nastaveni ve srovnani s obrim Apachem.

Na serveru bezi Ubuntu 15.10 64b s distribucnim nginx. 

Nejdrive naistalujeme nginx:

a pote vytvorime soubor /etc/nginx/nginx.conf s timto obsahem:

a mame funkcni nginx server s podporou SSL/TLS. Server posloucha jen na TCP 443, na TCP 80 ne! Neni definovane presmerovani, takze je nutne pristupovat pres HTTPS!
Podle potreby je vhodne nastavit pouzite protokoly a sifry. Aktualne nebezpecne vypnout a nove pridat.
If v sekci location overi klientuv certifikat oproti certifikatu CA. Pokud neprojde, vrati chybu 403.

Aby mohlo vyse uvedene fungovat, musime mit certifikacni autoritu. Idealne je jednoducha autorita easy-rsa, o kterem jsem psal v souvislosti s OpenVPN.
Jmena typu localhost v certifiaktech jsou pouze ne ukazku!

Po otevreni https://ADRESA-SERVERU/ (a odsouhlaseni neduveryhodneho certifikatu) v Chrome dostaneme:

 

Overeni podle „jmena“ klienta

Konfigurak vyse povolil pristup vsem klientum, jejichz certifikat podepsala nase CA. Co kdyz ale potrebujeme, jako u http basic auth podle jmena/certifikatu klientovi pridelit urcita prava?

Jde to jednoduse pomoci analyzy atributu certifikatu. V certifikatu je dulezite DN, neboli „Distinguished Name (DName)“. Vypada nasledovne:

na overeni uzivatele potrebujeme CN (CommonName). Nginx umoznuje jednoduche parsovani CN z DN. Konfigurak nginx serveru vymenime za:

Funkce map nam zpristupni v promenne $ssl_client_s_dn_cn CN z certifikatu.

Zajimave jsou dva if-y v sekci location. Prvni overi klientuv certifikat a pokud je neplatny(vuci CA), vrati 403.
Druhy porovna CN z certifiaktu. Pokud je CN rovno „client2“, provode neco. Zde presmerovani na google. Pri porovnavani se opravdu pouziva jen jedno rovna se!

 

Nastaveni Google Chrome

Google Chrome vyzaduje certifikat ve formatu PFX, ve kterem je klientuv certifikat a soukromy klic. Ostatni prohlizece to budou mit asi stejne, nezkousel jsem.

Standardni crt a key soubory prevedeme na pfx pomoci openssl:

 

Popsal jsem pouze jednoduchou, ale funkcni ukazku. Generovani a sprava certifikatu je v odkazovanem clanku o OpenVPN. Pro pokrocilejsi nastaveni staci googlit.

 

 

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *