Generowanie certyfikatów z wykorzystaniem easy-rsa
Kategoria: Artykuły, etykiety: ca, certyfikat, easy-rsa
Dodany: 2014-09-25 14:23
(zmodyfikowany: 2014-09-25 14:23)
Przez: morfik
Wyświetleń: 10793
Jakiś czas temu, przy pisaniu artykułu dotyczącego konfiguracji protokołu WPA2 Enterprise z wykorzystaniem oprogramowania freeradius, przedstawiłem manualny sposób na generowanie wszystkich potrzebnych certyfikatów. Nie było tego znowu aż tak dużo ale jakby nie patrzeć trochę parametrów trzeba znać, a najlepiej mieć przygotowane odpowiednie linijki, by sam proces generowania certyfikatów przebiegł dość sprawnie. Jednak wychodzi na to, że nie trzeba się znowu aż tak wysilać. Nawet serwer freeradiusa miał przecie do dyspozycji narzędzia ułatwiające konfigurację wszystkiego co związane było z ustawieniem własnego CA.
Sprawa dotyczy pakietu easy-rsa i w sumie tylko przypadek sprawił, że się na niego natknąłem. Po jego instalacji w systemie, mamy dostępne narzędzie make-cadir -- po wskazaniu pustego katalogu, podlinkuje ono szereg plików, które posłużą nam później przy generowaniu certyfikatów. Wyglądać to powinno mniej więcej tak:
$ make-cadir ./CA/
$ ls -al ./CA/
total 44K
drwx------ 2 morfik morfik 4.0K Sep 24 17:57 ./
drwxr-xr-x 3 morfik morfik 4.0K Sep 24 17:57 ../
lrwxrwxrwx 1 morfik morfik 28 Sep 24 17:57 build-ca -> /usr/share/easy-rsa/build-ca*
lrwxrwxrwx 1 morfik morfik 28 Sep 24 17:57 build-dh -> /usr/share/easy-rsa/build-dh*
lrwxrwxrwx 1 morfik morfik 31 Sep 24 17:57 build-inter -> /usr/share/easy-rsa/build-inter*
lrwxrwxrwx 1 morfik morfik 29 Sep 24 17:57 build-key -> /usr/share/easy-rsa/build-key*
lrwxrwxrwx 1 morfik morfik 34 Sep 24 17:57 build-key-pass -> /usr/share/easy-rsa/build-key-pass*
lrwxrwxrwx 1 morfik morfik 36 Sep 24 17:57 build-key-pkcs12 -> /usr/share/easy-rsa/build-key-pkcs12*
lrwxrwxrwx 1 morfik morfik 36 Sep 24 17:57 build-key-server -> /usr/share/easy-rsa/build-key-server*
lrwxrwxrwx 1 morfik morfik 29 Sep 24 17:57 build-req -> /usr/share/easy-rsa/build-req*
lrwxrwxrwx 1 morfik morfik 34 Sep 24 17:57 build-req-pass -> /usr/share/easy-rsa/build-req-pass*
lrwxrwxrwx 1 morfik morfik 29 Sep 24 17:57 clean-all -> /usr/share/easy-rsa/clean-all*
lrwxrwxrwx 1 morfik morfik 33 Sep 24 17:57 inherit-inter -> /usr/share/easy-rsa/inherit-inter*
lrwxrwxrwx 1 morfik morfik 28 Sep 24 17:57 list-crl -> /usr/share/easy-rsa/list-crl*
-rw-r--r-- 1 morfik morfik 7.7K Sep 24 17:57 openssl-0.9.6.cnf
-rw-r--r-- 1 morfik morfik 8.3K Sep 24 17:57 openssl-0.9.8.cnf
-rw-r--r-- 1 morfik morfik 8.2K Sep 24 17:57 openssl-1.0.0.cnf
lrwxrwxrwx 1 morfik morfik 27 Sep 24 17:57 pkitool -> /usr/share/easy-rsa/pkitool*
lrwxrwxrwx 1 morfik morfik 31 Sep 24 17:57 revoke-full -> /usr/share/easy-rsa/revoke-full*
lrwxrwxrwx 1 morfik morfik 28 Sep 24 17:57 sign-req -> /usr/share/easy-rsa/sign-req*
-rw-r--r-- 1 morfik morfik 2.1K Sep 24 17:57 vars
lrwxrwxrwx 1 morfik morfik 35 Sep 24 17:57 whichopensslcnf -> /usr/share/easy-rsa/whichopensslcnf*
Przy pomocy tych skryptów możemy wygenerować certyfikaty do ssh, openvpn, freeradiusa i wielu innych rzeczy, z tym, że one chyba raczej były projektowane głównie na potrzeby openvpn -- przynajmniej pakiet easy-rsa się bardzo często pojawia w tekstach o tworzeniu własnego VPN.
Zobaczmy zatem jak wygląda tworzenie certyfikatów przy pomocy dostarczonych nam skryptów. Na sam początek edytujemy plik vars -- są w nim definiowane zmienne konfiguracyjne używane przy generowaniu certyfikatów. Poniżej znajduje się zrzut mojej konfiguracji:
# easy-rsa parameter settings
# NOTE: If you installed from an RPM,
# don't edit this file in place in
# /usr/share/openvpn/easy-rsa --
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
# This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA="`pwd`"
#
# This variable should point to
# the requested executables
#
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR="$EASY_RSA/keys"
# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
# Increase this to 2048 if you
# are paranoid. This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=4096
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="NSA"
export KEY_EMAIL="morfik@nsa.com"
export KEY_OU="Security Division"
# X509 Subject Field
export KEY_NAME="morfik"
# PKCS11 Smart Card
# export PKCS11_MODULE_PATH="/usr/lib/changeme.so"
# export PKCS11_PIN=1234
# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below
# You will also need to make sure your OpenVPN server config has the duplicate-cn option set
# export KEY_CN="CommonName"
I to w zasadzie tyle jeśli chodzi o nasz wkład w proces tworzenia certyfikatów. Teraz już tylko wydajemy poniższe polecenia:
$ source ./vars
$ ./clean-all
$ ./build-ca
Generating a 4096 bit RSA private key
...
$ ./build-dh
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
...
$ ./build-key-server server
Generating a 4096 bit RSA private key
...
Jeśli chodzi zaś o certyfikaty klienckie, to mamy trochę więcej opcji, bo możemy określić hasło oraz istnieje też możliwość zapakowania certyfikatów w plik .p12 . W zależności od potrzeb wpisujemy w terminal nazwę odpowiedniego skryptu. W tym przypadku jest to:
$ ./build-key-pkcs12 client
Generating a 4096 bit RSA private key
...
Taka mała uwaga -- wszystkie pliki .key nie są zaszyfrowane i pewnie w wielu przypadkach nie ma potrzeby ich szyfrowania. Jeśli jednak życzymy sobie kluczy w formie zaszyfrowanej, możemy je zaszyfrować ręcznie po całym procesie generowania certyfikatów, przykładowo:
$ openssl rsa -aes256 -in keys/client.key -out keys/client.key.encrypted
writing RSA key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
A jeśli nie mamy pojęcia czy dany klucz jest zaszyfrowany czy też nie, możemy to sprawdzić przez:
$ openssl rsa -text -noout -in keys/client.key
Private-Key: (4096 bit)
modulus:
...
Jeśli po wydaniu powyższego polecenia nie zostaniemy poproszeni o hasło, znaczy, że klucz nie jest zaszyfrowany.