infrastruktura klucza...

9
01.10.2019 Strona 1 z 9 Infrastruktura Klucza Publicznego W laboratorium zostanie wykorzystane środowisko OpenSSL. Jest to zestaw narzędzi kryptograficznych, pozwalających na wykorzystywanie m.in. popularnych algorytmów kryptografii symetrycznej i asymetrycznej, funkcji skrótów i certyfikatów. Środowisko składa się z modułów, odpowiedzialnych za obsługę poszczególnych technologii. W zadaniu zostaną wykorzystane głównie moduły genrsa (do generowania kluczy RSA), rsa (do zarządzania kluczami) oraz req (do składania wniosków o podpisanie certyfikatu, tzw. CSR – Certificate Signing Request). Użytkowanie odbywa się w trybie interaktywnym (po wpisaniu polecenia openssl w terminalu) lub skryptowym: openssl MODUŁ PARAMETRY_MODUŁU W zadaniu wykorzystamy możliwość tworzenia infrastruktury klucza publicznego (PKI Public Key Infrastructure). Utworzona zostanie najprostsza możliwa architektura PKI – główny urząd certyfikacji (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura PKI z zadania (źródło tego i następnych obrazków: pki-tutorial.readthedocs.io). Należy mieć świadomość, że w rzeczywistym stosowaniu PKI architektura jest zazwyczaj dwuwarstwowa z wydzielonymi Intermediate CA, osobnymi dla usług różnych typów lub trójwarstwowa z dodatkowym podziałem zależnym od funkcji certyfikatów w danej usłudze (np. osobne CA do wystawiania certyfikatów dla użytkowników w sieci oraz osobne dla usług w tej samej sieci):

Upload: others

Post on 03-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 1 z 9

Infrastruktura Klucza Publicznego

W laboratorium zostanie wykorzystane środowisko OpenSSL. Jest to zestaw narzędzi

kryptograficznych, pozwalających na wykorzystywanie m.in. popularnych algorytmów kryptografii

symetrycznej i asymetrycznej, funkcji skrótów i certyfikatów. Środowisko składa się z modułów,

odpowiedzialnych za obsługę poszczególnych technologii. W zadaniu zostaną wykorzystane głównie

moduły genrsa (do generowania kluczy RSA), rsa (do zarządzania kluczami) oraz req (do składania

wniosków o podpisanie certyfikatu, tzw. CSR – Certificate Signing Request).

Użytkowanie odbywa się w trybie interaktywnym (po wpisaniu polecenia openssl w terminalu) lub

skryptowym: openssl MODUŁ PARAMETRY_MODUŁU

W zadaniu wykorzystamy możliwość tworzenia infrastruktury klucza publicznego (PKI – Public Key

Infrastructure). Utworzona zostanie najprostsza możliwa architektura PKI – główny urząd certyfikacji

(Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA):

Rys.1. Architektura PKI z zadania (źródło tego i następnych obrazków: pki-tutorial.readthedocs.io).

Należy mieć świadomość, że w rzeczywistym stosowaniu PKI architektura jest zazwyczaj

dwuwarstwowa z wydzielonymi Intermediate CA, osobnymi dla usług różnych typów lub

trójwarstwowa z dodatkowym podziałem zależnym od funkcji certyfikatów w danej usłudze (np.

osobne CA do wystawiania certyfikatów dla użytkowników w sieci oraz osobne dla usług w tej samej

sieci):

Page 2: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 2 z 9

Rys. 2. Typowa dwuwarstwowa architektura PKI.

Rys. 3. Typowa trójwarstwowa architektura PKI.

Page 3: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 3 z 9

Formaty zapisu certyfikatów:

DER - Distinguished Encoding Rules – binarny plik, często wykorzystywany w systemach Windows

(domyślny format eksportu kluczy i certyfikatów w Windows)

PEM - Privacy Enhanced Mail – certyfikat lub klucz, pierwotnie w formacie DER, zakodowany

w Base64, popularny w systemach Linux i większości oprogramowania (Apache mod_ssl, stunnel itd.)

P12 – PKCS #12 – format przechowywania pary kluczy (publicznego i prywatnego) w stanie

zaszyfrowanym, zabezpieczonych hasłem. Rozwinięty przez Microsoft i tam najczęściej spotykany,

opisany w RFC 7292.

Często spotykane są także rozszerzenia plików:

.key – klucz prywatny

.pub – klucz publiczny

.crt – certyfikat, często wykorzystywane rozszerzenie w Windows jako synonim do .pem

Instrukcja do ćwiczenia:

Główny urząd certyfikacji (Root CA) jest źródłem zaufania. Inne urządzenia w sieci ufają posiadaczom

certyfikatów podpisanych przez Root CA bezpośrednio (raczej rzadko spotykane rozwiązanie) lub

pośrednio, poprzez pośrednie urzędy certyfikacji (Intermediate CA), których zadaniem jest

wystawianie certyfikatów końcowym użytkownikom lub usługom.

Klucze prywatne powinny być dobrze chronione. Skompromitowanie klucza prywatnego prowadzi do

równoczesnego skompromitowania dokumentów podpisanych z jego pomocą – nie da się określić,

czy podpisy zostały wystawione przez prawowitego właściciela klucza. Szczególnie dobrze powinny

być chronione klucze urzędów certyfikacji. Dlatego też Root CA wykorzystuje się tylko do

podpisywania kluczy urzędów pośrednich – sam klucz Root CA przechowywany powinien być

w bezpiecznym środowisku, jak moduł HSM lub odizolowane od sieci urządzenie, wykorzystywane

tylko jako przestrzeń dla CA.

W przypadku skompromitowania CA skompromitowane zostają również wszystkie certyfikaty przez

niego wystawione, także pośrednio (nie jest problemem utworzyć pośrednie CA, korzystając ze

skradzionego klucza).

1. Utworzenie Root CA

Należy rozpocząć od utworzenia miejsca (katalogu) przechowywania plików składających się na Root

CA. Wykorzystany zostanie w tym celu katalog /root/ca:

# mkdir /root/ca

W stworzonym katalogu musi zostać utworzona struktura urzędu. Podkatalogi służą do

przechowywania wydanych certyfikatów (certs), nowych certyfikatów (newcerts), przechowywania

informacji o unieważnionych certyfikatach (crl) oraz klucza prywatnego CA (private). Podane nazwy

są przykładowe, jednak muszą zostać umieszczone w pliku konfiguracyjnym OpenSSL. Plik index.txt

jest wykorzystywany jako baza danych o podpisanych certyfikatach, a serial jest numerem

porządkowym ostatnio wydanego certyfikatu.

Page 4: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 4 z 9

# cd /root/ca

# mkdir certs crl newcerts private

# chmod 700 private

# touch index.txt

# echo 1000 > serial

Następnym krokiem jest stworzenie pliku konfiguracyjnego OpenSSL dla urzędu certyfikacji.

Przykładowy plik dostępny jest pod adresem https://jamielinux.com/docs/openssl-certificate-

authority/appendix/root-configuration-file.html (bezpośredni link do pliku:

https://jamielinux.com/docs/openssl-certificate-authority/_downloads/root-config.txt lub skrócony:

http://urwij.net/1804/) i zostanie on przez nas użyty w dalszej części instrukcji. Nazwę pliku należy

zmienić na openssl.cnf lub w dalszej części instrukcji odpowiednio wykorzystywać aktualną nazwę.

Obowiązkowa sekcja [ ca ] zawiera wskazanie na stosowaną sekcję konfiguracji (może być ich więcej).

W sekcji [ default_ca ] odpowiedzialnej za konfigurację urzędu certyfikacji, wskazywana jest polityka

wystawiania certyfikatów. Określa ona, między innymi, jakie atrybuty muszą być w nich zawarte

i jakie wartości są dozwolone. W przypadku urzędu Root CA, przyjętą w przykładzie polityką jest

policy_strict, zostanie ona wykorzystana tylko dla certyfikatów wystawianych przez Root CA, a więc

tylko certyfikatów urzędów pośrednich. Certyfikaty końcowe (dla usług i użytkowników) wystawiane

będą z użyciem polityki policy_loose.

Za obsługę wniosków o podpisanie kluczy odpowiada sekcja [ req ] i wskazywane przez nią następne

sekcje. Dodatkowe atrybuty zawarte w certyfikatach, opisywane standardem X.509v3, obsługuje

sekcja [ v3_ca ].

Pozostałe sekcje omówione zostaną później.

Następnym krokiem jest utworzenie pary kluczy Root CA. Klucz musi być przechowywany

w bezpiecznym miejscu i mieć możliwie dużą długość – klucz prywatny Root CA wykorzystywany jest

rzadko i niska wydajność związana z długością klucza nie jest problemem. Dużo ważniejsze jest, by

klucz nie został skompromitowany.

Plik z kluczem szyfrowany jest z wykorzystaniem algorytmu symetrycznego, pozwalającego na

przechowywanie go w ukrytej formie, zabezpieczonej podanym hasłem. Hasła, ani klucza

prywatnego, nie należy udostępniać.

# cd /root/ca

# openssl genrsa -aes256 -out private/ca.key.pem 4096

Enter pass phrase for ca.key.pem: SECRETPASSWORD

Verifying - Enter pass phrase for ca.key.pem: SECRETPASSWORD

# chmod 400 private/ca.key.pem

Dla stworzonego klucza prywatnego należy wygenerować samopodpisany certyfikat.

# cd /root/ca

# openssl req -config openssl.cnf \

-key private/ca.key.pem \

-new -x509 -days 7300 -sha256 -extensions v3_ca \

-out certs/ca.cert.pem

Page 5: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 5 z 9

Enter pass phrase for ca.key.pem: SECRETPASSWORD

You are about to be asked to enter information that will be incorporated

into your certificate request.

-----

Country Name (2 letter code) [XX]:PL

State or Province Name []:Malopolska

Locality Name []:

Organization Name []:MOJA NIEWIELKA FIRMA SP ZOO

Organizational Unit Name []:CA MOJEJ NIEWIELKIEJ FIRMY

Common Name []:MNF Root CA

Email Address []:

# chmod 444 certs/ca.cert.pem

Stworzony certyfikat można zweryfikować:

# openssl x509 -noout -text -in certs/ca.cert.pem

2. Utworzenie Intermediate CA

Dla pośredniego CA należy utworzyć osobny katalog i stworzyć w nim odpowiednią strukturę:

# mkdir /root/ca/intermediate

# cd /root/ca/intermediate

# mkdir certs crl csr newcerts private

# chmod 700 private

# touch index.txt

# echo 1000 > serial

Tworzymy także numer seryjny dla listy unieważnianych certyfikatów (CRL – Certificate Revocation

List):

# echo 1000 > /root/ca/intermediate/crlnumber

Kopiujemy konfigurację OpenSSL z Root CA:

# cp /root/ca/openssl.cnf /root/ca/intermediate/openssl.cnf

W konfiguracji należy poprawić zmienne odnoszące się do położenia odpowiednich plików i

katalogów, a także wskazać politykę odpowiednią dla pośredniczącego CA, służącego do

podpisywania certyfikatów dla użytkowników końcowych:

[ CA_default ]

dir = /root/ca/intermediate

private_key = $dir/private/intermediate.key.pem

certificate = $dir/certs/intermediate.cert.pem

crl = $dir/crl/intermediate.crl.pem

policy = policy_loose

Należy także utworzyć parę kluczy dla pośredniczącego CA. Klucza tego nie należy nikomu ujawniać,

ponieważ jego skompromitowanie będzie prowadzić do możliwości wystawiania certyfikatów przez

kogoś, kto przechwyci klucz prywatny.

# cd /root/ca

# openssl genrsa -aes256 \

-out intermediate/private/intermediate.key.pem 4096

Enter pass phrase for intermediate.key.pem: SECRETPASSWORD

Page 6: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 6 z 9

Verifying - Enter pass phrase for intermediate.key.pem: SECRETPASSWORD

# chmod 400 intermediate/private/intermediate.key.pem

Po stworzeniu klucza prywatnego należy wystąpić o jego podpisanie do Root CA. Służy do tego tzw.

CSR. Dane wprowadzane we wniosku o podpisanie certyfikatu powinny zgadzać się z danymi

podanymi przy podpisywaniu Root CA, z wyjątkiem opcji „Common Name”, która nie może być taka

sama i powinna identyfikować pośredniczące CA.

Podczas tworzenia CSR należy wskazać plik konfiguracji OpenSSL właściwy dla Intermediate CA.

# cd /root/ca

# openssl req -config intermediate/openssl.cnf -new -sha256 \

-key intermediate/private/intermediate.key.pem \

-out intermediate/csr/intermediate.csr.pem

Enter pass phrase for intermediate.key.pem: secretpassword

You are about to be asked to enter information that will be incorporated

into your certificate request.

-----

Country Name (2 letter code) [XX]:PL

State or Province Name []:Malopolska

Locality Name []:

Organization Name []:MOJA NIEWIELKA FIRMA SP ZOO

Organizational Unit Name []:CA MOJEJ NIEWIELKIEJ FIRMY

Common Name []:MNF Intermediate CA

Email Address []:

Podpisujemy certyfikat Intermediate CA z użyciem klucza prywatnego Root CA (należy podać hasło

zabezpieczające klucz):

# cd /root/ca

# openssl ca -config openssl.cnf -extensions v3_intermediate_ca \

-days 3650 -notext -md sha256 \

-in intermediate/csr/intermediate.csr.pem \

-out intermediate/certs/intermediate.cert.pem

Ustawiamy w następnej kolejności odpowiednie uprawnienia do pliku z certyfikatem serwera

pośredniczącego:

# chmod 444 intermediate/certs/intermediate.cert.pem

Informacja o podpisaniu certyfikatu powinna pojawić się w bazie operacji Root CA, w pliku index.txt.

Wystawiony certyfikat dla Intermediate CA można zweryfikować, wyświetlając jego parametry:

# openssl x509 -noout -text \

-in intermediate/certs/intermediate.cert.pem

Można zweryfikować go także z użyciem certyfikatu Root CA:

# openssl verify -CAfile certs/ca.cert.pem \

intermediate/certs/intermediate.cert.pem

intermediate.cert.pem: OK.

Page 7: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 7 z 9

Użytkownik, który chce upewnić się, że usługa, z której chce skorzystać, została potwierdzona przez

zaufany przez niego urząd certyfikacji (źródło zaufania), musi mieć możliwość otworzenia tzw.

„łańcucha zaufania”. Są to certyfikaty głównego CA oraz wszystkich pośredniczących CA pomiędzy

Root CA a końcową usługą, lub użytkownikiem, którego chcemy uwierzytelnić.

Łańcuch zaufania realizuje się poprzez dostarczenie pliku ze wszystkimi certyfikatami (od Root CA

włącznie) lub pliku ze wszystkimi certyfikatami z łańcucha, poza Root CA. Certyfikat Root CA

zazwyczaj dostarczany jest osobno i wymagane jest, by był on w systemie użytkownika uznany za

zaufany, ponieważ jest on certyfikatem samopodpisanym i nie ma innej możliwości jego weryfikacji.

W przypadku infrastruktury PKI z zadania łańcuch zaufania składa się z dwóch certyfikatów: Root CA

oraz Intermediate CA. Tworzy się go poprzez zapisanie do pliku tych dwóch certyfikatów:

# cat intermediate/certs/intermediate.cert.pem \

certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem

Dodatkowo, można nadać odpowiednie uprawnienia dostępu do pliku, zmniejszając możliwość jego

nieumyślnej modyfikacji:

# chmod 444 intermediate/certs/ca-chain.cert.pem

3. Utworzenie certyfikatu użytkownika końcowego

Dla użytkownika końcowego należy utworzyć parę kluczy, a następnie wniosek o podpisanie (CSR).

W przykładzie działanie to wykonywane jest już w urzędzie certyfikacji, jednak często – jeżeli

użytkownik nie chce ujawniać swojego klucza prywatnego – samodzielnie generuje CSR i wysyła do

podpisania przez CA. Funkcję pośredniczącą może pełnić także wydzielony urząd rejestracji (RA –

Registration Authority).

Należy utworzyć parę kluczy dla użytkownika. Klucz może mieć długość 2048, co spowoduje większą

wydajność szyfrowania takim kluczem. Ponieważ nie jest on krytyczny, a zazwyczaj podpis

wystawiany jest na około rok, taka długość klucza jest dopuszczalna. Opcję –aes256 można pominąć,

jeśli klucz ma pozostać niezaszyfrowany (w przypadku szyfrowania, każdorazowe użycie klucza,

wymaga podania hasła do niego, np. przy restarcie serwera HTTPS lub szyfrowaniu wiadomości e-

mail).

# cd /root/ca

# openssl genrsa -aes256 \

-out intermediate/private/www.example.com.key.pem 2048

# chmod 400 intermediate/private/www.example.com.key.pem

Dla utworzonego klucza należy wygenerować CSR:

# cd /root/ca

# openssl req -config intermediate/openssl.cnf \

-key intermediate/private/www.example.com.key.pem \

-new -sha256 -out intermediate/csr/www.example.com.csr.pem

Enter pass phrase for www.example.com.key.pem: secretpassword

You are about to be asked to enter information that will be incorporated

into your certificate request.

-----

Country Name (2 letter code) [XX]:PL

Page 8: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 8 z 9

State or Province Name []:Malopolska

Locality Name []:Krakow

Organization Name []:INNA NIEWIELKA FIRMA

Organizational Unit Name []:WWW INNEJ NIEWIELKIEJ FIRMY

Common Name []:www.example.com

Email Address []:

Wniosek CSR podpisujemy kluczem Intermediate CA:

# cd /root/ca

# openssl ca -config intermediate/openssl.cnf \

-extensions server_cert -days 375 -notext -md sha256 \

-in intermediate/csr/www.example.com.csr.pem \

-out intermediate/certs/www.example.com.cert.pem

# chmod 444 intermediate/certs/www.example.com.cert.pem

Poprawność klucza można zweryfikować, wyświetlając jego parametry:

# openssl x509 -noout -text \

-in intermediate/certs/www.example.com.cert.pem

…oraz weryfikując „łańcuch zaufania”:

# openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \

intermediate/certs/www.example.com.cert.pem

Wygenerowany certyfikat można użyć np. w szyfrowaniu lub uwierzytelnianiu poczty elektronicznej,

stron WWW dostępnych po HTTPS itd.

4. Konfiguracja certyfikatu serwera HTTPS

Następnym krokiem będzie instalacja i konfiguracja serwera HTTPS z przykładową stroną,

zabezpieczoną certyfikatem.

Należy zainstalować serwer Apache 2:

# apt-get –y install apache2

Uruchomić moduł SSL w Apache:

# a2enmod ssl

Następnym krokiem jest konfiguracja serwera: W pliku /etc/apache2/sites-available/default-ssl.conf

należy wskazać klucz serwera, certyfikat serwera oraz obsługiwane domeny (pogrubione elementy

powinny zostać ustawione zgodnie z dotychczasową konfiguracją):

<IfModule mod_ssl.c>

<VirtualHost _default_:443>

ServerAdmin [email protected]

ServerName www.example.com

ServerAlias example.com

(…)

SSLEngine on

SSLCertificateFile /root/ca/intermediate/certs/www.example.com.cert.pem

SSLCertificateKeyFile /root/ca/intermediate/private/www.example.com.key.pem

(…)

</VirtualHost>

</IfModule>

Page 9: Infrastruktura Klucza Publicznegohome.agh.edu.pl/~dsuder/prymus/20191126_3-pki-infrastructure.pdf · (Root CA) oraz jeden podległy mu urząd podpisujący (Signing CA): Rys.1. Architektura

01.10.2019

Strona 9 z 9

Po skonfigurowaniu, należy włączyć SSL dla hostowanej strony WWW oraz zrestartować serwer

Apache 2:

# a2ensite default-ssl.conf

# service apache2 stop

# service apache2 start

Nie należy stosować polecenia service apache2 restart, ponieważ w trakcie jego wykonywania

użytkownik nie zostanie zapytany o klucz szyfrowania klucza prywatnego i serwer nie uruchomi się

poprawnie.

Domenę www.example.com należy powiązać z adresem hosta lokalnego, inaczej nie zostanie on

rozwiązany na właściwy adres IP. Jest to konieczne, ponieważ certyfikat wystawiony został dla

konkretnej domeny, a nie adresu IP.

W pliku /etc/hosts należy dopisać linię:

127.0.0.1 www.example.com

Po wejściu na stronę https://www.example.com z wybranej przeglądarki internetowej, ukaże się

komunikat o niezaufanym certyfikacie. Łańcuch certyfikatów musi zostać dodany do magazynu

certyfikatów przeglądarki. W przypadku Mozilli Firefox jest to Preferences -> Advanced ->

Certificates -> View Certificates -> Authorities -> Import.

5. Źródła i materiały dodatkowe:

https://jamielinux.com/docs/openssl-certificate-authority/

https://pki-tutorial.readthedocs.io/en/latest/

https://www.phildev.net/ssl/opensslconf.html