OpenSSL to wieloplatformowa, otwarta implementacja protokołów SSL/TLS z bogatym zestawem narzędzi kryptograficznych, stanowiąca fundament bezpiecznej komunikacji w Internecie. Biblioteka na licencji zbliżonej do Apache umożliwia szyfrowanie, generowanie i zarządzanie kluczami, tworzenie oraz weryfikację certyfikatów cyfrowych. Jest powszechnie wykorzystywana w serwerach WWW, systemach operacyjnych, aplikacjach mobilnych i infrastrukturze sieciowej.

Najczęstsze obszary zastosowań OpenSSL obejmują:

  • serwery HTTP(S) (np. Apache, Nginx) oraz serwery poczty,
  • systemy Linux, BSD, Windows i macOS (w tym integracje narzędziowe),
  • aplikacje mobilne i urządzenia IoT wymagające szyfrowanej komunikacji,
  • infrastrukturę sieciową (load balancery, reverse proxy, bramy VPN).

Historia i pochodzenie OpenSSL

Projekt powstał w 1998 roku jako następca biblioteki SSLeay autorstwa Erica A. Younga i Tima Hudsona. Od początku jego celem było dostarczenie darmowego, otwartego zestawu narzędzi do szyfrowania i protokołów SSL/TLS.

Najważniejsze wydarzenia rozwojowe można podsumować następująco:

  • SSLeay → OpenSSL – wygaszenie rozwoju SSLeay (1998) i przekazanie prac społeczności open source;
  • Kamienie milowe – kolejne wydania 0.9.6 (2000), 0.9.7 (2002), 0.9.8 (2005) i 1.0.0 (2010) rozwijały funkcje i łatały luki;
  • assl (2009) – fork Marco Peerebooma (OpenBSD) upraszczający interfejs zewnętrzny przy zachowaniu wewnętrznego API;
  • Heartbleed (2014) – krytyczna podatność skutkująca powstaniem rozgałęzień LibreSSL (OpenBSD) i BoringSSL (Google);
  • Zmiana wersjonowania – pominięcie 2.0 i przejście do OpenSSL 3.0 z przywróceniem trybu FIPS.

OpenSSL 3.0 przywrócił tryb FIPS i przeszedł walidację FIPS 140-2, jednak proces był opóźniony i złożony (OpenSSL FIPS Provider 3.0 trafił do listy IUT CMVP 20.10.2020).

Architektura i komponenty OpenSSL

OpenSSL składa się z trzech głównych komponentów:

  • libssl – implementuje protokoły TLS/DTLS (do TLSv1.3 i DTLSv1.2) oraz dba o bezpieczną komunikację;
  • libcrypto – ogólna biblioteka kryptograficzna (szyfrowanie symetryczne/asymetryczne, podpisy, skróty, RNG);
  • openssl (CLI) – „szwajcarski scyzoryk” do pracy w terminalu: generowanie kluczy, CSR, X.509/CRL, testy SSL/TLS/DTLS/QUIC.

Biblioteka wspiera także QUIC (RFC 9000) oraz dostarcza certyfikowany moduł FIPS dla organizacji o wymaganiach zgodności. Narzędzie openssl udostępnia pełen dostęp do funkcji bibliotek bezpośrednio z wiersza poleceń.

Protokoły SSL i TLS – fundament bezpiecznej komunikacji

SSL to starszy, dziś niezalecany protokół; jego następcą jest TLS, który zapewnia zgodność z nowymi standardami i wyższy poziom bezpieczeństwa. TLS wykorzystuje kryptografię klucza publicznego (PKI) do uwierzytelniania i dystrybucji kluczy dla szyfrowania symetrycznego.

W trakcie handshake’u serwer przedstawia certyfikat, a klient weryfikuje go względem zaufanego urzędu certyfikacji (CA). Następnie negocjowany jest klucz sesyjny do szyfrowania danych. Administratorzy mogą dostosować równowagę między kompatybilnością a bezpieczeństwem (wybór wersji/protokołów/szyfrów).

Operacje kryptograficzne i zarządzanie kluczami

OpenSSL obsługuje generowanie kluczy, szyfrowanie/dszyfrowanie, podpisy cyfrowe oraz funkcje skrótu. Klucze mogą wykorzystywać m.in. RSA, DSA i ECC, zaś szyfrowanie symetryczne – algorytmy takie jak AES czy (historycznie) DES. Do weryfikacji integralności danych służą skróty SHA-256, SHA‑1 czy MD5 (niezalecany).

Wymiana danych między popularnymi formatami ułatwia interoperacyjność między systemami. Najczęściej spotykane to:

  • PEM – tekstowy, Base64, z nagłówkami/stopkami,
  • DER – binarny,
  • PKCS#8 – standardowy format klucza prywatnego,
  • PKCS#1 – format kluczy i podpisów specyficzny dla RSA.

Cyfrowe podpisy potwierdzają autentyczność i integralność danych, a PKI rozwiązuje problem bezpiecznej dystrybucji kluczy.

Certyfikaty SSL/TLS i żądania certyfikacyjne

Proces zwykle zaczyna się od wygenerowania pary kluczy oraz CSR (Certificate Signing Request). Certyfikaty zawierają klucz publiczny, dane podmiotu (np. domena), okres ważności i podpis CA. Do CSR wpisuje się następujące pola:

  • Country Name (C) – dwuliterowy kod kraju (np. PL);
  • State or Province Name (ST) – województwo lub stan;
  • Locality Name (L) – miejscowość;
  • Organization Name (O) – pełna nazwa organizacji (zgodna z dokumentami, np. KRS/REGON);
  • Organizational Unit Name (OU) – nazwa działu (opcjonalnie);
  • Common Name (CN) – nazwa domeny (dla wildcard: *.domena.tld);
  • Subject Alternative Name (SAN) – alternatywne nazwy (wiele domen/subdomen).

Wygenerowany CSR to plik tekstowy zawierający blok:

—–BEGIN CERTIFICATE REQUEST—–
… (Base64) …
—–END CERTIFICATE REQUEST—–

Nieobowiązkowe pola kreatora CSR mogą brzmieć:

A challenge password
An optional company name

CSR wysyła się do zaufanego CA (np. Let’s Encrypt, Symantec, Comodo). Po podpisaniu certyfikat instaluje się i weryfikuje (daty ważności, łańcuch, zgodność z kluczem, konwersje formatów).

Podstawowe polecenia OpenSSL dla generowania kluczy i certyfikatów

Generowanie klucza prywatnego RSA (2048 bitów): openssl genrsa -out mojadomena.key 2048. Z hasłem: openssl genrsa -des3 -out mojadomena.key 2048. Nowocześniej: openssl genpkey -algorithm RSA -out private.key.

Generowanie CSR na podstawie istniejącego klucza: openssl req -new -sha256 -key mojadomena.key -out mojadomena.csr. Wszystkie dane w jednym poleceniu: openssl req -new -newkey rsa:2048 -keyout PRIVATEKEY.key -out MYCSR.csr -subj "/C=US/ST=Illinois/L=Chicago/O=Faulty Consulting/OU=IT/CN=myserver.com".

Weryfikacja klucza: openssl rsa -in mojadomena.key -check. Weryfikacja CSR: openssl req -noout -text -in mojadomena.csr lub openssl req -noout -verify -in mojadomena.csr. Szczegóły certyfikatu: openssl x509 -noout -text -in mojadomena.pem. Daty ważności: openssl x509 -noout -dates -in mojadomena.pem.

Weryfikacja sum kontrolnych i zgodności kluczy

Aby potwierdzić zgodność klucza prywatnego, CSR i certyfikatu, porównuje się ich moduły (np. skrótem MD5/SHA):

Klucz: openssl rsa -noout -modulus -in mojadomena.key | openssl md5. CSR: openssl req -noout -modulus -in mojadomena.csr | openssl md5. Certyfikat: openssl x509 -noout -modulus -in mojadomena.pem | openssl md5. Współcześnie lepiej użyć SHA: openssl x509 -noout -modulus -in myserver.crt | openssl sha1, openssl rsa -noout -modulus -in myserver.pem | openssl sha1.

Weryfikacja łańcucha: openssl verify -untrusted intermediate.pem mojadomena.pem → poprawny wynik: mojadomena.pem: OK.

Diagnostyka i testowanie połączeń SSL/TLS

openssl s_client umożliwia szybkie sprawdzenie konfiguracji usług i certyfikatów: openssl s_client -connect example.org:443. Szybkie zamknięcie: echo | openssl s_client -connect example.org:443 2>/dev/null. Pełny łańcuch: openssl s_client -connect osadmins.com:443 -showcerts.

Najważniejsze elementy wyniku s_client to:

  • wersja protokołu (np. TLSv1.2, TLSv1.3),
  • negocjowany pakiet szyfrów (cipher suite),
  • łańcuch certyfikacji (issuer/subject, depth),
  • weryfikacja certyfikatu (Verify return code),
  • szczegóły certyfikatu serwera (serial, SAN, daty).

Wyodrębnienie certyfikatu i odczyt szczegółów: openssl s_client -connect osadmins.com:443 </dev/null | openssl x509 -noout -text. Tylko daty: echo | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -dates. SAN: echo | openssl s_client -connect example.org:443 2>/dev/null | openssl x509 -noout -ext subjectAltName.

Konwersja formatów certyfikatów i kluczy

PKCS#12 (.p12/.pfx) łączy klucz prywatny i łańcuch certyfikatów w jednym, szyfrowanym pliku. Eksport do IIS: openssl pkcs12 -export -inkey mojadomena.key -in mojadomena.pem -certfile intermediate.pem -out iis.pfx.

Wyodrębnienie z PKCS#12: certyfikat: openssl pkcs12 -in iis.pfx -clcerts -nokeys -out mojadomena.pem; klucz z hasłem: openssl pkcs12 -in iis.pfx -nocerts -out mojadomena.key; klucz bez hasła: openssl pkcs12 -in iis.pfx -nocerts -nodes -out mojadomena.key.

PEM ↔ DER: do DER: openssl rsa -inform PEM -in mojadomena.pem -outform DER -out mojadomena.der; do PEM: openssl rsa -inform DER -in mojadomena.der -outform PEM -out mojadomena.pem.

Szyfrowanie i deszyfrowanie danych

Szyfrowanie symetryczne hasłem (np. AES‑256‑CBC): openssl enc -aes-256-cbc -salt -in plik.txt -out plik.enc -k hasło. Deszyfrowanie: openssl enc -d -aes-256-cbc -in plik.enc -out plik.txt -k hasło.

Klucz z generatora liczb losowych: openssl rand -base64 32 > secret.key; szyfrowanie: openssl enc -aes-256-cbc -salt -in plain_text.txt -out encrypted_file.enc -pass file:secret.key; deszyfrowanie: openssl enc -d -aes-256-cbc -in encrypted_file.enc -out decrypted_file.txt -pass file:secret.key.

Kodowanie Base64: openssl base64 -in myfile.jpg -out myfile.jpg.b64; dekodowanie: openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg.

Podpisy cyfrowe i weryfikacja integralności

Podpis cyfrowy to podpis skrótu danych kluczem prywatnym; weryfikacja odbywa się kluczem publicznym. Podpisanie SHA‑256: openssl dgst -sha256 -sign privkey.pem -out sign.sha256 client.c; Base64 podpisu: openssl enc -base64 -in sign.sha256 -out sign.sha256.base64.

Klucz publiczny z certyfikatu: openssl x509 -pubkey -noout -in certificate.pem > publickey.pem. Weryfikacja: openssl dgst -sha256 -verify publickey.pem -signature sign.sha256 client.cVerified OK/Verification Failure. Możliwa weryfikacja bezpośrednio z certyfikatu: openssl dgst -sha256 -verify certificate.pem -signature plik.tar.gz.sha1 plik.tar.gz.

Obliczanie skrótów wiadomości i hashów

SHA‑256: openssl sha256 /path/to/file. SHA‑1: openssl sha1 /path/to/file. MD5: openssl md5 /path/to/file. Ogólne: openssl dgst -sha256 hashIn1.txt → np. SHA256(hashIn1.txt)= 9e83e0....

SHA‑256 generuje 256‑bitowy skrót i jest odporny na ataki „length extension”, zapewniając wysoki poziom bezpieczeństwa kryptograficznego.

Tworzenie i zarządzanie urzędem certyfikacji

Root CA – klucz prywatny: openssl genrsa -aes256 -out MyOrg-RootCA.key 4096. Certyfikat CA (samopodpisany): openssl req -x509 -new -nodes -key MyOrg-RootCA.key -sha256 -days 1826 -out MyOrg-RootCA.crt.

Instalacja certyfikatu CA w systemie klienta (Windows: Trusted Root, Linux: magazyn CA) umożliwia zaufanie certyfikatom wystawionym przez CA. CSR dla serwera: openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr; podpisanie przez CA: openssl x509 -req -in server.csr -CA MyOrg-RootCA.crt -CAkey MyOrg-RootCA.key -CAcreateserial -out server.crt -days 730 -sha256.

Bezpieczeństwo komunikacji – weryfikacja magazynu zaufanych CA

Klient uznaje połączenie za bezpieczne, jeśli certyfikat serwera łańcuchuje się do zaufanego CA w lokalnym magazynie. Typowe lokalizacje w Debian/Ubuntu:

  • /etc/ssl/certs/ – katalog z zaufanymi certyfikatami,
  • /etc/ssl/certs/ca-certificates.crt – skonsolidowany plik CA,
  • /usr/share/ca-certificates/ – dodatkowe certyfikaty.

Wskazanie własnego pliku CA: openssl s_client -connect osadmins.com:443 -CAfile /path/to/cacert.pem → poprawna weryfikacja: Verify return code: 0 (ok).

Zaawansowane operacje – kryptografia eliptyczna

ECC (ECDH/ECDSA) zapewnia bezpieczeństwo porównywalne z RSA przy mniejszych kluczach i wyższej wydajności. Parametry krzywej P‑256: openssl genpkey -genparam -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out ECPARAM.pem. Klucz i CSR: openssl req -newkey ec:ECPARAM.pem -keyout PRIVATEKEY.key -out MYCSR.csr. Jednowierszowo: openssl req -newkey ec:<(openssl genpkey -genparam -algorithm ec -pkeyopt ec_paramgen_curve:P-256) -keyout PRIVATEKEY.key -out MYCSR.csr. Dostępne krzywe: openssl ecparam -list_curves. Podpis ECDSA: openssl dgst -sha256 -sign ec_privkey.pem -out signature.bin hash.bin; weryfikacja: openssl pkeyutl -verify -inkey public.pem -pubin -in hash.bin -sigfile signature.bin.

Luki bezpieczeństwa i historia podatności

Heartbleed (CVE‑2014‑0160) pozwalał na odczyt fragmentów pamięci procesów używających wadliwej implementacji rozszerzenia Heartbeat w OpenSSL (marzec 2012 – kwiecień 2014). Problem został niezależnie odkryty przez Google Security i Codenomicon; dotyczył nawet dużych usług (np. AWS ELB/CloudFront) i wymagał natychmiastowych aktualizacji oraz wymiany certyfikatów.

W 2014 roku naprawiono też m.in. CVE‑2014‑0224, podatność umożliwiającą ataki MITM i deszyfrację ruchu. Incydenty te podkreśliły wagę regularnych audytów i szybkiego wdrażania poprawek bezpieczeństwa.

Instalowanie OpenSSL na różnych platformach

Poniższa tabela zbiera podstawowe sposoby instalacji:

Platforma Menedżer/tryb Polecenie
Debian/Ubuntu APT sudo apt-get install openssl
Red Hat/Fedora/CentOS YUM sudo yum install openssl
Gentoo Portage sudo emerge openssl
macOS Homebrew brew install openssl

Na macOS systemowo wykorzystywany jest często LibreSSL. Na Windows można użyć WSL (Podsystem Linux), Cygwin lub gotowych binariów. Instalator Cygwin jest dostępny pod adresem: https://cygwin.com/install.html (w czasie instalacji wybierz pakiet openssl). Sprawdzenie wersji: openssl version (np. OpenSSL 1.1.1 ... lub LibreSSL 2.6.5).

Praktyczne zastosowania w sieciach VPN i e-commerce

OpenVPN opiera się na OpenSSL dla szyfrowania, uwierzytelniania i obsługi certyfikatów, zapewniając poufność, integralność i ochronę przed atakami (np. DoS). Dzięki temu jest doskonałym wyborem do budowy bezpiecznych sieci VPN.

W e‑commerce OpenSSL zabezpiecza dane klientów (karty płatnicze, dane osobowe) w transmisji przeglądarka–serwer. Bankowość elektroniczna, systemy płatności i serwery pocztowe (np. Postfix, Dovecot) wykorzystują OpenSSL do szyfrowania protokołów SMTP/POP3/IMAP oraz zapewnienia integralności i uwierzytelnienia.