Wydrukuj tę dokumentacjęPokaż jako slajdy

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


{i}  (c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.


  1. Jest to kolejny katalog w poszukiwaniu certyfikatów przez oporgramowanie instalowane we FreeBSD. (1)

  2. Przeglądarka Chrome traktuje certyfikat bez SAN jako nie zaufany. Tak więc nawet dla pojedynczej nazwy pole CN może być puste, ale SAN musi być dodane. (2)

CertyfikatySsl (ostatnio edytowane 2019-11-17 09:31:57 przez wtps0n)