[3] Testowanie OpenSSL

30 stycznia 2023 Wyłączono przez Adam [zicherka] Nogły

Generowanie żą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