Wprowadzenie
Co to jest certyfikat? Przedstawiając sprawę ogólnie można powiedzieć, że certyfikat to dokument elektroniczny, który pozwala potwierdzić tożsamość jego właściciela. Bardziej dokładnie, jest to klucz publiczny powiązany (podpisem elektronicznym) z tożsamością osoby lub organizacji, czyli danymi takimi jak nazwa, adres, itp. Istotnym elementem certyfikatu jest zaświadczenie jego autentyczności, czyli jakiś rodzaj potwierdzenia, że dane na nim umieszczone są autentyczne. Ten rodzaj potwierdzenia jest realizowany przez podpis cyfrowy i kluczowe staje się, kto podpisuje. Najczęściej spotykane są dwa rozwiązania tej materii:
Zwykle certyfikaty są podpisane przez kogoś innego: CA w przypadku schematu PKI oraz innego użytkownika w przypadku WOT. Zdarza się jednak, że certyfikat jest samopodpisany (self-signed certificate) i ma to miejsce zarówno w WOT, jak i w PKI (główny urząd certyfikacji, np. VeriSign nie ma nadrzędnego CA, więc musi posiadać certyfikat typu self-signed). Także do potrzeb testowych też często generuje się tego typu certyfikaty z uwagi na łatwość ich generowania. Ważnym do odnotowania jest, że certyfikatów samopodpisanych nie można odwołać (unieważnić), natomiast certyfikaty wydane przez CA mogą być odwoływane. To istotny brak z punktu widzenia bezpieczeństwa infrastruktury opartej o certyfikaty.
Czasami zdarza, że certyfikat zostanie skompromitowany (np. przez upublicznienie klucza prywatnego), użytkownik, który go posiada, nie powinien dłużej mieć dostępu do pewnych zasobów, do których dostęp jest sterowany przez PKI, lub wydarzy się jeszcze coś innego, co powoduje, że certyfikat przestaje być zaufany. Wtedy z pomocą przychodzi nam dwa mechanizmy:
Jak zostało napisane na począku, certyfikat to klucz publiczny powiązany z danymi jego właściela. Jakie dokładnie są to dane jest określone przez odpowiednie standardy. Najczęściej obecnie używane są certyfikatu w standardzie X.509. to standard z szerszej rodziny standardów X.500, które opisują usługi katalogowe (np. LDAP bazuje na X.500). Poza samym formatem certyfikatu opisuje on także urząd certyfikacji, listy CRL, a także szereg innych powiązanych elementów. Certyfikat X.509 zawiera następujące składowe: (za wikipedią)
Dodatkowo firma VeriSign wprowadziła klasy certyfikatów na podstawie celu, do którego mają służyć: (za wikipedią)
Certyfikat może być zapisywany w kilku formatach:
W kontekście certyfikatów nie sposób nie wspomnieć o grupie standardów PKCS. Opisuje ona szereg zadań związanych z ceryfikatami, kilka przykładowych:
Na koniec naszego krótkiego wprowadzenia w świat certyfikatów warto wspomnieć, że większość różnych formatów bazuje na notacji ASN.1.
OpenSSL
Do tworzenia i zadządzania certfykatami będziemy używać darmowego programu openssl. Szereg możliwości tego oprogramowania jest znacznie większy, niż samo zarządzanie certyfikatami:
OpenSSL działa w dwóch trybach:
Nas przede wszystkim openssl interesuje w punktu widzenia certyfikatów i te zadania openssl-a będzie głównie omawiać. W pierwszej kolejności utworzymy własne CA.
Zakładamy, że openssl jest już zainstalowany (zwykle z każdą dystrybucją dostarczany jest odpowiedni pakiet, tak też jest w przypadku SuSE Linux). Plikiem konfiguracyjnym jest plik
/etc/ssl/openssl.cnfJest w nim mnóstwo różnych ustawień, jednak nas będzie interesować tylko minimum do uruchomienia własnego CA. Znajdujemy zatem sekcję [ ca ], w której znajduje się wpis
default_ca = CA_defaultOkreśla on sekcję, w której będzie opisane nasze CA. Znajdujemy tą sekcję i widzimy, że konfiguracja jest już w zasadzie przygotowana (są także komentarze co która zmienna opisuje):
[ CA_default ] dir = ./demoCA certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/crl.pem private_key = $dir/private/cakey.pem RANDFILE = $dir/private/.randTo co warto zmienić, to katalog gdzie wszystko jest przechowywane, np.:
dir = /etc/ssl/CANastępnie tworzymy strukturę katalogów i pamiętamy, że pliki index.txt i serial muszą istnieć, dodatkowo serial musi zawierać dwucyfrowy kolejny numer wygenerowanego certyfikatu, czyli wydajemy polecenia:
# touch /etc/ssl/CA/index.txt # echo 00 > /etc/ssl/CA/serialKolejnym etapem jest wygenerowanie klucza prywatnego CA (przechodzimy najpierw do katalogu /etc/ssl/CA/)
# openssl genrsa -des3 -out private/cakey.pema kolejnym certyfikatu
# openssl req -new -x509 -days 365 -key private/cakey.pem -out cacert.pem
Warto odnotować, że jeśli zamiast -days 365 wpiszemy -days 7300 to mamy spokój z certyfikatem (jego ważnością) na 20 lat. Po wydaniu powyższego polecenia podajemy hasło do klucza prywatnego oraz dane o CA:
Country Name (2 letter code) [AU]:PL State or Province Name (full name) [Some-State]:Dolnośląskie Locality Name (eg, city) []:Wrocław Organization Name (eg, company) [Internet Widgits Pty Ltd]:Kogucik sp. z o.o. Organizational Unit Name (eg, section) []: Górna Grzęda Common Name (eg, YOUR name) []:firmakogucik.com.pl Email Address []:
Tworzenie centrum autoryzacji (CA) mamy zakończone.
No koniec możemy sobie obejrzeć nasz certyfikat wydając polecenie:
# openssl x509 -in cacert.pem -text -noout
Na koniec krótki komentarz. Najkrótsze polecenie, które wygeneruje nam certyfikat dla CA jest następujące:
# openssl req -new -x509 -out cacert.pem
przy czym (1) klucz prywatny będzie zapisany w pliku privkey.pem oraz (2) certyfikat będzie ważny miesiąc (co zwykle jest trochę za krótko). Ale powyższe na pewno łatwiej zapamiętać.
W tym miejscu należy zwrócić uwagę na pewien szczegół. Otóż polecenie generowania certyfikatu utworzyło certyfikat samopodpisany. Dalej pokażemy kroki, jak wygenerować certyfikat podpisany przez nasze nowo utworzone CA.
# openssl genrsa -des3 -out private/clientkey.pem 1024
# openssl req -new -key private/clientkey.pem -out clientreq.pem
Jesteśmy pytani o hasło do klucza prywatnego oraz o informacje, które będą potem zawarte w certyfikacie:
Country Name (2 letter code) [AU]:PL State or Province Name (full name) [Some-State]:Dolnośląskie Locality Name (eg, city) []:Wrocław Organization Name (eg, company) [Internet Widgits Pty Ltd]:Kogucik sp. z o.o. Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:firmakogucik.com.pl Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
W tym miejscu możem nasze żądanie obejrzeć poleceniem:
# openssl req -in clientreq.pem -text -noout
# openssl ca -notext -in clientreq.pem -out clientcert.pem
Uwaga: podczas tworzenia certyfikatu będziemy proszeni o hasło do klucza prywatnego CA.
# openssl rsa -in private/clientkey.pem -out private/clientkey.pem.passless
Kilka innych zastosowań openssl-a, niekoniecznie związanych z PKI:
# openssl dgst -sha256 plik.txt # openssl dgst -sha512 -out skrot.txt -hex -c plik.txt
# openssl enc -des3 -in plik.txt -out zaszyfrowane.bin
# openssl genrsa -out key.pem -des3 1024 # openssl rsautl -encrypt -inkey key.pem -in plik.txt -out zaszyfrowane.binDokładniej: wygenerowanie klucza do szyfrowania, a następnie zaszyfrowanie za jego pomocą asymetrycznie plik.txt.
Na koniec kwestia wygody związanej przy przekazywaniu haseł. Domyślnie, polecenie openssl pyta zawsze o hasło w sposób interaktywny. Z pewnością jest to bezpieczne, ale bardzo niewygodne przy generowaniu, np. 100 kluczy. Żeby sobie ułatwić życie mamy do dyspozycji dwie opcje:
Dodatkowo podajemy parametr określający jak hasło będzie przekazane:
Kilka przykładów:
# openssl genrsa –out key.pem –passout stdin –des3 1024 < pass.txt # openssl genrsa –out key.pem –passout pass:xyz –des3 1024 # openssl rsa –in key.pem –passin env:SSL_PASS –pubout # openssl rsa –in key.pem –passin file:pass.txt –pubout