OpenSSL to potężne narzędzie pozwalające na zarządzacnie certyfikatami, stworzenie własnego centrum autoryzacji itp.
Aby było łatwiej
Zmiana wartości domyślnych dla generowanych certyfikatów
Tworzenie nowych certyfikatów możemy sobie ułatwić zmieniając domyślne wartości pól przez co będziemy mieli mniej pracy.
Plik konfiguracyjny dla Openssla to /usr/lib/ssl/openssl.conf albo /etc/ssl/openssl.cnf. Mniej więcej w połowie pliku znajduje się początek domyślnych ustawień. Możesz spokojnie zmienić nazwę kraju (countryName_default), województwa (stateOrProvinceName_default), nazwę firmy lub organizacji (0.organizationName_default) i nazwę działu (0.organizationName_default)
Zobacz też /etc/pki/tls/openssl.cnf.
Tworzenie nowego certyfikatu – droga manualna i długa
Generowanie nowego certyfikatu CA
1. Stworzenie nowego prywatnego klucza (1024 bity potrójne zakodowy przy pomocy algorytmu DES)
Wskazówka: nie używaj polskich liter przy tworzeniu certyfikatu.
openssl genrsa -des3 -out ca.key 1024
Po zakończeniu procedury w bieżącym katalogu pojawi się plik ca.key z kluczem naszego Centrum Autoryzacji. Klucz ten będzie zawierał hasło.
2. Wygenerowanie samopodpisanego klucza w strukturze X509
Podczas tworzenia certyfikatu (klucza) zostaniemy poproszeni o podanie danych dotyczących jego właściciela takich jak: państwo, region (województwo) oraz miasto w którym się znajduje wystawca, common name gdzie warto wstawić adres serwera wystawcy oraz email osoby do kontaktu.
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Generowanie certyfikatu usługi (witryny)
1. Wygenerowanie klucza serwera (usługi)
openssl genrsa -des3 -out server.key 1024
Po wykonaniu tej czynności w bieżącym katalogu pojawi się plik server.key
2. Wygenerowanie prośby o podpisanie klucza (request). W czasie wprowadzania „CommonName” wprowadź pełny adres serwisu.
openssl req -new -key server.key -out server.csr
Po wykonaniu tej czynności w w bieżącym katalogu pojawi się plik server.scr
Podpisanie prośby o certifikację certyfikatu klienta
Wykorzystanie skryptu sign.sh rozprowadzanego z pakietem mod_ssl (w dystrybucji Debian jest to pakiet libapache-mod-ssl z z wersji non-US) pozwala w łatwy sposób podpisywać prośby o certyfikacje. Jako parametr należy podać nazwę pliku w którym została ona zawarta.
$ ./sign.sh server.csr
Przebieg procedury będzie podobny do poniżej:
[root@localhost ssl]# ./sign.sh server.csr CA signing: server.csr -> server.crt: Using configuration from ca.config Enter pass phrase for ./ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'PL' stateOrProvinceName :PRINTABLE:'Lodz' localityName :PRINTABLE:'Lodz' organizationName :PRINTABLE:'XSoft' organizationalUnitName:PRINTABLE:'Dzial technologi Open-Source' commonName :PRINTABLE:'www.pingwin.cert.pl' emailAddress :IA5STRING:'ziutus@www.pingwin.wirt.pl' Certificate is to be certified until May 29 05:57:41 2004 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated CA verifying: server.crt <-> CA cert server.crt: OK
Po wykonaniu tego polecenia w pliku server.crt znajdzie się podpisany certyfikat.
Stworzenie samo podpisanego certyfikatu
Często możemy sami podpisać sobie certyfikat, wtedy można wszystko rozwiazać jedna komenda, np (podmieniajac katalog i nazwe pliku):
openssl req -new -x509 -days 365 -nodes -out /etc/ssl/webserver/apache.pem -keyout /etc/ssl/webserver/apache.key
Oglądanie własności certyfikatów
Oglądanie klucza
openssl rsa -noout -text -in server.key
Oglądanie requestu
openssl req -noout -text -in server.csr
Oglądanie certyfikatu
openssl x509 -noout -text -in server.crt
Modyfikacje certyfikatów
Usunięcia hasła certyfikatu
cp server.key server.key.org openssl rsa -in server.key.org -out server.key chmod 400 server.key
Zmiana hasła certyfikatu
$ openssl rsa -des3 -in server.key -out server.key.new $ mv server.key.new server.key
Korzystanie z skryptów pomocniczych
W katalogu /usr/lib/ssl/misc znajduje się kilka przydatnych skryptów pozwalających zautomatyzować tworzenie nowych certyfikatów. Jednym z nich jest CA.pl.
Wykorzystanie skryptu CA.pl
Tworzenie nowego certyfikatu CA
Nowy certyfikat CA tworzymy wydając proste polecenie CA.pl z parametrem -newca
[root@localhost ssl]# /usr/lib/ssl/misc/CA.pl -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key ...................................................++++++ ................................++++++ writing new private key to './demoCA/private/cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:PL State or Province Name (full name) [Some-State]:Lodz Locality Name (eg, city) []:Lodz Organization Name (eg, company) [Internet Widgits Pty Ltd]:XSoft Organizational Unit Name (eg, section) []:Dzial Linuksowy Common Name (eg, YOUR name) []:www.pingwin.wirt.pl Email Address []:admin@www.pingwin.wirt.pl
Tworzenie certyfikatu strony
Wygenerujemy teraz prośbę o podisanie certyfikatu:
/usr/lib/ssl/misc/CA.pl -newreq
W wyniku tego powstanie plik w bieżącym katalogu o nazwie newreq.pem. Zawierać będzie on prywatny klucz serwera (który nam za moment się przyda) oraz prośbę o podpisanie tego klucza.
Teraz prośbę tą należy podpisać:
/usr/lib/ssl/misc/CA.pl -sign
Podpisany certyfikat wraz z jego opisem będzie znajdował się w bieżącym katalogu w pliku newcert.pem.
Pozostaje nam przekopiować nam certyfikat serwera do pliku certyfikatu wymaganego przez program oraz klucz serwera do pliku klucza serwera. Przykładowo dla serwera Apache2 w dystrybucji Mandrake należy klucz dla niego umieścić w pliku /etc/ssl/apache/sever.key a certyfikat w pliku /etc/ssl/apache/server.crt
Certyfikaty klienckie – krótko
/usr/lib/ssl/misc/CA.pl -newreq /usr/lib/ssl/misc/CA.pl -sign openssl pkcs12 -export -in newcert.pem -inkey newreq.pem \ -certfile demoCA/cacert.pem -name "Name" -out newcert.p12
SSL i Apache2.x
Twórcy Apache 2.x opracowali skrypt pozwalający za jednym zamachem stworzyć samopodpisany certyfikat SSL. Skrypt ten nazywa się gentestcrt.sh i najduje się w katalogu /usr/lib/ssl/apache2-mod_ssl
SSL i dovecot
Pakiet dovecot zawiera prosty skrypt mający znacznie ułatwić konfigurację pakietu z certyfikatami SSL. Należy napierw wyedytować plik konfiguracyjny /etc/pki/dovecot/dovecot-openssl.cnf.
Następnie należy użyć skryptu mkcert.sh (przykładowa lokalizacja /usr/share/doc/dovecot-1.0.7/examples), który utworzy certyfikaty.
[root@centos examples]# ./mkcert.sh Generating a 1024 bit RSA private key .............................++++++ ....++++++ writing new private key to '/etc/pki/dovecot/private/dovecot.pem' ----- subject= /C=PL/ST=Lodz/L=Lodz/O=LinuxExpert.PL/OU=servers/CN=*.linuxexpert.pl/emailAddress=admin@linuxexpert.pl SHA1 Fingerprint=98:34:4D:C2:AD:D7:77:0D:92:72:ED:0A:BD:6D:33:42:6B:A1:A4:23
Stunnel
Przy instalacji programu stunnelw wersji 4.04 można zauważyć, iż skrypt instalacyjny wykonuje (lub próbuje wykonać) następujące polecenie:
openssl req -new -x509 -days 365 -nodes \ -config /usr/share/doc/stunnel-4.04/stunnel.cnf \ -out /etc/ssl/stunnel/stunnel.pem -keyout /etc/ssl/stunnel/stunnel.pem
Użyty tutaj plik konfiguracyjny (przy opcji -config) ma postać:
# create RSA certs - Server RANDFILE = stunnel.rnd [ req ] default_bits = 1024 encrypt_key = yes distinguished_name = req_dn x509_extensions = cert_type [ req_dn ] countryName = Country Name (2 letter code) countryName_default = PL countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Stunnel Developers Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = 0.commonName = Common Name (FQDN of your server) 0.commonName_default = localhost # To create a certificate for more than one name uncomment: # 1.commonName = DNS alias of your server # 2.commonName = DNS alias of your server # ... # See http://home.netscape.com/eng/security/ssl_2.0_certificate.html # to see how Netscape understands commonName. [ cert_type ] nsCertType = server
Po wykonaniu polecenia zaprezentowanego powyżej nastąpi procedura generacji certyfikatu oraz klucza za jednym zamachem zgodnie z plikiem ustawień. Pozwala to uzyskać jeszcze prostszy sposób tworzenia certyfikatów :).
Dokumentacja w sieci
Więcej informacji na temat SSLa OpenSSLa i tworzenia certyfikatów znajdziesz na stronach:
- http://www.openssl.org/ strona projektu OpenSSL
- http://home.netscape.com/eng/security/ssl_2.0_certificate.html Opis jak Netscape traktuje Common Name
- http://www.drh-consultancy.demon.co.uk/pkcs12faq.html Znajdziesz tutaj sposób generowania kluczy SSL dla klienta
- http://httpd.apache.org/docs-2.0/ssl/ssl_faq.html Tutaj znajdziesz opis generowania certyfikatów SSL dla serwera Apache.