Как создавать сертификаты используя OpenSSL?

Создание SSL/TSL центра сертификации

Для генерации сертификатов необходимо для начала создать центр сертификации. Для его создания потребуется пакет OpenSSL, который входит в большинство современных дистрибутивов. В состав пакета входит и простенький скрипт CA.pl, который значительно облегчит нам процессы создание центра сертификации и генерации ключей. Кстати, если у вас все таки появится желание провести все процедуры вручную, используя только команду openssl, то вам поможет хорошая статья на эту тему: https://help.ubuntu.com/community/OpenSSL

  1. Для начала определяемся с месторасположением хранилища нашего центра сертификатов. дабы уберечь его от случайной порчи во время обновлений операционной системы рекомендуется не размещать его в каталоге с настройками OpenSSL - /etc/ssl/. Для простоты мы долго думать не будем и создадим каталог для хранилища в домашнем каталоге рута:
    # mkdir ~/CA.ldap
    # cd ~/CA.ldap
    
  2. Создаем инфраструктуру хранилища:
    # /usr/lib/ssl/misc/CA.pl -newca
    CA certificate filename (or enter to create)
    
    Первым делом у нас запросят имя файла файла для CA. Ничего не вводим, просто жмем Enter. Далее запрашивается пароль для нашего хранилища:
    ldap:~/CA.ldap# /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:
    
    Хранилище крайне рекомендуется запаролить и не забывать этот пароль - без него вы ничего не сделаете. Любая операция с хранилищем будет сопровождаться запросом этого пароля. После ввода пароля запросится информация о вашей организации:
    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]:RU
    State or Province Name (full name) [Some-State]:Khabarobsk region
    Locality Name (eg, city) []:Komsomolsk-on-Amur
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Solnce
    Organizational Unit Name (eg, section) []:IT-Department
    Common Name (eg, YOUR name) []:Vitaly Druzhinin
    Email Address []:VitalkaDrug@gmail.com
    
    Далее начнется процедура генерации запроса для получения сертификата хранилища. Другими словами, CA.pl собирается сгенерировать сертифкат, который будет сертификатом самого хранилища. Для этого ему необходимо пердварительно создать запрос на генерацию сертификата (и здесь ничего не поделаешь, такая уж технология - сертифкат генерируется только в ответ на его запрос). Нам необходимо указать пароль запроса и имя компании, от которой посылается запрос. Так-же в процессе генерации у нас будет запрошен пароль хранилища. Если пароль введен корректно, то CA.pl сгенерирует новый сертификат хранилища и отобразит данные о нем на экране.:
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:gfhfpbn
    An optional company name []:Solnce
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number:
                96:61:0a:56:57:c2:16:b8
            Validity
                Not Before: Apr 22 03:51:47 2010 GMT
                Not After : Apr 21 03:51:47 2013 GMT
            Subject:
                countryName               = RU
                stateOrProvinceName       = Khabarobsk region
                organizationName          = Solnce
                organizationalUnitName    = IT-Department
                commonName                = Vitaly Druzhinin
                emailAddress              = VitalkaDrug@gmail.com
            X509v3 extensions:
                X509v3 Subject Key Identifier:
                    C2:75:9C:0C:81:14:22:53:E0:02:C7:24:E4:6E:95:29:7E:E0:8F:5D
                X509v3 Authority Key Identifier:
                    keyid:C2:75:9C:0C:81:14:22:53:E0:02:C7:24:E4:6E:95:29:7E:E0:8F:5D
                    DirName:/C=RU/ST=Khabarobsk region/O=Solnce/OU=IT-Department/CN=Vitaly Druzhinin/emailAddress=VitalkaDrug@gmail.com
                    serial:96:61:0A:56:57:C2:16:B8
    
                X509v3 Basic Constraints:
                    CA:TRUE
    Certificate is to be certified until Apr 21 03:51:47 2013 GMT (1095 days)
    
    Write out database with 1 new entries
    Data Base Updated
    

Все! Мы создали новое хранилище сертификатов. Теперь можно спокойно генерировать сертификаты, которые потом будут использоваться клиентами.

Создание запроса на сертификат

Создание сертификата - это процедура, состоящая из двух этапов: генерация запроса на цифровой сертификат и подпись запроса с помощью цифровой подписи хранилища сертификатов. Во время генерации запроса на цифровой сертификат мы указываем информацию, которую надеемся увидеть в итоговом цифровом сертификате. Как и в случае с созданием цифрового хранилища эту процедуру можно выполнить командой openssl, а можно используя скрипт-помощник CA.pl. Продолжим использовать второй вариант. В процессе у нас будут запрошены пароль на файл запроса - это новый пароль, которым клиент должен подписывать свой запрос (потому как обычно эту процедуру выполняет клиент самостоятельно smile ), реквизиты клиента (страна, провинция и т.п.):
# cd ~/CA.ldap
# /usr/lib/ssl/misc/CA.pl -newreq
Generating a 1024 bit RSA private key
.......................................++++++
...........++++++
writing new private key to 'newkey.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]:RU
State or Province Name (full name) [Some-State]:Khabarovsk region
Locality Name (eg, city) []:Komsomolsk-on-Amur
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Solnce
Organizational Unit Name (eg, section) []:IT-Department
Common Name (eg, YOUR name) []:solnce.ru
Email Address []:VitalkaDrug@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
Во время процедуры особое внимание следует обратить на атрибут Common Name, указываемый в запросе. Для большиства сервисов крайне важно что-бы там фигурировало доменное имя сервера, которому данный сертификат будет выдан. При работе с таким сервером клиент будет проверять соответствие реального доменного имени сервера тому, которое прописано в атрибуте Common Name предъявляемого им сертификата! Дополнительные (extra) поля (chakkenge password и optional company name) при генерации запроса обычно не используются, оставляем их пустыми.

В результате в каталоге хранилища у нас получится два файла:
  • newreq.pem. Содержит представление нашего запроса закодированное по методу base64.
  • newkey.pem. Содержит закрытый ключ, так-же закодированный по base64.

Подпись запроса на сертификат

Запрос сертификата содержит все информацию для сертификата, но он не подписан цифровой подписью хранилища. Для превращения запроса в сертификат необходимо его подписать:
# cd ~/CA.ldap
# /usr/lib/ssl/misc/CA.pl -signreq
Первым делом у нас запросится пароль на выполнение операций с хранилищем, и если мы укажем его правильно - выдастся информация о новом запросе с предложением его подписать:
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            96:61:0a:56:57:c2:16:b9
        Validity
            Not Before: Apr 22 05:20:52 2010 GMT
            Not After : Apr 22 05:20:52 2011 GMT
        Subject:
            countryName               = RU
            stateOrProvinceName       = Khabarovsk region
            localityName              = Komsomolsk-on-Amur
            organizationName          = Solnce
            organizationalUnitName    = IT-Department
            commonName                = solnce.ru
            emailAddress              = VitalkaDrug@gmail.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                CC:46:AF:03:8B:5E:39:46:F4:8F:CF:CD:26:F6:27:D5:38:63:09:40
            X509v3 Authority Key Identifier:
                keyid:C2:75:9C:0C:81:14:22:53:E0:02:C7:24:E4:6E:95:29:7E:E0:8F:5D

Certificate is to be certified until Apr 22 05:20:52 2011 GMT (365 days)
Sign the certificate? [y/n]:
Согласившись на подпись далее подтверждаем что данные необходимо сохранить в хранилище:
Certificate is to be certified until Apr 22 05:20:52 2011 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
Signed certificate is in newcert.pem
Готово! В результате создается новый файл newcert.pem, который содержит подписанный сертификат.

В итоге мы имеем файлы:
  • newreq.pem - использованный файл запроса. Его можно (и нужно!) удалить
  • newkey.pem - закрытый ключ
  • newcert.pem - подписанный сертификат

Удаление пароля на закрытый ключ

В процессе генерации запроса мы указывали пароль (pass phrase) для сертификата. Соответственно, закрытый ключ newkey.pem был зашифрован с использованием этого пароля. Если мы будем использовать зашифрованный ключ , то при каждом старте сервис, использующий сертификат, будет запрашивать пароль. Для сервиса, который должен стартовать на полном автомате, это не является нормальным. Поэтому мы проведем процедуру удаления пароля из файла-ключа:
# cd ~/CA.ldap
# openssl rsa < newkey.pem > clearkey.pem
Enter pass phrase:
writing RSA key
Теперь у нас есть ключ, который можно использовать для автоматического старта сервисов.

-- VitalyDruzhinin - 2010-04-28
Topic revision: r1 - 2013-08-29, VitalyDruzhinin
 

This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback