Laptopy i komputery - porównaj na Ceneo

Tworzenie lokalnego PKI opartego na wirtualnych serwerach

  08 grudzień 2025
Oceń ten artykuł
(0 głosów)

Wstępna konfiguracja serwerów:

  • 192.168.0.205 – Root CA
  • 192.168.0.206 – Intermediate CA
  • 192.168.0.101 – Apache (serwer docelowy)

 ROOT CA (192.168.0.205)

Wszystko robione na świeżo zainstalowanym Ubuntu Server 24.04

Przechodzimy na roota

sudo su

Doinstalowane zostały tylko programy nano oraz file

apt install file

apt install nano

Aby zapisać zmiany klikamy kombinację klawiczy CTRL+O i potwierdzamy ENTERem

Aby wyjść z programu CTRL+X.

 

 

 

Tworzymy strukturę katalogów:

mkdir -p /root/rootCA/{certs,crl,newcerts,private}
chmod 700 /root/rootCA/private
touch /root/rootCA/index.txt
echo 1000 > /root/rootCA/serial

Tworzymy plik openssl.cnf

Używamy do tego nano

nano /root/rootCA/openssl.cnf

i wklejamy do niego:

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = /root/rootCA
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/private/ca.key.pem
certificate = $dir/certs/ca.cert.pem

default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 7300
preserve = no
policy = policy_strict

[ policy_strict ]
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied

[ req ]
default_bits = 4096
default_md = sha256
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no

[ req_distinguished_name ]
C = PL
ST = Kujawsko-Pomorskie
L = Inowroclaw
O = Home LAN
OU = Root CA
CN = Home LAN Root CA

[ v3_ca ]
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

 

[ v3_intermediate_ca ]
# standardowe rozszerzenia dla Intermediate CA (używane przez Root podczas podpisywania)
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

# Authority Info Access — poprawna składnia: <method>;<URI:...> oddzielone przecinkami
# metoda typowo: caIssuers;URI:<url> oraz OCSP;URI:<url>
authorityInfoAccess = caIssuers;URI:http://192.168.0.206/ca/ca.cert.pem, OCSP;URI:http://192.168.0.206/ocsp/

# CRL distribution point — poprawna składnia
crlDistributionPoints = URI:http://192.168.0.206/crl/intermediate.crl.pem

 

 Generujemy klucz ROOT CA

openssl genrsa -des3 -out /root/rootCA/private/ca.key.pem 4096
chmod 400 /root/rootCA/private/ca.key.pem

opcja -des3 - dodaje hasło do klucza prywatnego

 Generujemy certyfikat Root CA

openssl req -config /root/rootCA/openssl.cnf \
-key /root/rootCA/private/ca.key.pem \
-new -x509 -sha256 -days 7300 \
-out /root/rootCA/certs/ca.cert.pem

INTERMEDIATE CA (192.168.0.206)

Tworzymy katalogi:

mkdir -p /root/intermediateCA/{certs,crl,csr,newcerts,private}
chmod 700 /root/intermediateCA/private
touch /root/intermediateCA/index.txt
echo 1000 > /root/intermediateCA/serial
echo 1000 > /root/intermediateCA/crlnumber

Tworzymy openssl.cnf

nano /root/intermediateCA/openssl.cnf

[ ca ]
default_ca = CA_default

[ CA_default ]
dir = /root/intermediateCA
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/private/intermediate.key.pem
certificate = $dir/certs/intermediate.cert.pem

default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 3650
preserve = no
policy = policy_loose

[ policy_loose ]
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied

[ req ]
default_bits = 4096
default_md = sha256
distinguished_name = req_distinguished_name
x509_extensions = v3_intermediate_ca
prompt = no

[ req_distinguished_name ]
C = PL
ST = Kujawsko-Pomorskie
L = Inowroclaw
O = Home LAN
OU = Intermediate CA
CN = Home LAN Intermediate CA

[v3_intermediate_ca]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
# AIA i CRL - poprawna składnia (METODA;URI:adres), wpisy oddzielone przecinkami
authorityInfoAccess = OCSP;URI:http://192.168.0.206/ocsp/,caIssuers;URI:http://192.168.0.206/ca/ca.cert.pem
crlDistributionPoints = URI:http://192.168.0.206/crl/intermediate.crl.pem#############################################

# CERTYFIKATY SERWEROWE
#############################################

[ server_cert ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = omen.local
DNS.2 = localhost
DNS.3 = proxmox.local
DNS.4 = homeasist.local
DNS.5 = pihole.local
DNS.6 = zabbix.local
DNS.7 = mama.local
DNS.8 = serwerdom.local
DNS.9 = freeradius.local
DNS.10=mbtwinplus.local
IP.1 = 192.168.0.10
IP.2 = 192.168.0.100
IP.3 = 192.168.0.101
IP.4 = 192.168.0.104
IP.5 = 192.168.0.200
IP.6 = 192.168.0.201
IP.7 = 192.168.0.202
IP.8 = 192.168.0.203
IP.9 = 192.168.0.204
IP.10 = 192.168.0.205
IP.11 = 192.168.0.206

 

Generujemy klucz Intermediate CA

openssl genrsa -des3 -out /root/intermediateCA/private/intermediate.key.pem 4096
chmod 400 /root/intermediateCA/private/intermediate.key.pem
 

Generujemy CSR Intermediate CA

openssl req -config /root/intermediateCA/openssl.cnf \
-new -sha256 \
-key /root/intermediateCA/private/intermediate.key.pem \
-out /root/intermediateCA/csr/intermediate.csr.pem

 

Podpisujemy Intermediate CSR w ROOT CA na 192.168.0.205

UWAGA na 192.168.0.206 kopiujemy plik intermediate.csr.pem do katalogu /tmp/

cp /root/intermediateCA/csr/intermediate.csr.pem /tmp/

Na RootCA (192.168.0.205) 

Tworzymy katalog:

mkdir -p /root/intermediateCA/csr

Teraz kopiujemy plik na rootCA - polecenie wydajemy na RootCA (192.168.0.205)

scp Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/tmp/intermediate.csr.pem /root/intermediateCA/csr

 mkdir -p /root/intermediateCA/certs

openssl ca -config /root/rootCA/openssl.cnf \
-extensions v3_ca \
-days 3650 -notext -md sha256 \
-in /root/intermediateCA/csr/intermediate.csr.pem \
-out /root/intermediateCA/certs/intermediate.cert.pem

 Kopiujemy pliki intermediate.cert.pem oraz ca.cert.pem do folderu /tmp

cp /root/intermediateCA/certs/intermediate.cert.pem /tmp

cp /root/rootCA/certs/ca.cert.pem /tmp

 

Na IntermediateCA:

Tworzymy katalog

mkdir -p /root/rootCA/certs

pobieramy pliki z RootCA

scp Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/tmp/ca.cert.pem /root/rootCA/certs/

scp Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/tmp/intermediate.cert.pem /root/intermediateCA/certs/

 SERWER OMEN (192.168.0.101)

 Tworzymy klucz serwera:

openssl genrsa -des3 -out apache.key 4096

Przygotowujemy plik apache_openssl.cnf

nano apache_openssl.cnf

[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = req_distinguished_name
req_extensions = req_ext

[ req_distinguished_name ]
C = PL
ST = Kujawsko-Pomorskie
L = Inowroclaw
O = Home LAN
OU = Omen Server
CN = omen.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = omen.local
DNS.2 = localhost
IP.1 = 192.168.0.101

Generujemy CSR

openssl req -new -key apache.key -out apache.csr -config apache_openssl.cnf

 Podpisujemy w Intermediate CA (192.168.0.206)

Tworzymy katalogi

mkdir -p /root/apache/csr

mkdir -p /root/apache/certs

Kopiujemu CSR Apache na IntermediateCA

scp Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/home/latino-ino/ssl/apache.csr /root/apache/csr

Generujemy certyfikat serwera

openssl ca -config /root/intermediateCA/openssl.cnf \
-extensions server_cert \
-days 825 -notext -md sha256 \
-in /root/apache/csr/apache.csr -out /root/apache/certs/apache.crt

Tworzymy chain file:

cat /root/apache/certs/apache.crt /root/intermediateCA/certs/intermediate.cert.pem /root/rootCA/certs/ca.cert.pem > /root/apache/certs/apache.fullchain.crt

Kopiujemy pliki na Apache Server

scp /root/apache/certs/apache.crt Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/home/latino-ino/ssl/

scp /root/apache/certs/apache.fullchain.crt Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/home/latino-ino/ssl/

scp /root/rootCA/certs/ca.cert.pem Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/home/latino-ino/ssl/

scp /root/intermediateCA/certs/intermediate.cert.pem Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/home/latino-ino/ssl/

Apache konfiguracja:

W pliku /etc/apache2/apache2.conf dodajemy lub poprawiamy ServerName na:

ServerName omen.local   

Kopiujemy apache.ctr do /etc/ssl/

sudo cp apache.crt /etc/ssl/

Kopiujemy apache.fullchain.crt do /etc/ssl/certs/

sudo cp apache.fullchain.crt /etc/ssl/certs

Kopiujemy apache.key do /etc/ssl/private/

 sudo cp apache.key /etc/ssl/private/

Edytujemy plik default-ssl.conf

/etc/apache2/sites-enabled/default-ssl.conf

Szukamy poniższe linie, usuwamy hashe jeśli są przed liniami i podajemy położenie plików:

SSLEngine on

SSLCertificateFile /etc/ssl/certs/apache.fullchain.crt

SSLCertificateKeyFile /etc/ssl/private/apache.key 

Linia #SSLCertificateChainFile /etc/ssl/certs/server.fullchain.crt ma być zahashowana.

Na początku pliku wstawiamy nazwę serwera (jeśli nie ma) lub poprawiamy starą.

ServerName omen.local

 

Tworzymy CA Chain File:

bash -c "cat intermediate.cert.pem ca.cert.pem > ca-chain.crt"

Kopiujemy plik ca-chain.crt do /etc/ssl/

sudo cp ca-chain.crt /etc/ssl/

Nadajemy mu odpowiednie prawa:

sudo chmod 644 /etc/ssl/ca-chain.crt

W pliku/etc/hosts wpisujemy IP i powiązaną z nim nazwę DNS:

127.0.0.1 localhost
192.168.0.101 omen.local

Restartujemy serwer apache:

sudo systemctl restart apache2

kopiujemy pliki ca.cert.pem oraz intermediateca.cetr.pem do /usr/local/share/ca-certificates aby zainstalować je w systemie (od razu zmieniamy nazwy z pem na crt)

cp ca.cert.pem /usr/local/share/ca-certificates/ca.cert.crt

sudo cp intermediate.cert.pem /usr/local/share/ca-certificates/intermediateca.cert.crt

Aktualizujemy bazę certyfikatów:

sudo update-ca-certificates

Dodajemy certyfikat RootCA do Chrome:

chrome://settings/certificates

oraz do Firefoxa

Cartyfikat dla Proxmox (192.168.0.200)

Logujemy się do Proxmoxa:

ssh Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.

Tworzymy katalogi na certyfikaty:

mkdir -p /etc/pve/local/pki/custom
cd /etc/pve/local/pki/custom

Generujemy klucz prywatny (Uwaga! Nie szyfrujemy go!)

openssl genrsa -out proxmox.key 4096

Tworzymy plik CSR z SAN

nano proxmox.csr.conf

Wklejamy do pliku:

[ req ]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = PL
ST = Kujawsko-Pomorskie
L = Inowroclaw
O = Home LAN
OU = Proxmox
CN = proxmox.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = proxmox.local
IP.1 = 192.168.0.200

Generujemy CSR:

openssl req -new -key proxmox.key -out proxmox.csr -config proxmox.csr.conf

Podpisujemy CSR na IntermediateCA (192.168.0.206)

Tworzymy katalogi:

mkdir -p /root/proxmox/csr

mkdir -p /root/proxmox/certs

Kopiujemu CSR Proxmox na IntermediateCA

scp Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/etc/pve/local/pki/custom/proxmox.csr /root/proxmox/csr

Generujemy certyfikat dla Proxmox:

openssl ca -config /root/intermediateCA/openssl.cnf \
-extensions server_cert \
-days 825 -notext -md sha256 \
-in /root/proxmox/csr/proxmox.csr -out /root/proxmox/certs/proxmox.crt

Tworzymy pełny łańcuch certyfikatów:

cat /root/proxmox/certs/proxmox.crt /root/intermediateCA/certs/intermediate.cert.pem /root/rootCA/certs/ca.cert.pem > /root/proxmox/certs/proxmox.fullchain.crt

Kopiujemy pliki na Proxmox:

scp /root/proxmox/certs/proxmox.crt Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/etc/pve/local/pki/custom

scp /root/proxmox/certs/proxmox.fullchain.crt Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/etc/pve/local/pki/custom

scp /root/rootCA/certs/ca.cert.pem Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/etc/pve/local/pki/custom

scp /root/intermediateCA/certs/intermediate.cert.pem Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.:/etc/pve/local/pki/custom

Proxmox Konfiguracja:

Na Proxmox 192.168.0.200 kopiujemy pliki:

cp /etc/pve/local/pki/custom/proxmox.key /root/pve-ssl.key

cp /etc/pve/local/pki/custom/proxmox.fullchain.crt /root/pve-ssl.pem

Nadajemy plikom prawidłowe uprawnienia:

chmod 600 /root/pve-ssl.key

chmod 644 /root/pve-ssl.pem

Kopiujemy pliki:

cp /root/pve-ssl.key /etc/pve/local/pve-ssl.key

cp /root/pve-ssl.pem /etc/pve/local/pve-ssl.pem

Restartujemy usługi Proxmox:

systemctl restart pveproxy

systemctl restart pvedaemon

 

 

 

Przydatne polecenia:

Sprawdzenie kodowania plików:

file -i /root/rootCA/openssl.cnf

Sprawdzenie certyfikatu intermediateCA na Serwerze pośredniczącym CA:

openssl x509 -in /root/intermediateCA/certs/intermediate.cert.pem -noout -text | sed -n '1,120p'

Test ca-chain:

openssl x509 -in /etc/ssl/ca-chain.crt -noout -text | grep "Issuer"

Sprawdzamy czy Apache naprawdę używa właściwego certyfikatu:

openssl s_client -connect 192.168.0.101:443 -showcerts | openssl x509 -noout -subject -issuer

Sprawdzenie czy chain jest prawidłowy:

openssl verify -CAfile /etc/ssl/ca-chain.crt /etc/ssl/apache.crt

Powinno być:

/etc/ssl/apache.crt: OK

openssl s_client -connect 192.168.0.101:443 -showcerts -CAfile ca.cert.pem

 Powinno być: Verify return code: 0 (ok)

 

Sprawdzenie poprawności wygenerowania  poprawnego łańcucha znaków dla klucza prywatnego.

Dla klucza prywatnego:

openssl rsa  -in klucz-prywatny.key -noout -modulus

Dla łańcucha certyfikatów:

openssl x509 -in lancuch-sertyfikatow.pem -noout -modulus

 

latino-ino

Strona internetowa: komputery-pc.info

Skomentuj

Popularne Artykuły

Pomagaj z nami

Reklama

Laptopy i komputery - sprawdź na Ceneo

Nowości

Szukaj

Kupuj najtaniej

Społeczność

Laptopy i komputery na Ceneo