Zdarzają się sytuacje w których chcemy by do danej strony internetowej dostęp miały tylko wybrane osoby. Jest wiele sposobów na zaimplementowanie takiej funkcjonalności - tutaj użyjemy do tego certyfikatów SSL które będą szyfrowały połączenie z serwerem i dodatkowo zweryfikują łączącego się klienta. Ten sposób ma tą zaletę, że nieupoważniony użytkownik nawet nie będzie w stanie połączyć się z serwerem by spróbować się autoryzować za pomocą loginu/hasła, połączenie zostanie odrzucone na etapie negocjacji połączenia SSL.

Tworzymy klucz prywatny dla centrum autoryzacji (CA):

openssl genrsa -des3 -out myCA.key 4096

Potrzebny będzie plik konfiguracyjny myCA.conf do centrum autoryzacji:

basicConstraints=CA:true

Bez tego parametru Android od wersji 11 odrzuci certyfikat CA, który jest używany do weryfikacji klienta.

Tworzymy nasze CA:

openssl req -new -key myCA.key -out myCA.pem

Jako Common Name podajemy cokolwiek - jeśli ma to być domena to ważne by nie była to domena którą może dostać jakiś serwer dla którego będziemy później wystawiać certyfikat.

openssl x509 -req -days 1825 -in myCA.pem -signkey myCA.key -extfile myCA.conf -out myCA.crt

Termin ważności nie może być dłuższy niż 5 lat - w innym przypadku będą problemy na nowszych systemach.

Sprawdzamy czy nasz certyfikat CA zawiera sekcję X509v3 a w niej w podsekcji X509v3 Basic Constraints czy jest CA:TRUE

openssl x509 -inform pem -in myCA.crt -text

Klucz dla certyfikatu serwera:

openssl genrsa -out domena.tmp.key 4096

Tworzymy plik CSR z żądaniem podpisania certyfikatu - tutaj istotne jest pole CN (domena którą będzie posługiwał się serwer).

openssl req -new -key domena.tmp.key -out domena.tmp.csr

Plik domena.tmp.ext z rozszerzeniem zawierającym opcję SAN, na podstawie którego wygenerowany zostanie certyfikat:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:false
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = domena.tmp

SAN jest niezbędny dla nowszych wersji przeglądarek - bez tego uznają certyfikat za niepoprawny.

Towrzymy certyfikat serwera:

openssl x509 -req -days 825 -in domena.tmp.csr -CA myCA.crt -CAkey myCA.key -set_serial 01 -extfile domena.tmp.ext -out domena.tmp.crt

Podobnie jak wcześniej mamy ograniczenie co do ważności certyfikatu - tym razem nie dłużej niż nieco ponad 2 lata...

Generujemy plik potrzebny na urządzeniu klienckim na podstawie którego serwer będzie w stanie stwierdzić czy łączące się urządzenie to rzeczywiście upoważniony klient.

openssl pkcs12 -export -inkey domena.tmp.key -in domena.tmp.crt -certfile myCA.crt -out domena.tmp.pfx

Sprawdzamy czy certyfikaty są wygenerowane poprawnie:

openssl verify -verbose -CAfile myCA.crt domena.tmp.crt

Dalsze postępowanie zależy już do tego na jakim serwerze mają być zainstalowane certyfikaty. Pliki które musimy umieścić na serwerze to:

  • myCA.crt
  • domena.tmp.crt
  • domena.tmp.key

Klient musi mieć zainstalowane w swoim centrum certyfikatów:

  • myCA.crt
  • domena.tmp.pfx

Poprzedni wpis Następny wpis