Logowanie się certyfikatem do strony internetowej

Tagi: #<Tag:0x00007f8df6c928a0> #<Tag:0x00007f8df6c92710>

W tym poradniku dowiesz się jak skonfigurować serwer WWW aby móc logować się certyfikatem zabezpieczeń.

Na sam początek trochę teorii.

Wstęp

Logowanie certyfikatem do strony internetowej jest wygodnym i bezpiecznym sposobem autoryzacji. Aby móc zalogować się do zabezpieczonej strony przy pomocy wyżej wymienionego sposobu należy posiadać na komputerze certyfikat (który jest cyfrowo podpisany przez serwer) w magazynie “Osobisty” (w przypadku Windowsa). Jeżeli taki certyfikat (wraz z kluczem prywatnym) posiadamy to przy próbie wejścia na zabezpieczoną stronę pokaże się komunikat dot. wyboru certyfikatu jakim chcemy się zalogować, wybieramy certyfikat, klikamy OK i mamy dostęp.

Zasada działania

Mechanizm logowania certyfikatem do strony WWW działa na bazie infrastruktury klucza publicznego (PKI).
Infrastruktura klucza publicznego (PKI) składa się z:

  • Urzędu certyfikacji (CA)
  • Urzędu rejestracji (RA)
  • Organu zatwierdzającego (VA)
  • Subskrybenta (Właściciela certyfikatu)

Urząd certyfikacji (CA) to podmiot który wystawia certyfikaty cyfrowe. Kluczem CA cyfrowo podpisuje się certyfikat subskrybenta, podpisany cyfrowo certyfikat subskrybenta automatycznie ma dostęp do chronionej zawartości strony WWW. CA też generuje listy unieważnionych certyfikatów (CRL) , jeżeli certyfikat użytkownika znajduje się na takiej liście to wtedy użytkownik nie będzie mógł się zalogować.

Urząd rejestracji (RA) to podmiot zbierający wnioski o złożenie podpisu cyfrowego na certyfikacie (plik .csr). RA może weryfikować tożsamość subskrybentów i decydować czy podpis cyfrowy zostanie złożony.

Organ zatwierdzający (VA) jest to system który weryfikuje poprawność certyfikatu wysłanego do serwera i sprawdza czy wysłany certyfikat nie znajduje się na liście CRL (lista unieważnionych certyfikatów).

Subskrybent to podmiot który posiada certyfikat cyfrowo podpisany przez CA. Inaczej osoba która ma dostęp do zawartości chronionej na serwerze WWW.

Administrator serwera WWW który chce dać użytkownikowi dostęp do zawartości chronionej na serwerze WWW musi użytkownikowi wygenerować certyfikat który jest cyfrowo podpisany przez CA. Po wygenerowaniu certyfikatu administrator przekazuje certyfikat wraz z kluczem prywatnym użytkownikowi, użytkownik musi certyfikat zainstalować na swoim urządzeniu. Przy każdym wejściu na stronę WWW użytkownik cyfrowo podpisuje swoim certyfikatem żądanie dostępu, następnie certyfikat z podpisanym żądaniem jest wysyłany na serwer WWW, serwer WWW wysyła żądanie weryfikacji do VA gdzie jest sprawdzana poprawność podpisu cyfrowego i jest sprawdzana obecność certyfikatu na liście CRL. VA wysyła serwerowi WWW odpowiedź pozytywną lub negatywną. Jeżeli serwer otrzyma odpowiedź pozytywną od VA to wtedy użytkownik zostanie zalogowany, w przeciwnym razie użytkownikowi wyświetli się odpowiedni komunikat.

Koniec tej teorii, pewnie nikt tego nie czytał :kappa:

Co będzie wymagane:

  • VPS/komputer/serwer dedykowany/etc. z zainstalowanym Ubuntu czy Debianem.
  • Serwer WWW (apache2 lub nginx).
  • Włączony i skonfigurowany SSL na serwerze WWW.
  • Wymuszenie przekierowania z HTTP na HTTPS na serwerze WWW.

Tworzenie PKI

Infrastruktura klucza publicznego (PKI) będzie odpowiedzialna za wystawianie/anulowanie certyfikatów i sprawdzania ich poprawności. PKI nie jest serwerem czy usługą, PKI możemy nawet zrobić na swoim komputerze czy na maszynie która nie ma dostępu do internetu a listę certyfikatów anulowanych (CRL) można aktualizować manualnie.

Aby zainstalować narzędzie które pomoże w tworzeniu PKI w systemie Ubuntu czy Debian należy wykonać polecenie:

apt install easy-rsa

Po zainstalowaniu easy-rsa należy stworzyć katalog w którym będzie się znajdować PKI, robimy to tym poleceniem:

make-cadir [nazwa katalogu]

następnie przechodzimy do katalogu w którym jest PKI, w tym celu wykonujemy to polecenie:

cd [nazwa katalogu]

teraz trzeba edytować pare linijek w pliku vars, aby otworzyć edytor należy użyć tego polecenia (na potrzeby poradnika użyłem polecenia nano) :

nano vars

przechodzimy do linijki nr. 29 i edytujemy wartość export KEY_CONFIG. Należy usunąć wartość $EASY_RSA/witchopensslcnf $EASY_RSA i zastąpić wartością "$EASY_RSA/openssl-1.0.0.cnf". Linijka nr. 29 powinna wyglądać tak:

następnie przechodzimy do linijki nr. 69 i trzeba teraz edytować wartości następujących zmiennych:

  • export KEY_COUNTRY — Kod państwa (np. PL)
  • export KEY_PROVINCE — Województwo (np. LD czy Lodzkie)
  • export KEY_CITY — Miasto (np. Lodz)
  • export KEY_ORG — Organizacja
  • export KEY_EMAIL — Adres e-mail
  • export KEY_OU — Jednostka organizacyjna (np. Dział IT)
  • export KEY_NAME — Nazwa PKI (np. Moja strona)

Przykładowa konfiguracja:

Zapisujemy plik vars i wychodzimy z edytora.

Po dokonaniu zmian w pliku vars należy wykonać następujące polecenia:

source vars
./clean-all
./build-ca

Po wykonaniu polecenia ./build-ca openssl będzie nas pytał o dane do certyfikatu, zostawiamy wartości domyślne (klikamy cały czas enter aż do momentu kiedy pokaże się znak zachęty).

Konfiguracja serwera WWW

Nie będę tutaj opisywać jak skonfigurować serwer WWW tylko opiszę jak skonfigurować VirtualHosta tak aby wymagał certyfikatu zabezpieczeń.

Konfiguracja dla apache2

VirtualHost w apache2 musi mieć skonfigurowany SSL i musi być wymuszone przekierowanie z HTTP na HTTPS.

Tworzymy folder ssl w którym będą przechowywane certyfikaty CA. Robimy to poleceniem:

mkdir /etc/apache2/ssl

teraz przechodzimy do folderu w którym mamy PKI. Następnie trzeba przejść do folderu keys poleceniem:

cd keys

następnie trzeba skopiować plik ca.crt do /etc/apache2/ssl, robimy to poleceniem:

cp ca.crt /etc/apache2/ssl

Otwieramy konfigurację VirtualHosta którego chcemy zabezpieczyć. Po otworzeniu konfiguracji VirtualHosta należy dodać następujące linijki tekstu do konfiguracji:

SSLCACertificateFile “/etc/apache2/ssl/ca.crt”
SSLVerifyClient require
SSLVerifyDepth 5

Zapisujemy plik i restartujemy serwer poleceniem:

service apache2 restart

Przykładowa konfiguracja:

Konfiguracja dla nginx

Podobnie jak wyżej. VirtualHost w nginx musi mieć skonfigurowany SSL i wymuszone przekierowanie z HTTP na HTTPS.

Tworzymy folder ssl w którym będą przechowywane certyfikaty CA. W tym celu wykonujemy następujące polecenie:

mkdir /etc/nginx/ssl

Przechodzimy do folderu w którym mamy PKI. Następnie przechodzimy do folderu keys, aby to zrobić trzeba wykonać następujące polecenie:

cd keys

teraz kopiujemy plik ca.crt do /etc/nginx/ssl. Robimy to tym poleceniem:

cp ca.crt /etc/nginx/ssl

Otwieramy konfigurację VirtualHosta którego chcemy zabezpieczyć. Po otworzeniu konfiguracji VirtualHosta należy dodać następujące linijki tekstu do konfiguracji:

ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client optional;
ssl_session_timeout 5m;
keepalive_timeout 10;
ssl_session_cache shared:SSL:10m;
ssl_verify_depth 10;

if ($ssl_client_verify = NONE) {
return 302 http://example.com;
}

W miejscu http://example.com można wstawić inny adres strony do której użytkownik zostanie przekierowany w przypadku niepowodzenia autoryzacji.

Zapisujemy plik i restatrujemy serwer poleceniem:

service nginx restart

Przykładowa konfiguracja:

Generowanie certyfikatów użytkownikom

Aby wygenerować certyfikat użytkownikowi należy przejść do folderu w którym zostało stworzone PKI. Jeżeli znajdujesz się w tym folderze wykonaj następujące polecenie:

./build-key-pkcs12 [nazwa pospolita (CN)]

W zmiennej nazwa pospolita wpisz nazwę certyfikatu. Może to być login, imię czy jakakolwiek inna nazwa.

Jak wykonasz polecenie ./build-key-pkcs12 to wyświetlą się pytania dot. danych do certyfikatu. Jeżeli chcesz możesz zmienić, jeżeli chcesz zostawić pole domyślne klikasz ENTER, jeżeli chcesz wyczyścić pole wpisujesz kropkę [.]. Na końcu pokaże się pytanie czy chcesz podpisać ten certyfikat, wybierz tak [y]. Tak samo zrób z pytaniem 1 out of 1 certificate requests certified, commit?.

Wyświetli się prośba aby wpisać hasło które będzie zabezpieczać klucz prywatny (hasło eksportu), wymyślamy hasło i klikamy enter, potem wyświetli się prośba o potwierdzenie hasła. Wpisujemy ponownie to samo hasło i klikamy ENTER.

Klucz został zapisany w folderze keys pod nazwą [nazwa pospolita (CN)].p12. Logujemy się poprzez SFTP i przenosimy ten klucz na swój komputer.

Instalowanie certyfikatu

Po skopiowaniu pliku z rozszerzeniem .p12 uruchamiamy ten plik. Zaznaczamy Bieżący użytkownik i klikamy Dalej.

W następnym oknie nic nie zmieniamy, klikamy Dalej. Po kliknięciu Dalej trzeba wpisać hasło zabezpieczające klucz prywatny (hasło eksportu) i zalecane jest zaznaczenie opcji Włącz silną ochronę klucza prywatnego, włączenie tej opcji będzie wymagało potwierdzenia użytkownika przed użyciem klucza prywatnego przez jakąkolwiek aplikacje.

W następnym oknie zostawiamy opcję Automatycznie wybierz magazyn certyfikatów na podstawie typu certyfikatu i klikamy Dalej.

Potem klikamy Zakończ.

Jeżeli wybraliśmy opcję Włącz silną ochronę klucza prywatnego to teraz trzeba będzie skonfigurować ochronę. Należy kliknąć przycisk Ustaw poziom zabezpieczeń...

import#3

i trzeba wybrać poziom ochrony. Jeżeli wybierzemy Wysoki to trzeba będzie wpisać hasło aby jakakolwiek aplikacja mogła użyć klucza prywatnego.

import#4

Jeżeli wybierzemy Średni to tylko trzeba będzie kliknąć przycisk Zezwalaj jakby jakakolwiek aplikacja chciałaby wykorzystać klucz prywatny.

Po wybraniu poziomu zabezpieczeń należy nacisnąć przycisk OK.

import#5

Następnie wyświetli się komunikat informujący że certyfikat CA będzie musiał być dodany do zaufanych, należy nacisnąć przycisk TAK.

Po naciśnięciu przycisku TAK, wyświetli się komunikat że import został zakończony sukcesem.

Logowanie się przy pomocy certyfikatu

Wystarczy wejść na stronę która została zabezpieczona powyższym sposobem. Przeglądarka sama wyświetli okienko z możliwością wyboru certyfikatu. Wybieramy certyfikat, klikamy OK a następnie Zezwalaj (Jeżeli został ustawiony wysoki poziom zabezpieczeń wpisujemy hasło i klikamy Zezwalaj, jeżeli nie została zaznaczona opcja Włącz silną ochronę klucza prywatnego drugi komunikat się nie wyświetli.) .

Jeżeli wszystko zostało dobrze skonfigurowane powinna wyświetlić się zawartość chronionej strony:

Unieważnienie certyfikatu

Nieraz z różnych powodów trzeba konkretnemu użytkownikowi odebrać dostęp do zabezpieczonej strony WWW. Aby to zrobić należy wejść do katalogu w którym jest PKI i trzeba wykonać polecenie:

source vars
./revoke-full [nazwa pospolita (CN)]

W folderze keys został zapisany plik o nazwie crl.pem. Teraz trzeba w konfiguracji serwera WWW wskazać lokalizację tego pliku.

Do konfiguracji zabezpieczonego VirtualHosta trzeba dodać następującą linijkę tekstu:

Dla apache2:

SSLCARevocationFile [ścieżka do folderu PKI]/keys/crl.pem

Dla nginx:

ssl_crl [ścieżka do folderu PKI]/keys/crl.pem;

Zapisujemy konfigurację i restatujemy serwer WWW.

UWAGA!!! Jeżeli anulujemy certyfikat poleceniem ./revoke-full to trzeba zrestartować serwer WWW aby zmiany zostały wprowadzone w życie.

Inne sposoby przechowywania certyfikatu

Certyfikat zabezpieczeń wraz z kluczem prywatnym można przechowywać w:

  • Karcie inteligentnej
  • Module TPM

Jeżeli chcemy przechowywać certyfikat z kluczem prywatnym na karcie inteligentnej czy w module TPM (Trusted Platform Module) to przy każdej próbie użycia klucza trzeba będzie wpisać kod PIN od karty inteligentnej czy TPMu.

Moduł TPM to mikroukład który może znajdywać się na płycie głównej komputera (zazwyczaj TPMy są instalowane w laptopach) który daje możliwość użytkownikowi lub systemowi do korzystania z zaawansowanych funkcji zabezpieczeń. Działanie TPM jest zbliżone do działania karty inteligentnej.

Instalowanie certyfikatu na module TPM

aby móc zainstalować certyfikat na TPM’ie trzeba stworzyć wirtualną kartę inteligentną która będzie przechowywana na TPM’ie. Aby to zrobić należy otworzyć wiersz poleceń (cmd) w trybie administratora i wpisać polecenie:

tpmvscmgr create /name “nazwa modułu” /adminkey random /pin prompt /puk prompt /pinpolicy minlen 4 maxlen 8 /attestation AIK_AND_CERT /generate

W zmiennej nazwa modułu wpisujemy jakąkolwiek wymyśloną nazwę wirtualnej karty inteligentnej. Po wpisaniu tego polecenia wyświetlą się pytania o kod PIN i kod PUK. Wymyślamy 4-cyfrowy kod PIN i wpisujemy ten kod. Potem wymyślamy 8-cyfrowy kod PUK i też go wpisujemy. Warto gdzieś zapisać kod PUK, w przypadku jak zablokujemy wirtualną kartę inteligentną na TPM’ie poprzez wpisanie 5 razy złego PINu to przy pomocy kodu PUK możemy tą kartę odblokować.

Po stworzeniu wirtualnej karty inteligentnej możemy zainstalować certyfikat zabezpieczeń wraz z kluczem na wirtualnej karcie, robimy to poleceniem w cmd (z uprawnieniami administratora) :

certutil -csp “Microsoft Base Smart Card Crypto Provider” -importpfx [ścieżka do pliku .p12]

po wpisaniu polecenia trzeba wpisać hasło eksportu certyfikatu, hasło zatwierdzamy klawiszem ENTER. Potem wyświetli się żądanie wpisania kodu PIN od TPMu.

Po wpisaniu poprawnego kodu PIN certyfikat zostanie zaimportowany na moduł TPM.

Od tej pory jak wejdziemy na stronę WWW wymagającą certyfikatu to trzeba będzie wpisać kod PIN od TPM aby móc się zalogować.

Ogólnie mówiąc jest to wygodny i bezpieczny sposób autoryzacji, jest przydatny np. do zabezpieczenia dostępu do stron natury technicznej typu phpMyAdmin. Da się też skonfigurować serwer WWW tak aby dodać zmienną w PHP która zwracałaby nazwę pospolitą certyfikatu którym użytkownik aktualnie się zalogował.

Mam nadzieję że jakoś pomogłem.

Poradnik miesiąca: styczeń 2020

9lajków