OpenSSL - generowanie pliku żądania

Series: publications June 16, 2017

Podczas generowania pliku CSR zostaniemy poproszeni o wskazanie dodatkowych informacji. Warto zaznajomić się z wymaganymi polami i przygotować sobie na boku ich poprawne wartości.

Spis treści

Wprowadzenie

W tym artykule przewijać się będą następujące parametry:

  • in/out - określa wskazanie klucza (na wejściu i wyjściu)
  • new - wygenerowanie nowego żądania
  • newkey - wygenerowanie nowego klucza prywatnego
  • nodes - nie szyfruje wyjścia (nie ustawia hasła)
  • keyout - określa wskazanie klucza prywatnego
  • subj - określa dane przekazane do pliku żądania (zawarte w polu Subject)

Dodatkowo przy operowaniu na kluczach, plikach żądań czy certyfikatach:

  • rsa - odnosi się do klucza prywatnego
  • req - odnosi się do pliku żądania (CSR)
  • x509 - odnosi się do pliku certyfikatu

Najbardziej znane formaty certyfikatów to:

  • der - używane w binarnych kodowaniach certyfikatu, mogą zawierać rozszerzenie .der lub .cer, dodatkowo warto wiedzieć, że jest to certyfikat szyfrowany przez DER a nie certyfikat DER
  • pem - rozszerzenie to jest wykorzystywane dla różnych plików x509v3, które zawierają dane ASCII (base64) poprzedzone wierszem -----BEGIN CERTIFICATE-----
  • crt - rozszerzenie to informuje o certyfikacie; certyfikaty mogą być zakodowane jako binarne (.der) lub jako ASCII (.pem), rozszerzenia .cer i .crt są niemal synonimem
  • cer - alternatywna forma .cer (konwencja Microsoft)
  • key - rozszerzenie to wykorzystywane jest do prywatnych oraz publicznych PKCS#8 (mogą być zakodowane binarnie lub jako ASCII)

Sposoby wygenerowania żądania certyfikatu

W dwóch pierwszych przykładach danego wymagane do wygenerowania żądania podane zostaną jako odpowiedzi na zadawane pytania. Istnieją jeszcze inne sposoby na przekazanie danych do polecenia openssl co zostanie zaprezentowane w przykładzie

Tylko plik żądania

Wygenerowanie pliku CSR na podstawie istniejącego już klucza prywatnego:

( _fd="private.key" ; _fd_csr="request.csr" ; \
openssl req -out ${_fd_csr} -new -key ${_fd} )

Klucz prywatny + plik żądania

Wygenerowanie nowego klucza prywatnego (jeżeli go nie mamy lub wymagany jest nowy) oraz pliku CSR:

( _fd="private.key" ; _fd_csr="request.csr" ; _len="2048" ; \
openssl req -out ${_fd_csr} -new -newkey rsa:${_len} -nodes -keyout ${_fd} )

Generowanie na podstawie danych z podanego certyfikatu

Podany sposób nie chwyta rozszerzeń, np. SAN - nie zostają wyświetlone przy weryfikacji pliku żądania.

Przekazanie danych do pliku żądania z pliku istniejącego certyfikatu:

( _fd="private.key" ; _fd_csr="request.csr" ; _fd_crt="cert.crt" ; \
openssl x509 -x509toreq -in ${_fd_crt} -out ${_fd_csr} -signkey ${_fd} )

Generowanie na podstawie danych z podanego parametru -subj

Parametr -subj musi zawierać wszystkie wymagane dane. Należy pamiętać o:

  • tylko jednym polu CN (domena główna, zarejestrowana w bazie whois)
  • pozostałe domeny należy podać jako rozszerzenie subjectAltName (domena główna jako pierwsza)

Zalecanym sposobem podawania danych do pliku CSR jest ostatni sposób.

Przekazanie danych do pliku żądania z parametru wywołania programu openssl:

Część wspólna

( _fd="private.key" ; _fd_csr="request.csr" ; \
openssl req -new -sha256 -key ${_fd} -out ${_fd_csr} \

Sposób 1

-subj "/CN=test.pl/O=My Corporation/OU=Org Unit 1/OU=Org Unit 2" )

Sposób 2

-subj "/C=US/ST=New York/L=New York/O=End Point/OU=Hosting Team\
/CN=www.endpoint.com/emailAddress=admin@our-awesome-domain.com\
/subjectAltName=DNS.1=endpoint.com,DNS.2=store.endpoint.com" )

Generowanie na podstawie danych z podanego parametru -config

Poniższy sposób jest najbardziej zalecany jednak należy pamiętać, że nie zawsze pozwala na umieszczenie wszystkich parametrów, np. jurisdictionCountryName (po jego podaniu zwrócony zostaje błąd).

Wersja 1

-config <(
cat <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=PL
ST=Wielkopolskie
L=Poznan
O=Company Sp. z o.o.
OU=Dzial IT
CN=company.pl

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = company.pl
DNS.2 = www.company.pl
EOF
))

Wersja 2

Różnica między pierwszą wersją to adres e-mail oraz dodatkowe pola CN.

-config <(
cat <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=PL
ST=Dolnoslaskie
L=Wroclaw
O=Company Sp. z o.o.
OU=Dzial IT
emailAddress=admin@company.pl
CN=company.pl

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = company.pl
DNS.2 = www.company.pl
DNS.3 = blog.company.pl
DNS.4 = static.company.pl
DNS.5 = media.company.pl
EOF
))

Wersja nr 3

Kilka street, OU oraz CN - można też tak robić z innymi polami.

-config <(
cat <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=GB
postalCode=EC3P 3DQ
ST=London
L=London
0.street=State Street
1.street=St John
O=London Organization
0.OU=Great Britain
1.OU=Hosted by London Organization
2.OU=EliteSSL
CN=company.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = company.com
DNS.2 = www.company.com
EOF
))

built with Jekyll and trimstray blog — read the fine print