Wydrukuj tę dokumentacjęPokaż jako slajdy
Spis Treści
Wykonanie własnego CA
W chwili obecnej dostępne są darmowe certyfikaty, niemniej może być przydatne utworzenie własnego CA np. na potrzeby deszyfracji ruchu webowego dla przeglądarek. Dodatkowo własne CA pozwala na wykorzystanie uwierzytelniania z wykorzystaniem certyfikatu klienta zamiast klasycznego login/hasło.
Wymagane komponenty
Przede wszystkiem OpenSSL z ports albo z systemu bazowego. Dodatkowo potrzebny będzie Makefile z repozytroum skryptów jak również pliki konfiguracyjne dla OpenSSLa. Wszystkie te pliki muszę wylądować w katalogu /usr/local/etc/ssl1.
Lokalne zmiany dla make
Plik Makefile do generowania certyfikatów posiada dużo zmiennych, które można ustawić wg lokalnych potrzeb serwera. Wszystkie te zmiany powinny znaleźć się w pliku __makefile_include__. Przykładowa zawartość może wyglądać następująco:
# ustawienia lokalne dla wybranych zmiennych
#
BSD_SERWIS_LOCAL_CA_OPERATIONS= yes
CRT_HOSTNAME= lab.wtp3.local
DAYS= 3685
CA_SIGN_DFLT_EXT= server_cert
CA_SIGN_CATRUE_EXT= v3_intermediate_ca
CSR_DFLT_EXT= server_cert
CSR_CATRUE_EXT= server_cert_ca
OPENSSL_CNF= ca-root.cnf
SHCRT_PARAMS= -text
CAKEY_CIPHER= aes128
CACRLFILE=$(CRT_SELFDIR)/crl/lab.ca.crl.pem
CAKEYFILE=$(CRT_SELFDIR)/private/lab.key.pem
CACRTFILE=$(CRT_SELFDIR)/certs/lab.crt.pem
Zmiany w konfiguracji OpenSSL
Pliki konfiguracyjne dla OpenSSL są utrzymywane w repozytirum skryptów. Niemniej w razie potrzeby za pomocą autorskiego skryptu unimaster będzie możliwość zachowania lokalnych zmian. Druga możliwość do wpisywanie za każdym razem lokalnych ustawień domyślnych
string mask oraz policy_match
W trakcie tworzenia kolejnych certyfikatów może się pojawić komunikat o niezgodności polityki zgodności pomiędzy certyfikatem CA a nowo wygenerowanym csr/ Należy sprawdzić ustawienia dotyczące string_mask oraz policy_match:
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
[req]
# This sets a mask for permitted string types. There are several options.
# default: PrintableString, T61String, BMPString.
# pkix : PrintableString, BMPString (PKIX recommendation before 2004)
# utf8only: only UTF8Strings (PKIX recommendation after 2004).
# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
# MASK:XXXX a literal mask value.
# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
string_mask = utf8only
W razie czego trzeba zmienić jedno z w/w ustawień:
[ policy_match ]
countryName = match
stateOrProvinceName = supplied
[req]
string_mask = pkix
Certyfikat Root CA
Oprócz podstawowego uzycia certyfikatu (np. podpisywanie certyfikatów, publikowanie listy CRL) certyfika może posiadać rozszerzone sposoby uzycia. Jeżeli nie będzie konfiguracji użycia rozszerzonego, to będie oznaczało możliwość uzycia we wszystkich przypadkach. Można jednakże ograniczyć uzycie do konkretnych zadań, np. tylko autentykacja serwera, klienta albo szyfrowanie poczty email (więcej informacji w poleceniu man x509v3_config):
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
extendedKeyUsage = serverAuth, clientAuth, emailProtection
nsComment = "OpenSSL Generated CA Certificate"
nsCertType = sslCA, emailCA
Po wykonaniu wszystkich modyfikacji dla lokalnego serwera można przystąpić do generowania certyfikatu głównego (Root CA):
cd /usr/local/etc/ssl/
make rand cakey ca
Weryfikację certyfikatu można wykonać poprzez wydanie polecenia:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=www.moj.serwer shca
Certyfikat Intermediate CA
Certyfikat potrzebny w przypadku konfiguracji serwera proxy, który potrafi "rozszywać" SSL. Certyfikat pośredni posiada atrybut (w ramach swoich rozszerzeń) CA:true. Generowanie takiego certyfikatu jest już wykonane za pomocą dedykowanego pliku Makefile. W katalogu z certyfikatami wystarczy umieścić plik __makefile_include__ z następującymi ustawieniami:
# ustawienia lokalne dla wybranych zmiennych
#
BSD_SERWIS_LOCAL_CA_OPERATIONS= yes
CACRLFILE= $(CRT_SELFDIR)/crl/domena.ca.16.crl.pem
CAKEYFILE= $(CRT_SELFDIR)/private/domena.ca.16.key.pem
CACRTFILE= $(CRT_SELFDIR)/certs/domena.ca.16.crt.pem
CACRTFILE_DER= $(CRT_SELFDIR)/certs/domena.ca.16.crt.der
CRT_HOSTNAME= w3c.domena.local
DAYS= 3685
CA_SIGN_DFLT_EXT= server_cert
CA_SIGN_CATRUE_EXT= v3_intermediate_ca
CSR_DFLT_EXT= server_cert
CSR_CATRUE_EXT= v3_intermediate_ca
OPENSSL_CNF= ca-root.cnf
# parametry inne
SHCRT_PARAMS= -text
SHCA_PARAMS= -text
CAKEY_CIPHER= aes128
CRTFILE= $(CRT_SELFDIR)/certs/$(CRT_HOSTNAME).crt.pem
KEYFILE= $(CRT_SELFDIR)/private/$(CRT_HOSTNAME).key.pem
DHFILE= $(CRT_SELFDIR)/dh/$(CRT_HOSTNAME).$(CRT_SEED).dh.pem
CSRFILE= $(CRT_SELFDIR)/csr/$(CRT_HOSTNAME).csr.pem
CRT_SIGNED_FILE= $(CRT_SELFDIR)/certs/$(CRT_HOSTNAME).signed.pem
CRT_SIGNED_FILE_DER= $(CRT_SELFDIR)/certs/$(CRT_HOSTNAME).signed.der
Plik ca-root.cnf jest umieszczony w repozytorium skryptów.
Certyfikat dla serwera
Po wygenerowaniu certyfikatu głównego oraz (ewentualnie) certyfikatu pośredniczącego można wygenerować prośbę o certyfikat dla konkretnego serwera:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=www.moj.serwer rand key csr
oraz sam certyfikat:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=www.moj.serwer sign
Weryfikację certyfikatu można wykonać poprzez wydanie polecenia:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=www.moj.serwer shcrt
Obsługa SAN
Użyte zadania make zakładają, że nazwa certyfikatu znajduje się w polu CN certyfikatu. Jednakże może być przydatne wystawienie certyfikatu z dodatkowymi nazwami2. Niemniej narzędzie openssl wspiera załączanie konfiguracji dopiero od wersji 1.1.1 (na dzień 06.05.2019 wersja 1.1.1 ma jeszcze status "nieustabilizowana"). W związku z tym należy przygotować sobie konfigurację czątkową dla danej nazwy (certyfikatu), która połączona z główną konfiguracją (ca-root.cnf) pozwoli na wygenerowanie certyfikatu wraz z polem SAN.
Cząstkowa konfiguracja openssl
Przykładowa konfiguracja została zapisana w pliku /usr/local/etc/ssl/configs/req/wild.bsdserwis.com.cnf.req:
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = PL
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = mazowieckie
localityName = Locality Name (eg, city)
localityName_default = Warszawa
0.organizationName = Organization Name (eg, company)
0.organizationName_default = BSD Serwis Krzysztof Stryjek
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = BSD Serwis Security Team
commonName = Common Name (eg, YOUR name)
commonName_max = 64
commonName_default = *.bsdserwis.com
emailAddress = Email Address
emailAddress_max = 64
emailAddress_default = security@bsdserwis.com
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = *.bsdserwis.com
Posiadając taką cząstową konfigurację wykonujemy polecenia:
cd /usr/local/etc/ssl
cat ca-root.cnf configs/req/wild.bsdserwis.com.cnf.req > configs/wild.bsdserwis.com.cnf
# wygenerowanie całego certyfikatu
make OPENSSL_CNF=configs/wild.bsdserwis.com.cnf CRT_HOSTNAME=wild.bsdserwis.com csr sign
Certyfikat dla użytkownika
Wygenerowanie samego certyfikatu
Posiadając już gotowy Makefile należy wydać polecenia:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=win10.wtp3.local CA_SIGN_DFLT_EXT=usr_cert CSR_DFLT_EXT=usr_cert sign
W kolejnym kroku należwy wygenerować certyfikat w formacie p12, który można zaimportować do przeglądarki:
cd /usr/local/etc/ssl/
make CRT_HOSTNAME=win10.wtp3.local p12
Instalacja w przeglądarkach
Firefox
W pierwszym kroku należy zainstalować certyfikat CA jako zaufanego wystawcę. Następnie należy zaimportować certyfikat w formacie p12 do zakładki Użytkownicy
I tu ciekawostka: pomimo poprawnego wygenerowania Firefox podaje komunikat (stan na dzień 06.05.2019), że certyfikatu nie można zweryfikować z powodu "nieznanego błędu". Niemniej użycie tego certyfikatu jest możliwe oraz działa poprawnie po stronie serwera webowego.
Chrome
W pierwszym kroku należy zainstalować certyfikat CA jako zaufanego wystawcę. Następnie należy zaimportować certyfikat w formacie p12 do zakładki Osobisty
Konfiguracja po stronie serwera www
W konfiguracji serwera www należy zapewnić konfigurację, które autentykuje użytkownika po certyfikacie zamiast prostego "login/hasło".
Utworzenie CRL
Utworzenie pliku CRL to jedno. Drugą ważną rzeczą jest opublikowanie lity odwołanych certyfikatów. W konfiguracji OpenSSLa należy w odpowiedniej sekcji dodać następującą konfigurację:
[ CA_default ]
# Directory and file locations.
dir = ./
crl_dir = $dir/crl
# For certificate revocation lists.
crlnumber = $dir/crl/crlnumber
crl = $dir/crl/ca.crl.pem
crl_extensions = crl_ext
default_crl_days = 30
[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
crlDistributionPoints = http://ca.bsdserwis.com/ca.crl.pem
[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always
Następnie przystępujemy do generowania listy:
cd /usr/local/etc/ssl/
make gencrl
Powstały CRL należy skopiować do katalogu, który jest upubliczniany przez serwer webowy
Utworzenie OCSP
OCSP ma w założeniu być protokołem (mechanizmem) pozwalającym na sprawdzanie ważności certyfikatów w czasie rzeczywistym. W przypadku OCSP serwer nie jest uruchamiany poprzez np. www/apache24, tylko poprzez samego OpenSSLa.
Na chwilę obecną uruchomienie OCSP wymaga prac skryptowych w celu poprawnego działania.
Do ukończenia.
Skonfigurowanie katalogu z certyfikatami SSL (certyfikatami CA)
Istnieje katalog /etc/ssl zawierający wszelkie CA zainstalowane w systemie. Jest tam zestaw certyfikatów zainstalowanych przez security/ca_root_nss. W tym katalogu powinny znaleźć się również wszystkie certyfikaty CA wygenerowane samodzielnie w ramach własnego CA (patrz wyżej). Ten katalog (/etc/ssl) można podawać jako parametr CApath w różnych programach (np. security/stunnel albo www/apache22).
Pliki znajdujące się w katalogu /etc/ssl muszą być w formacie PEM, zaś nazwy plików muszą być z rozszerzeniem .pem. Po każdej zmianie zawartości katalogu należy wykonać jego aktualizację:
c_rehash /etc/ssl
Źródła w sieci internet
https://www.digitalocean.com/community/tutorials/how-to-configure-ocsp-stapling-on-apache-and-nginx
https://support.globalsign.com/customer/portal/articles/1618853-ocsp-stapling
(c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.
