Wystawca certyfikatów - CA w OpenSSL
Infrastruktura PKI jest bardzo ważnym elementem systemów bezpieczeństwa. Szczególne znaczenie ma w Internecie. Certyfikaty dla stron WWW powinny być podpisane przez wystawców, których certyfikaty są zaufane w popularnych przeglądarkach internetowych. Niemniej jednak taki certyfikat kosztuje i do celów testowych dobrze jest stworzyć własne CA. Może ono też posłużyć w niewielkiej infrastrukturze PKI nie związanej z Internetem. W tym poście pokażę jak stworzyć własne CA przy pomocy OpenSSL, oraz podpisać nim certyfikaty.
Przechodzimy do katalogu gdzie chcemy utworzyć CA.
Tworzymy strukturę katalogów dla CA: CA.pl -newca
- na systemie Linux skrypt znajduje się zwykle pod ścieżką: /etc/ssl/misc/CA.pl -newca
- w Cygwin skrypt znajduje się pod ścieżką: /usr/ssl/misc/CA.pl -newca
Wypełniamy informacje dla certyfikatu CA. Na przykład tak:
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]:Silesia
Locality Name (eg, city) []:Gliwice
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Zacheusz Siedlecki CA
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
c1:cf:13:18:8b:2a:ba:b9
Validity
Not Before: Nov 22 14:57:00 2008 GMT
Not After : Nov 22 14:57:00 2011 GMT
Subject:
countryName = PL
stateOrProvinceName = Silesia
organizationName = My Organization
commonName = Zacheusz Siedlecki CA
X509v3 extensions:
X509v3 Subject Key Identifier:
30:8C:D5:B8:46:04:FB:75:25:C6:EE:9B:C6:6A:AD:EF:06:C8:15:56
X509v3 Authority Key Identifier:
keyid:30:8C:D5:B8:46:04:FB:75:25:C6:EE:9B:C6:6A:AD:EF:06:C8:15:56
DirName:/C=PL/ST=Silesia/O=My Organization/CN=Zacheusz Siedlecki CA
serial:C1:CF:13:18:8B:2A:BA:B9
X509v3 Basic Constraints:
CA:TRUE
Certificate is to be certified until Nov 22 14:57:00 2011 GMT (1095 days)
Write out database with 1 new entries
Data Base Updated
Przekonwertujemy jeszcze certyfikat CA do popularnego formatu używanego miedzy innym przez Windows i Javę:
openssl x509 -in ./demoCA/cacert.pem -inform PEM -out cacert.crt -outform DER
Teraz już mamy przygotowanego wystawcę certyfikatów. Wygenerujemy przy jego pomocy dwa certyfikaty - dla serwera i dla klienta.
Generujemy klucz, oraz żądanie podpisu dla klienta:
$ openssl req -new -out serverreq.pem -keyout serverkey.pem
Generating a 1024 bit RSA private key
..........................++++++
.++++++
writing new private key to 'serverkey.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]:Silesia
Locality Name (eg, city) []:Gliwice
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:localhost
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Jako Common Name wpisujemy nazwę naszego hosta.
Klucz klienta znajduje się w pliku serverkey.pem a żądanie serverreq.pem
Podpisujemy klucz naszym CA: $ openssl ca -in serverreq.pem -out servercert.pem
Using configuration from /usr/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
c1:cf:13:18:8b:2a:ba:ba
Validity
Not Before: Nov 22 17:30:00 2008 GMT
Not After : Nov 22 17:30:00 2009 GMT
Subject:
countryName = PL
stateOrProvinceName = Silesia
organizationName = My Organization
commonName = Server
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
06:31:D5:91:B4:D9:8A:1E:73:13:05:9B:CF:D9:AD:5D:56:E1:29:0C
X509v3 Authority Key Identifier:
keyid:30:8C:D5:B8:46:04:FB:75:25:C6:EE:9B:C6:6A:AD:EF:06:C8:15:56
Certificate is to be certified until Nov 22 17:30:00 2009 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
W pliku servercert.pem znajduje się nasz nowy certyfikat serwera. Klucz i certyfikat serwera umieszczamy w zbiorze PKCS#12 pod aliasem server
openssl pkcs12 -export -in servercert.pem -inkey serverkey.pem -out server.p12 -name server
Tak samo wytwarzamy certyfikat i klucze klienta (wypisuję tylko kolejne polecenia):
$ openssl req -newkey rsa:1024 -out clientreq.pem -keyout clientkey.pem
$ openssl ca -in clientreq.pem -out clientcert.pem
$ openssl pkcs12 -export -in clientcert.pem -inkey clientkey.pem -out client.p12
Parametr -newkey rsa:1024 oznacza, że został utworzony klucz RSA 1024.
Mamy teraz zestaw plików w uniwersalnych formatach:
- cacert.cer certyfikat CA w formacie DER
- server.p12 klucz i certyfikat serwera w formacie PKCS#12
- client.p12 klucz i certyfikat klienta w formacie PKCS#12
Wkrótce pokażę również jak można takie pliki wykorzystać.
Komentarze
2 komentarzy do “Wystawca certyfikatów - CA w OpenSSL”
Chcesz coś napisać?
No, całkiem ciekawy poradnik,
kiedyś korzystałem z tego rozwiązania.
Obecnie testuję DogTag (http://pki.fedoraproject.org/wiki/PKI_Main_Page)
w większości oparte na Tomcacie i bibliotekach JSS (javowe dowiązania
do NSS Mozilli - również z obsługą kart kryptograficznych i urządzeń
klasy HSM).
Widziałem, że projektowałeś system GINA,
miałem przyjemność testować komponent pGina,
udało mi się na przykład połączyć uwierzytelnianie SSH
ze zintegrowanym uwierzytelnianiem Windows (można
również łączyć z uwierzytelnianiem do domeny).
- dałem uwierzytelnianie mieszane na wszelki wypadek,
jakby serwery SSH odmówiły posłuszeństwa.
@Karol: DogTag wygląda ciekawie, choć to już większe rozwiązanie bardziej produkcyjne niż developersko -testowe. OpenSSLa warto używać żeby po prostu wygenerować parę certyfikatów do testów. Zwłaszcza że na przykład u mnie w pracy wcale nie jest łatwo o serwer z Fedorą ;)