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ć.

Zacheusz Siedlecki

Komentarze

2 komentarzy do “Wystawca certyfikatów – CA w OpenSSL”

  1. Karol on August 13th, 2010 9:35 pm

    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.

  2. Zacheusz Siedlecki on August 15th, 2010 1:45 pm

    @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ą ;)

Chcesz coś napisać?





*