[3] Testowanie OpenSSL
30 stycznia 2023Generowanie żądania certyfikatu
W tym przypadku wygenerujemy certyfikat, który musi podpisać jedna z firm zajmujących się podpisem. Jest to w 99,9% czynność płatna. Przygotujemy zatem stosowne żądanie i już we własnym zakresie musimy wystąpić do Urzędu certyfikacji o podpis wygenerowanego certyfikatu.
Żądanie certyfikatu to plik, który jest potrzebny Urzędowi Certyfikacji wystawienia/podpisania certyfikatu SSL. Wykorzystamy narzędzie CA.pl, który jest częścią instalacji OpenSSL, a wygenerujemy certyfikat serwera (w podobny sposób tworzy się certyfikaty dla osób). Jako katalog roboczy wykorzystamy [/usr/local/openssl/certs].
root@vfbsd01:~ # cd /usr/local/openssl/ root@vfbsd01:/usr/local/openssl # cp misc/CA.pl certs
Uruchamiamy skrypt w celu wygenerowania certyfikatu:
root@vfbsd01:/usr/local/openssl # cd /usr/local/openssl/certs/ root@vfbsd01:/usr/local/openssl/certs # setenv OPENSSL /usr/local/bin/openssl root@vfbsd01:/usr/local/openssl/certs # ./CA.pl –newreq Use of uninitialized value $1 in concatenation (.) or string at ./CA.pl line 133. ==== /usr/local/bin/openssl req -new -keyout newkey.pem -out newreq.pem -days 365 Ignoring -days; not generating a certificate Generating a RSA private key .......+++++ .......+++++ writing new private key to 'newkey.pem' Enter PEM pass phrase: # wpisz hasło Verifying - Enter PEM pass phrase: # potwierdź hasło ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:PL # wpisz kraj State or Province Name (full name) [Some-State]:Katowice # miasto Locality Name (eg, city) []:Rybnik # powiat Organization Name (eg, company) [Internet Widgits Pty Ltd]:zicher.LAB # nazwa firmy/organizacji Organizational Unit Name (eg, section) []: # [Enter] Common Name (e.g. server FQDN or YOUR name) []:vfbsd01.zicher.lab # nazwa DNS serwera dla którego wystawia się żądanie certyfikatu # można użyć symboli wieloznacznych; # przykładowo *.zicher.lab jest poprawnym certyfikatem dla wszystkich poddomen w domenie zicher.lab (poczta.zicher.lab, ftp.zicher.lab); # jednak nie jest poprawny dla samej domeny zicher.lab Email Address []:root@zicher.lab # podaj adres email Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # [Enter] An optional company name []: # [Enter] ==> 0 ==== Request is in newreq.pem, private key is in newkey.pem
Został wygenerowany plik zawierający zaszyfrowany klucz prywatny serwera. Ułatwimy sobie zadanie i zmienimy na łatwą do użycia nazwę [vfbsd01.zicher.lab-encrypted-key.pem].
root@vfbsd01:/usr/local/openssl/certs # cp newkey.pem vfbsd01.zicher.lab-encrypted-key.pem
Wygenerowany został także plik [newreq.pem]. który to właśnie zawiera żądanie certyfikatu – on też właśnie powinien zostać przekazany Urzędowi certyfikacji. Aby zachować konwencję nazewniczą, jego nazwę również zmienimy:
root@vfbsd01:/usr/local/openssl/certs # cp newreq.pem vfbsd01.zicher.lab-req.pem
Plik [vfbsd01.zicher.lab-encrypted-key.pem] jest zaszyfrowany podanym wcześniej hasłem, które będzie potrzebne przy każdym odczycie klucza prywatnego przez aplikacje SSL. Jeśli takie operacje będą wykonywane na serwerze i dodatkowo mają odbywać się w pełni automatycznie, musimy odszyfrować ów plik – czyli usunąć z niego hasło, oraz ograniczyć prawa dostępu do tego pliku.
root@vfbsd01:/usr/local/openssl/certs # openssl rsa -in vfbsd01.zicher.lab-encrypted-key.pem -out vfbsd01.zicher.lab-unencrypted-key.pem Enter pass phrase for vfbsd01.zicher.lab-encrypted-key.pem: # wpisz hasło writing RSA key root@vfbsd01:/usr/local/openssl/certs # chmod 400 vfbsd01.zicher.lab-unencrypted-key.pem
Po otrzymaniu podpisu od Urzędu Certyfikacji skopiuj nowy certyfikat do katalogu [/usr/local/openssl/cert]. Zmień jego nazwę na [vfbsd01.zicher.lab-cert.pem]. Niektóre aplikacje wymagają do poprawqnego działania certyfikatu Urzędu Certyfikacji, który zazwyczaj jest ogólnie dostępny w Urzędzie Certyfikacji (przeważnie na stronie do pobrania). Skopiuj go do katalogu [/usr/local/openssl/cert] i nadaj mu nazwę [zicher.lab-CAcert.pem].
Certyfikat z autopodpisem
Gdy nasza firma lub my sami nie potrzebujemy certyfikatu podpisanego przez Urząd Certyfikacji, możemy wystawić sobie sami certyfikat i podpisać go sobie sami. Nie jest on akceptowany przez większość przeglądarek i innego oprogramowania, dopóty, dopóki nie zostanie zainstalowany w komputerze.
Katalog roboczy ustawimy na[/usr/local/openssl/certs]. Długość ważności certyfikatu zmienimy z 365 dni na 1095 (3 lata).
root@vfbsd01:~ # cd /usr/local/openssl/ root@vfbsd01:/usr/local/openssl # cp misc/CA.pl certs root@vfbsd01:/usr/local/openssl # sed -I .old 's/365/1095/' openssl.cnf
Uruchamiamy skrypt CA.pl:
root@vfbsd01:/usr/local/openssl # cd /usr/local/openssl/certs root@vfbsd01:/usr/local/openssl/certs # setenv OPENSSL /usr/local/bin/openssl root@vfbsd01:/usr/local/openssl/certs # ./CA.pl -newca CA certificate filename (or enter to create) # [Enter] Making CA certificate ... ==== /usr/local/bin/openssl req -new -keyout ./demoCA/private/cakey.pem -out ./demoCA/careq.pem Generating a RSA private key .......................................................................................................+++++ ............................................................+++++ writing new private key to './demoCA/private/cakey.pem' Enter PEM pass phrase: # wpisz hasło Verifying - Enter PEM pass phrase: # powtórnie wpisz hasło # te hasło należy zapamiętać, bo będzie jeszcze wykorzystywane ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:PL # wpisz kraj State or Province Name (full name) [Some-State]:Katowice # wpisz miasto Locality Name (eg, city) []:Rybnik # wpisz powiat Organization Name (eg, company) [Internet Widgits Pty Ltd]:zicher.LAB # wpisz nazwę firmy/organizacji Organizational Unit Name (eg, section) []: # [Enter] Common Name (e.g. server FQDN or YOUR name) []:vfbsd01.zicher.lab # wpisz pełną nazwę DNS serwera, dla którego wystawiasz certyfikat Email Address []:root@zicher.lab # wpisz adres email Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # [Enter] An optional company name []: # [Enter] ==> 0 ==== ==== /usr/local/bin/openssl ca -create_serial -out ./demoCA/cacert.pem -days 1095 -batch -keyfile ./demoCA/private/cakey.pem -selfsign -extensions v3_ca -infiles ./demoCA/careq.pem Using configuration from /usr/local/openssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: # wpisz hasło PEM, które dwukrotnie wpisywałeś na początku tego skryptu Check that the request matches the signature Signature ok Certificate Details: Serial Number: 5a:98:01:48:5a:6d:62:6f:87:9f:2f:2c:d9:f4:ad:e1:af:e8:89:c3 Validity Not Before: Oct 16 16:51:01 2022 GMT Not After : Oct 15 16:51:01 2025 GMT Subject: countryName = PL stateOrProvinceName = Katowice organizationName = zicher.LAB commonName = vfbsd01.zicher.lab emailAddress = root@zicher.lab X509v3 extensions: X509v3 Subject Key Identifier: 2E:38:8E:69:DE:0D:CD:2D:64:20:9B:83:FD:EA:08:D4:3C:71:82:17 X509v3 Authority Key Identifier: keyid:2E:38:8E:69:DE:0D:CD:2D:64:20:9B:83:FD:EA:08:D4:3C:71:82:17 X509v3 Basic Constraints: critical CA:TRUE Certificate is to be certified until Oct 15 16:51:01 2025 GMT (1095 days) Write out database with 1 new entries Data Base Updated ==> 0 ==== CA certificate is in ./demoCA/cacert.pem
Wygenerujemy teraz nowe żądanie certyfikatu:
root@vfbsd01:/usr/local/openssl/certs # ./CA.pl -newreq Use of uninitialized value $1 in concatenation (.) or string at ./CA.pl line 133. ==== /usr/local/bin/openssl req -new -keyout newkey.pem -out newreq.pem -days 365 Ignoring -days; not generating a certificate Generating a RSA private key .......................+++++ ....................................................................................+++++ writing new private key to 'newkey.pem' Enter PEM pass phrase: # wpisz hasło Verifying - Enter PEM pass phrase: # powtórnie wpisz hasło ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:PL # wpisz kraj State or Province Name (full name) [Some-State]:Katowice # wpisz miasto Locality Name (eg, city) []:Rybnik # wpisz powiat Organization Name (eg, company) [Internet Widgits Pty Ltd]:zicher.LAB # wpisz nazwę firmy Organizational Unit Name (eg, section) []: # [Enter] Common Name (e.g. server FQDN or YOUR name) []:vfbsd01.zicher.lab # wpisz FQDN ser-wera, dla którego wystawiasz certyfikat Email Address []:root@zicher.lab # wpisz adres email Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # [Enter] An optional company name []: # [Enter] ==> 0 ==== Request is in newreq.pem, private key is in newkey.pem
Wykorzystamy teraz stworzone poprzednio żądanie i Urząd Certyfikacji do utworzenia podpisanego certyfikatu.
root@vfbsd01:/usr/local/openssl/certs # ./CA.pl -sign ==== /usr/local/bin/openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem Using configuration from /usr/local/openssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: # wpisz ustawione uprzednio hasło PEM Check that the request matches the signature Signature ok Certificate Details: Serial Number: 5a:98:01:48:5a:6d:62:6f:87:9f:2f:2c:d9:f4:ad:e1:af:e8:89:c4 Validity Not Before: Oct 16 17:10:04 2022 GMT Not After : Oct 15 17:10:04 2025 GMT Subject: countryName = PL stateOrProvinceName = Katowice localityName = Rybnik organizationName = zicher.LAB commonName = vfbsd01.zicher.lab emailAddress = root@zicher.lab X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 7B:34:4C:6E:67:FC:A7:F0:A3:82:72:89:B0:06:F8:AE:7A:B6:9F:69 X509v3 Authority Key Identifier: keyid:2E:38:8E:69:DE:0D:CD:2D:64:20:9B:83:FD:EA:08:D4:3C:71:82:17 Certificate is to be certified until Oct 15 17:10:04 2025 GMT (1095 days) Sign the certificate? [y/n]:y # wpisz y 1 out of 1 certificate requests certified, commit? [y/n]:y # wpisz y Write out database with 1 new entries Data Base Updated ==> 0 ==== Signed certificate is in newcert.pem
Nowy, podpisany certyfikat został zapisany w bieżącym katalogu w pliku o nazwie [newcert.pem]. Klucz prywatny jest w bieżącym katalogu w pliku o nazwie [newkey.pem]. Certyfikat i klucz Urzędu Certyfikacji zostały zapisane w podkatalogu [demoCA], a ich nazwy to odpowiednio [cacert.pem] i [cekay.pem]. Zmienimy teraz ich nazwy, aby utrzymać konwencję nazewniczą oraz ułatwić sobie pracę z nimi. Zastosujemy konwencję [nazwa-typ.pem]. i skopiujemy je wszystkie do katalogu [/usr/local/openssl/certs].
root@vfbsd01:/usr/local/openssl/certs # cp newcert.pem vfbsd01.zicher.lab-cert.pem root@vfbsd01:/usr/local/openssl/certs # cp newkey.pem vfbsd01.zicher.lab-encrypted-key.pem root@vfbsd01:/usr/local/openssl/certs # cp demoCA/cacert.pem ./zicher.lab-CAcert.pem root@vfbsd01:/usr/local/openssl/certs # cp demoCA/private/cakey.pem ./zicher.lab-encrypted-CAkey.pem
W ostatnich dwóch plikach nie ma nazwy stacji (vfbsd01), ponieważ pliki Urzędu Certyfikacji nie są przypisane do pojedynczego komputera. Urząd Certyfikacji ma charakter jednostki nadrzędnej.
Dodatkowo, niektóre aplikacje/programy, żądają, aby plik klucza miał rozszerzenie *.key – dlatego też utworzymy plik z takim rozszerzeniem:
root@vfbsd01:/usr/local/openssl/certs # cp vfbsd01.zicher.lab-unencrypted-key.pem vfbsd01.zicher.lab-unencrypted-key.key
Plik certyfikatu [vfbsd01.zicher.lab-encrypted-key.pem] jest zaszyfrowany podanym wcześniej hasłem, które będzie potrzebne przy każdym odczycie klucza prywatnego przez aplikacje SSL. Jeśli takie operacje będą wykonywane na serwerze i dodatkowo mają odbywać się w pełni automatycznie, musimy odszyfrować ów plik – czyli usunąć z niego hasło, oraz ograniczyć prawa dostępu do tego pliku.
root@vfbsd01:/usr/local/openssl/certs # openssl rsa -in vfbsd01.zicher.lab-encrypted-key.pem -out vfbsd01.zicher.lab-unencrypted-key.pem Enter pass phrase for vfbsd01.zicher.lab-encrypted-key.pem: # wpisz hasło PEM writing RSA key root@vfbsd01:/usr/local/openssl/certs # chmod 400 vfbsd01.zicher.lab-unencrypted-key.pem
Utworzony certyfikat Urzędu Certyfikacji, czyli Certyfikat Główny, powinien zostać wyeksportowany do wszystkich klientów, którzy muszą ufać certyfikatom wystawionym przez ten Urząd Certyfikacji. Jest to konieczne, aby klienty mogły „ufać” temu Urzędowi Certyfikacji, oraz certyfikatom przez niego podpisanym.
Klienty Windows i MacOS
Większość klientów – czyli przeważnie systemy Windows oraz MacOS potrafi odczytać pliki certyfikatów SSL w formacie binarnym DER (Distinguished Encoding Rules). Jest to także typowy format dla platformy Java. Może być zapisany jako plik *.cer oraz *.der. Dlatego też musimy przekształcić plik tekstowy jakim są certyfikaty PEM (Privacy Enhanced Mail) na format DER.
root@vfbsd01:/usr/local/openssl/certs # openssl x509 -in zicher.lab-CAcert.pem -inform PEM -out zicher.lab-CAcert.cer -outform DER