OpenSSL — generowanie certyfikatów, kluczy i konwersja formatów
Opublikowano: 10 kwietnia 2026 · Kategoria: Bezpieczeństwo
OpenSSL to szwajcarski scyzoryk świata kryptografii — biblioteka i narzędzie CLI używane do generowania kluczy prywatnych, tworzenia CSR (Certificate Signing Request), wystawiania certyfikatów self-signed, weryfikacji łańcucha CA i konwersji między formatami (PEM, DER, PFX). Każdy administrator Linuksa prędzej czy później musi z niego skorzystać: przy konfiguracji SSL dla własnego serwera, budowaniu wewnętrznej PKI, debugowaniu problemów z certyfikatami lub przygotowaniu certyfikatu dla aplikacji Java. Ten artykuł przeprowadzi przez wszystkie najważniejsze operacje z komentarzem wyjaśniającym co i dlaczego.
Generowanie kluczy prywatnych — RSA i ECDSA
# --- KLUCZE RSA --- # RSA 2048-bit (minimum, nadal bezpieczny i kompatybilny ze starszymi systemami) openssl genrsa -out private.key 2048 # RSA 4096-bit (wolniejszy TLS handshake, ale wieksze bezpieczenstwo) openssl genrsa -out private.key 4096 # RSA z szyfrowaniem klucza haslem (wymaga podania hasla przy kazdym uzyciu) openssl genrsa -aes256 -out private-encrypted.key 4096 # Sprawdz klucz openssl rsa -in private.key -text -noout # Wyodrebnij klucz publiczny z prywatnego openssl rsa -in private.key -pubout -out public.key # --- KLUCZE ECDSA (szybsze, krotsze, nowoczesne) --- # Krzywa P-256 (prime256v1) — najlepsze wsparcie przegladarek, OK dla TLS openssl ecparam -name prime256v1 -genkey -noout -out ec-private.key # Krzywa P-384 (secp384r1) — wyzsze bezpieczenstwo, uzywane przez rzady i finanse openssl ecparam -name secp384r1 -genkey -noout -out ec-private-384.key # Krzywa X25519 (dla TLS 1.3 key exchange, nie do certyfikatow) # X25519 jest uzywana do ECDHE, nie jako klucz certyfikatu # Sprawdz klucz ECDSA openssl ec -in ec-private.key -text -noout # Lista dostepnych krzywych openssl ecparam -list_curves
Tworzenie CSR — Certificate Signing Request
# CSR dla certyfikatu RSA — interaktywnie (pyta o CN, O, C itd.) openssl req -new -key private.key -out request.csr # CSR bez pytania — z parametrami w linii komend openssl req -new -key private.key -out request.csr \ -subj "/C=PL/ST=Mazowieckie/L=Warszawa/O=Moja Firma Sp z.o.o/CN=example.com" # CSR z SAN (Subject Alternative Names) — wymagany przez nowoczesne CA (Chrome 58+) # Stworz plik konfiguracyjny: cat > san.cnf << 'EOF' [req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C = PL ST = Mazowieckie L = Warszawa O = Moja Firma CN = example.com [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = api.example.com EOF openssl req -new -key private.key -out request.csr -config san.cnf # Sprawdz zawartosc CSR openssl req -in request.csr -text -noout openssl req -in request.csr -verify -noout
Certyfikat self-signed — do testów i sieci wewnętrznej
# Self-signed na 1 rok (szybko, klucz + cert w jednym kroku) openssl req -x509 -newkey rsa:2048 -keyout self.key -out self.crt \ -days 365 -nodes \ -subj "/C=PL/O=Dev/CN=localhost" # Self-signed z SAN (wymaga pliku konfiguracyjnego) openssl req -x509 -newkey rsa:4096 -keyout self.key -out self.crt \ -days 730 -nodes \ -config san.cnf \ -extensions v3_req # Self-signed ECDSA (szybszy, nowszy) openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \ -keyout ec-self.key -out ec-self.crt \ -days 365 -nodes \ -subj "/C=PL/O=Dev/CN=localhost" # Sprawdz certyfikat openssl x509 -in self.crt -text -noout openssl x509 -in self.crt -noout -subject -issuer -dates # Weryfikacja pary klucz-certyfikat (musza byc zgodne) # Jesli MD5 hash sie zgadza — klucz pasuje do certyfikatu openssl x509 -noout -modulus -in cert.pem | md5sum openssl rsa -noout -modulus -in private.key | md5sum
Weryfikacja łańcucha certyfikatów
# Sprawdz certyfikat zdalnego serwera echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -text # Sprawdz tylko daty waznosci echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 -noout -dates # Sprawdz czy certyfikat wygasa za mniej niz 30 dni (exit code 1 = wygasa) echo | openssl s_client -connect example.com:443 2>/dev/null \ | openssl x509 -noout -checkend 2592000 # checkend N = liczba sekund od teraz (2592000 = 30 dni) # Weryfikacja lancucha CA (potrzebny plik ca-bundle) openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt cert.pem # Weryfikacja z lokalnym CA (dla wewnetrznych certyfikatow) openssl verify -CAfile my-ca.crt server.crt # Sprawdz kompletny lancuch (chain) certyfikatow serwera openssl s_client -connect example.com:443 -showcerts 2>/dev/null | \ openssl x509 -noout -issuer -subject # Pobierz certyfikat serwera do pliku echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \ | openssl x509 > server.pem
Konwersja formatów — PEM, DER, PFX/PKCS12
| Format | Rozszerzenia | Używany przez |
|---|---|---|
| PEM | .pem, .crt, .cer, .key | Linux, Apache, Nginx, Let's Encrypt |
| DER | .der, .cer | Java, Android, stary Internet Explorer |
| PFX / PKCS12 | .pfx, .p12 | Windows IIS, .NET, Tomcat, eksport |
| PKCS7 / P7B | .p7b, .p7c | Windows, Java — tylko certyfikaty (bez klucza) |
# --- Konwersja PEM ↔ DER --- # PEM → DER (dla Javy, Android) openssl x509 -in cert.pem -outform DER -out cert.der # DER → PEM openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem # Klucz PEM → DER openssl rsa -in private.key -outform DER -out private.der # --- Tworzenie PFX/PKCS12 (cert + klucz + chain) --- # Pakuj do PFX (dla Windows IIS, .NET) openssl pkcs12 -export \ -in cert.pem \ -inkey private.key \ -certfile chain.pem \ -out bundle.pfx \ -name "Moj serwer" \ -password pass:mypassword # Rozpakowywanie PFX → PEM openssl pkcs12 -in bundle.pfx -nokeys -out cert.pem -password pass:mypassword openssl pkcs12 -in bundle.pfx -nocerts -nodes -out private.key -password pass:mypassword # Wszystko z PFX naraz (bez szyfrowania klucza) openssl pkcs12 -in bundle.pfx -nodes -out bundle-all.pem -password pass:mypassword # --- Tworzenie fullchain dla Nginx (certyfikat + intermediate CA) --- cat cert.pem intermediate-ca.pem > fullchain.pem # Kolejnosc jest wazna: najpierw certyfikat servera, potem CA chain