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



