OpenSSL - CA Kamil Bartocha November 28, 2010 1 Tworzenie CA przy użyciu OpenSSL 1.1 Przygotowanie CA Najwygodniejszym rozwiązaniem jest stworzenie struktury katalogów, która będzie przechowywała pliki CA. Mogą to być np. dwa katalogi signedcerts (do przechowywania podpisanych certyfikatów) i private do przechowywania klucza prywatnego CA. mkdir -p myca/signedcerts mkdir myca/private cd myca W kolejnym kroku należy stworzyć bazę certyfikatów. W pliku serial przechowywany będzie numer kolejnego certyfikatu, a w pliku index.txt rejestr certyfikatów. echo 01 > serial touch index.txt Następnie należy stworzyć plik konfiguracji myca/caconfig.cnf na podstawie przykładu: My sample caconfig.cnf file. Default configuration to use when one is not provided on the command line. [ ca ] default_ca = local_ca Default location of directories and files needed to generate certificates. 1
[ local_ca ] dir = [KATALOG DLA CA]/myCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/signedcerts private_key = $dir/private/cakey.pem serial = $dir/serial Default expiration and encryption policies for certificates. default_crl_days = 365 default_days = 1825 default_md = md5 policy = local_ca_policy x509_extensions = local_ca_extensions Default policy to use when generating server certificates. The following fields must be defined in the server certificate. [ local_ca_policy ] stateorprovincename organizationname organizationalunitname x509 extensions to use when generating server certificates. [ local_ca_extensions ] subjectaltname = DNS:[ADRES] basicconstraints = CA:false nscerttype = server The default root certificate generation policy. [ req ] default_bits = 2048 default_keyfile = [KATALOG CA]/private/cakey.pem default_md = md5 2
prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions Root Certificate Authority distinguished name. Change these fields to match your local environment! [ root_ca_distinguished_name ] = [NAZWA] stateorprovincename = [REGION] = [KRAJ] = [EMAIL] organizationname = [NAZWA ORGANIZACJI] organizationalunitname = [NAZWA CZESCI ORG] [ root_ca_extensions ] basicconstraints = CA:true Domyślnie, program OpenSSL wczytuje konfigurację z pliku /etc/ssl/openssl.cnf. Należy zatem przestawić na czas pracy z CA ścieżkę do konfiguracji: export OPENSSL_CONF=[sciezka]/myCA/caconfig.cnf 1.2 Tworzenie certyfikatu CA Następnie można wygenerować certyfikat główny dla CA: openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825 Gdzie poszczególne parametry oznaczają: req podpolecenie openssl, -x509 wygenerowanie certyfikatu w standardzie x.509, -newkey generowanie nowej pary kluczy, rsa:2048 wybór algorytmu RSA i klucza o rozmiarze 2048 bitów, -out cacert.pem plik, do którego zostanie zapisany certyfikat, -outform PEM wybór formatu pliku, -days 1825 czas ważności certyfikatu. 3
Do wyświetlania zawartości certyfikatu służy następujące polecenie: openssl x509 -in./cacert.pem -noout -text 1.3 Tworzenie certyfikatu np. dla serwera www W kolejnym kroku możemy stworzyć certyfikat dla serwera WWW organizacji podpisując go stworzonym CA. Należy w tym celu stworzyć nowy plik konfiguracyjny myca/wwwserver.cnf, wg. wzoru: exampleserver.cnf [ req ] prompt distinguished_name = no = server_distinguished_name [ server_distinguished_name ] = www.[nazwa] stateorprovincename = [REGION] = [KRAJ] = [EMAIL] organizationname = [ORGANIZACJA] organizationalunitname = [JEDNOSTKA] Konfigurację tę używamy zmieniając zawartość zmiennej środowiskowej openssl, a następnie generujemy certyfikat. export OPENSSL_CONF=[SCIEZKA]/myCA/wwwserver.cnf openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM \ -out tempreq.pem -outform PEM Dodatkowo generowany jest klucz prywatny dla serwera (do połączeń po https), ale jest on domyślnie zaszyfrowany. Jeśli zostanie w takiej postaci wgrany do serwera www (np. apache), to przy każdym starcie będzie wymagane wprowadzenie hasła. Klucz taki należy zatem odszyfrować poleceniem: openssl rsa < tempkey.pem > server_key.pem Następnie CA może podpisać certyfikat serwera www: export OPENSSL_CONF=[SCIEZKA]/myCA/caconfig.cnf openssl ca -in./tempreq.pem -out server_crt.pem 4
W wyniku tych operacji otrzymujemy dwa pliki server_crt.pem (certyfikat) oraz server_key.pem (odszyfrowany klucz prywatny dla serwera). 1.4 Tworzenie prośby o podpisanie certyfikatu CA przez nadrzędne CA Stworzony wcześniej certyfikat dla naszego CA jest typu self-signed (tzn. podpisany przez to samo CA, na które jest wystawiony). Certyfikaty tego typu są uznawane za mniej bezpieczne i powinny być docelowo podpisane przez nadrzędną jednostkę certyfikującą. Aby wygenerować plik prośbę o podpis, należy wykonać polecenie: openssl req -new -key./private/cakey.pem -out./myreq.pem Plik myreq.pem może zostać teraz wysłany do nadrzędnego CA. 1.5 Tworzenie CRL (Certificate Revocation List) Lista CRL pozwala wycofywać certyfikaty przed czasem upływu ich ważności. Należy ją publikować w ściśle określonych odstępach czasu, a oprogramowanie korzystające z certyfikatów powinno automatycznie sprawdzać jej zawartość (nie zawsze tak się dzieje). W przypadku gdy używana jest konfiguracja CA (tzn. stosowny plik został wczytany do zmiennej środowiskowej OPENSSL_CONF) lista tworzona jest poleceniem: openssl ca -gencrl -out mycrl.pem Można również podać wprost położenie pliku z certyfikatem CA oraz kluczem prywatnym: openssl ca -gencrl -keyfile./private/cakey.pem -cert./cacert.pem -out mycrl.pem Certyfikaty dodaje się do listy za pomocą polecenia: openssl ca -revoke [plik z certyfikatem do cofniecia] Następnie należy okresowo generować nowe listy CRL. Do sprawdzania zawartości listy służy polecenie: openssl crl -in./mycrl.pem -noout -text 5