Feel Good.

31 марта 2010

Создаем сертификаты: OpenSSL

Практическая польза данной статьи, научиться быстро начать работу с SSL сертификатами при помощи программы OpenSSL. Разумеется, выпуском сертификатов занимаются специальные центры сертификации, и Вам не стоит задумываться о тонкостях создания сертификатов, тем более в production версии Вы все равно сделаете запрос на сертификат в один из таких центров, но в режиме debug/test, вы можете использовать сертификаты сделанные собственноручно (что мне однажды и потребовалось). Я не буду рассказывать что такое SSL сертификат и для чего он нужен, но для понимания статьи, это необходимо знать. Для лучшего понимания данной статьи, выделим несколько основных этапов:
  1. Скачаем и установим OpenSSL.
  2. Настроим рабочее место.
  3. Выпустим CA сертификат и для него список отозванных сертификатов CRL.
  4. Сделаем запрос на сертификат нашему центру сертификации.
  5. Выпустим сертификат по запросу.
  6. Добавим наши сертификаты в хранилища сертификатов.

1. Скачиваем с сайта последнюю версию OpenSSL, и устанавливаем ее на жесткий диск.

2. Для удобства, добавьте в переменную PATH полный путь к bin директории OpenSSL. Далее, для того чтобы созданные ключи, запросы на сертификат, сертификаты и прочее не были перемешаны в общей куче, я рекомендую создать для себя рабочий каталог mySSL, со следующими подкаталогами:



В нашем случае, C:\mySSL\ является рабочим каталогом, содержащим следующие подкаталоги и файлы:

  • key - каталог с private-ключами
  • csr - каталог запросов на сертификат (Certificate Signing Request)
  • cer - каталог сертификатов, для публичного пользования (Certificate)
  • crl - каталог списков отозванных сертификатов (Certificate Revocation List)
  • p12 - каталог сертификатов p12, с private-ключом(Personal Information Exchange File)
  • database.txt - база данных выпущенных сертификатов
  • serial.txt - файл с текущим серийным номером сертификата
Структура каталогов создана, и как мне кажется, она достаточно удобна для решения данной задачи. Осталось настроить OpenSSL. Для этого, в рабочем каталоге (C:\mySSL\) надо разместить конфигурационный файл openssl.conf, после чего можно приступать к созданию сертификатов.

3. Выпустим собственный CA сертификат, для этого, получим private-ключ для нашего CA сертификата. Это можно сделать выполнив команду:

#openssl genrsa -des3 -out key/ca.key 1024

После чего, создадим CA сертификат, выполнив команду:

#openssl req -config openssl.conf -new -x509 -days 365 -key key/ca.key -out cer/ca.cer -subj "/C=RU/ST=Russia/L=Moscow/O=MyCompany/OU=CA/CN=localhost"

Здесь же создадим список отозванных сертификатов для CA сертификата:

#openssl ca -config openssl.conf -gencrl -out crl/ca.crl

Сделаем экспорт в PKCS12, упаковав приватный ключ и сам CA сертификат:

#openssl pkcs12 -export -in cer/ca.cer -inkey key/ca.key -out p12/ca.p12

4. Наш CA сертификат готов, теперь мы можем приступить к выпуску дочернего SSL сертификата, для этого сделаем запрос на SSL сертификат:

#openssl.exe req -config openssl.conf -new -newkey rsa:1024 -keyout key/test.key -nodes -out csr/test.csr -subj "/C=RU/ST=Russia/L=Moscow/O=MyCompany/OU=IT Departament/CN=localhost"

5. Подтвердим запрос на сертификат нашим CA сертификатом (подпишим серификат нашим CA сертификатом):

#openssl ca -policy policy_any -config openssl.conf -in csr/test.csr -days 360 -out cer/test.cer

Сделаем экспорт в PKCS12 полученного SSL сертификата:

#openssl pkcs12 -export -out p12/test.p12 -in cer/test.cer -inkey key/test.key

6. Для того чтобы добавить наши сертификаты (PKCS12) в хранилище сертификатов надо в консоли управления оснастками(команда mmc) добавить оснастку "Сертификаты" для локальной машины, после чего, импортировать наши сертификаты и список отозванных сертификатов в соответствующие папки (в папку "Личные" и "Доверенные корневые центры сертификации").


Для быстрого развертывания можно скачать итоговый bat-скрипт. Данный скрипт создает структуру каталогов, конфигурационный файл openssl.conf и запускает процесс создания сертификатов.

PS: Берегите файлы с приватными ключами (*.key) и файлы PKCS12 (*.p12), по возможности храните данные файлы на специальных носителях. Доступ к данным файлам должен быть сильно ограничен!
Файлы сертификатов (*.cer) и список отозванных сертификатов (*.crl) созданы специально для публичного доступа, в том числе и для размещения в интернете.
Список отозванных сертификатов (*.crl) должен обновляться как можно чаще.

UPD: После того как необходимость в тестовом CA сертификате пройдет, не забудьте удалить его из списка доверенных сертификатов.

25 комментариев:

  1. Описал 6 простых шагов для создания тестовых SSL сертификатов для отладки своих приложений. Может кому и пригодиться.

    ОтветитьУдалить
  2. Спасибо, очень понятно и внятно!

    ОтветитьУдалить
  3. А как создать контейнер формата PKCS12 так, чтобы в нем хранились 3 сертификата? т.е. чтобы был 1 файл, который при установке устанавливал бы 3 сертификата сразу?

    ОтветитьУдалить
  4. http://stackoverflow.com/questions/4048626/creating-pkcs12-keystore-with-multiple-certificates-using-openssl-1-0-0a

    ОтветитьУдалить
  5. Спасибо, очень помогли.
    У меня такая проблема:
    Я уже умею создать самоподписанный сертификат, и создать сертифика для клиентов, и работать с CRL.
    Скажите мне, пожалуйста, что мне делать с crl-файлом? Его надо опубликовать? Когда считается сертификат потерянным тогда сертификат считается отозванным, и добавиться в CRL. Еще в каких случаев нужно добавить сертификатов в CRL?

    ОтветитьУдалить
  6. Забыл сказать спасибо Вам большое за информацию!

    ОтветитьУдалить
  7. @Телба
    CRL файл должен быть опубликован. Например от может находиться рядом с публичным сертификатом. CRL файл должен всегда поддерживаться в актуальном состоянии. А вообще самоподписанные сертификаты можно использовать только в тестовой(!) среде, а на боевой системе необходимо уже использовать сертификаты от авторизованных центров, которые и отвечают за актуальность CRL.
    В CRL надо добавлять сертификаты, у которых private-ключи перестали быть private (стали доступны злоумышленнику), либо лицо (на которое был выдан сертификат) утратило доверие.

    ОтветитьУдалить
  8. Здравствуйте, Иьля. Как Ваши дела?
    У меня появилось проблема, и вот уже целый день сижу перед компьютером, ищу ответы:
    Команда вот это:
    openssl ca -passin pass:password -policy policy_anything -out "certificate.crt" -infiles "request.csr"

    Using configuration from C:\OpenSSL-Win32\bin\openssl.cfg
    Loading 'screen' into random state - done
    Check that the request matches the signature
    Signature ok
    Certificate Details:
    Serial Number: 1 (0x1)
    Validity
    Not Before: Jan 19 08:05:25 2011 GMT
    Not After : Jan 19 08:05:25 2012 GMT
    Subject:
    countryName = UZ
    commonName = Olim
    emailAddress = somebody@gmail.com
    X509v3 extensions:
    X509v3 Basic Constraints:
    CA:FALSE
    Netscape Comment:
    OpenSSL Generated Certificate
    X509v3 Subject Key Identifier:
    7E:18:DE:4D:8E:B6:45:B1:47:AD:6E:A8:BA:8D:43:12:FA:B3:BE:65
    X509v3 Authority Key Identifier:
    keyid:AA:81:82:D7:DE:2C:2F:69:31:3B:39:9B:F0:88:05:66:99:65:33:E
    2

    Certificate is to be certified until Jan 19 08:05:25 2012 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

    Есть ли способ автоматически отвечать y на вопросы: Sign the certificate? [y/n]: и 1 out of 1 certificate requests certified, commit?
    Спасибо Вам за ответ...

    ОтветитьУдалить
  9. @Телба
    Точный ответ не знаю так как не делал подобного.
    Наверняка проблема решается добавлением дополнительно параметра. Также можно погуглить openssl silent/quiet mode.
    PS: Как найдете решение, если не сложно дайте линк в комментах.

    ОтветитьУдалить
  10. Привет! Пока не смог найти, но все же ищу.

    ОтветитьУдалить
  11. Попробуйте перенаправить ввод используя standard input (stdin).
    Например:
    myapp.exe < commands.in, где commands.in текстовый файл, содержащий то, что вы бы вводили с клавиатуры.

    ОтветитьУдалить
  12. Я так сделал как Вы сказали, теперь все в порядке. Вот код: < Response.txt openssl ca -passin pass:password -policy policy_anything -out telba.crt -infiles telba.csr

    Вот теперь у меня такой вопрос: Думаю, ключ и запрос на получение сертификат должны генерироваться в стороне клиента. Удостоверяющий центр не отвечает секретность приватного ключа клиента. Как генерировать приватный ключ в стороне клиента, может им сначала предлагать программу который генерирует приватный ключ и создающий запрос на получение сертификата?

    ОтветитьУдалить
  13. Посмотрите как генерируют сертификаты известные центры, многие так и предлагают воспользоваться openssl. Еще есть программы (с GUI), помогающие пользователю создать CSR, (например http://technet.microsoft.com/en-us/library/cc728326%28WS.10%29.aspx)

    ОтветитьУдалить
  14. Решил это проблему давно... я не читал Ваш последный ответ. Клиенты сгенерируют пар ключей и запрос с помошью тега . Но не работает в Internet Explorer. Полученный запрос называется запрос в формате SPKAC. OpenSSL может подписывать на запросы в формате SPKAC. На сервер отправится SPKAC, CN, Country, emailadress and others.

    ОтветитьУдалить
  15. Не знал про SPKAC, спасибо за наводку, если возникнет похожая задача, то буду знать куда копать.

    ОтветитьУдалить
  16. У меня тут опять возникли ряд вопросов по вышеуказанному созданию сертификатов :)
    1. для чего прописан в конфиге рандом файл хоть его и нету в директории?
    2. при создании дочернего сертификата у меня в директории cer добавился файл 01.pem - для чего он и что с ним делать?
    3. при создании ключа для дочернего сертификата пасс не был запрошен, так и должно быть?
    4. получается ведь необязательно создавать приват ключи и запрос на самом клиенте, можно ведь все проделать на сервере и передать клиенту файл pkcs12 и пароли)) или не так :)

    ОтветитьУдалить
  17. 1. Точно не помню, но его можно найти в корне или в папке с openssl. Это чисто служебный файл, хранит seed для rand, и его иногда называют .rand, для того чтобы он был скрытым в unix.

    2. http://en.wikipedia.org/wiki/X.509 секция про PEM.

    3. Можно сделать так, чтобы запрашивал (как бы дополнительная защита ключа), а можно оставить как есть. Просто хранить ключ для CA в открытом виде рискованно.

    4. Можно, если клиент доверяет серверу и каналу передачи пароля с ключами.

    ОтветитьУдалить
  18. А как создать контейнер формата PKCS12 так, чтобы в нем хранились 3 клиентских сертификата? т.е. чтобы был 1 файл, который при установке устанавливал бы 3 клиентских сертификата сразу?
    Я прочитал, и воспользовался этой ссылкой, но она не помогла в моем случае:
    http://stackoverflow.com/questions/4048626/creating-pkcs12-keystore-with-multiple-certificates-using-openssl-1-0-0a

    ОтветитьУдалить
  19. @Nurlan
    Этот вопрос здесь уже задавали выше, честно говоря у меня нет на него четкого ответа, ну кроме той ссылки.

    ОтветитьУдалить
  20. Вопрос у меня на сервере для клиентов закончился файлик home.crt по вашей инструкции я не увидел как его сделать ?

    ОтветитьУдалить
  21. Здравствуйте!

    Вроде все сделал, так сказать "по инструкции", но почему-то на этом шаге:

    "5. Подтвердим запрос на сертификат нашим CA сертификатом (подпишим серификат нашим CA сертификатом):

    #openssl ca -policy policy_any -config openssl.conf -in csr/test.csr -days 360 -out cer/test.cer"

    У меня получается ошибка: unable to load number from serial.txt
    error while loading serial number

    ОтветитьУдалить
  22. Проблема была решена - добавил номер 100001 в файл serial.txt.

    ОтветитьУдалить
  23. Здравствуйте. У меня проблема с подтверждением дочернего сертификата ..ошибка: 4108:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:.\
    crypto\evp\evp_enc.c:539:
    4108:error:0906A065:PEM routines:PEM_do_header:bad decrypt:.\crypto\pem\pem_lib.
    c:483:

    ОтветитьУдалить
  24. Эм ... Слабо объяснить, как устанавливается OpenSSL для Windows?

    ОтветитьУдалить
  25. Добрый день, подскажите, пожалуйста что нужно сделать если я хочу подписать сертификат, скажем, SHA-2? И вопрос по поводу получения private ключа - что если необходим pass phrase в каком месте при генерации его можно задать?

    ОтветитьУдалить