Главная Зерно Пингвин Колибри Сириус Ромашка


Настройка

Создаём собственный CA и подписываем им SSL сертификаты для своих ресурсов

В этой заметке в деталях описывается процесс создания собственного Центра сертификации и последующая генерация сопутствующих файлов: сертификатов, запросов на сертификат и так далее. Считаем, что работаем в терминале на линукс/юникс машине с установленным openssl.

Коротко о главном

Удостоверяющий центр (по-английски Certification authority, сокращённо CA) — это единый центр генерации цифровых сертификатов. У конечных клиентов (например, веб-браузеров) имеется база публичных ключей разных CA и они проверяют ими приходящие, например, от сайтов сертификаты. Нас интересуют сертификаты, используемые в сеансах, защищённых протоколом SSL/TLS.

Собственно, всю процедуру можно разбить на такие шаги:

генерим приватный ключ (сильно случайный набор байтов);
генерим на основе приватного ключа пару сертификатов для CA (публичный и приватный);
генерим пару сертификатов для домена, подписанных созданным на прошлом шаге CA.

Создаём CA

Для начала сгенерим приватный ключ (файл ca.key), в процессе вводим пароль (запоминаем его, нам он дальше понадобится; если вы хотите создать ключ без пароля, просто уберите из команды аргумент -des3):

$ openssl genrsa -des3 -out ca.key 4096

Теперь сгенерим пару сертификатов для нашего CA (вместо 365 можно подставить любое другое значение, это срок годности пары сертификатов в днях):

$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt

Вводим пароль к ключу и затем аккуратно заполняем поля субъекта (subject). По этим данным можно будет потом идентифицировать публичный сертификат среди списка других, например. На выходе получаем файл ca.crt — это публичный сертификат нашего CA.

Можно создать ключ и сертификат одной командой, причём в эту же команду можно включить параметры субъекта:

$ openssl req -x509 -newkey rsa:2048 -keyout ca.key -nodes -out ca.crt -subj ’/CN=example.com/L=Novosibirsk/C=RU’

К сожалению, эта команда генерит невалидный ключ. Openssl его понимает корректно, однако другие программы могут его не принять. Решается это такой командой (мы просто считываем и снова записываем файл):

$ openssl rsa -in ca.key -out ca.key

Содержимое параметра -subj состоит из сегментов вида /$KEY=$VALUE, где $KEY может принимать такие значения:
  • L — locality, обычно это город
  • ST — state, обычно это регион, область, район и т.д.
  • C — country, двухбуквенный код страны, например, RU или US
  • O — organization, название организации
  • OU — organization unit, отдел в организации
  • CN — common name, обычно это адрес веб-сайта
  • emailAddress — email
Создаём пару сертификатов для домена

Итак, у нас есть некий домен (к примеру, example.com) и мы хотим выписать для него SSL-сертификат, подписанный только что созданным CA. Сертификат дальше использовать в браузере. Шаги примерно такие же, как и в случае создания CA:

создаём отдельный приватный ключ (нужен новый приватный ключ, тот, нельзя использовать тот, который мы делали для CA);
создаём Certificate signing request, который потом нужно отправить CA;
со стороны CA генерим сертификат на основе Certificate signing request;
устанавливаем полученный сертификат на сервер.

Итак, генерим ключ (в процессе вводим пароль, желательно отличный от пароля, использованного для генерации ключа CA):

$ openssl genrsa -des3 -out server.key 4096

Если не хотим шифровать ключ, то опускаем параметр -des3:

$ openssl genrsa -out server.key 4096

Приватный ключ хранится на стороне владельца сервера и не должен никогда никому отдаваться. На базе приватного ключа server.key генерится так называемый запрос на подпись сертификата (по-английски certificate signing request (csr)), в запросе заполняются параметры субъекта (имя, адрес, домены итп), затем этот файл отправляется CA и тот подписывает его своим приватным ключом, в результате получаем публичный сертификат.

Вот простейший способ создать csr:

$ openssl req -new -key server.key -out server.csr

В процессе работы нужно ответить на несколько вопросов (страна, город, имя домена итп), в результате получится csr-файл, который можно отправлять CA. Однако у такого способа есть несколько существенных недостатков — запрос данных идёт по заранее заданному шаблону, в который не входят некоторые важные поля, например, subjectAltName (это расширение для включения нескольких DNS-имён в сертификат).

Единственный мне известный способ указать расширение subjectAltName — это воспользоваться собственным конфигом для openssl. Вот, например, таким:

###############################################
# Remaining options below should not be edited
###############################################

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_ext

[ req_distinguished_name ] countryName = Country Name (2 letter code)
countryName_default = RU
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Russia
localityName = Locality Name (eg, city)
localityName_default = Irkutsk
organizationName = Organization Name (eg, company)
organizationName_default = Example, Co.
commonName = Common Name (eg, YOUR name or FQDN)
commonName_max = 64

[ req_ext ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

###############################################
# Edit this line to set subjectAltName contents
###############################################
subjectAltName = DNS:example.com, DNS:www.example.com, DNS:example.net

Сохраните его в файл openssl-csr.cnf и отредактируйте (нужно прописать в поле subjectAltName свои домены, если вы в конфиге openssl разбираетесь, то можно и другие опции изменить/добавить), после чего выполните вот такую команду:

$ openssl req -new -key server.key -config openssl-csr.cnf -reqexts req_ext -out server.csr

Полученный файл server.csr теперь нужно «отправить» CA, чтобы там его подписали. Поскольку CA наш собственный, то подписывать будем сами. И здесь тоже есть нюанс, связанный с X509v3-расширениями — команда создания сертификата по умолчанию не включает расширения, указанные в csr (то есть указанные в csr значения для subjectAltName в сертификат не попадут). Мы пойдём по самому простому пути — будем использовать тот же конфиг (openssl-csr.cnf), что и для генерации csr, из него нам понадобится только секция [ req_ext ]:

$ openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -extfile openssl-csr.cnf -extensions req_ext -in server.csr -out server.crt

В данном случае «срок годности» сертификата устанавливаем в один год (365 дней).

Теперь у нас есть практически полный комплект всех нужных сертификатов. Иногда в сервере нужно использовать незашифрованный ключ, вот как его можно вытащить в файл server.key.insecure, если в server.key лежит зашифрованный ключ:

$ openssl rsa -in server.key -out server.key.insecure

Для удобства использования можно немного переименовать файлы:

$ mv server.key server.key.secure
$ mv server.key.insecure server.key

Используем сертификаты

Для начала полезные команды, позволяющие «посмотреть» сертификаты и csr:

$ openssl rsa -noout -text -in server.key
$ openssl req -noout -text -in server.csr
$ openssl rsa -noout -text -in ca.key
$ openssl x509 -noout -text -in ca.crt

Теперь нужно положить сгенерированные сертификаты (server.crt и server.key) в нужное место на сервере. Конкретные детали уже выходят за рамки заметки.

Чтобы браузер не ругался на сертификат, нужно добавить в его репозиторий CA только что созданный CA, а именно файл ca.crt, импортируем, смотрим, что в списке он появился. Также можно сертификат положить в общесистемный репозиторий CA-сертификатов.

Источник: blog.regolit.com/

Дополнительная статья

Для публичных сайтов важно использовать SSL сертификаты подтвержденные в специальных центрах сертификации, наиболее известные из них: Comodo, GeoTrust, Rapid SSL, Symantec. Помимо защиты соединения, сертификат выданный удостоверяющим центром дает гарантию, что информация о домене была проверена независимым доверенным источником.

Как и доверительный, самоподписанный сертификат обеспечивает шифрование передаваемых данных между сервером и браузером пользователя. Главный недостаток самоподписанных сертификатов: необходимость подтверждения его в браузере. Для внутреннего использования, если нет необходимости в проверке домена, вполне нормально использовать самоподписанные сертификаты.

Генерируем ключ, в процессе необходимо будет ввести пароль.

openssl genrsa -des3 -out server.key.secure 2048

Расшифруем ключ:

openssl rsa -in server.key.secure -out server.key

Создаем файл сертификата:

openssl req -new -key server.key -out server.csr

В процессе необходимо будет указать информацию о себе.

Перейдем к процессу самоподписания сертификата:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Сертификат готов, для использования необходимо скопировать файлы ключа server.key и сертификата server.crt в необходимую нам директорию.

Дополнительная статья

Иногда возникает необходимость создания самоподписанного SSL-сертификата (для обеспечения надёжного доступа к сервисам интранета и т.п.). Делается это таким образом:

В дальнейшем "server" — условная строка, используйте любую, рекомендуется делать её мнемонической, чтобы она сообщала о том, где и для чего будет использоваться сертификат — например, "example.com-smtp").

1. Создаём ключ (потребуется ввод пароля, введите любой):

openssl genrsa -des3 -out server-tmp.key

2. Если не хочется вводить пароль при запуске сервиса, пароль нужно убрать (примите меры после этого, чтобы доступ к ключу был только у суперпользователя):

openssl rsa -in server-tmp.key -out server.key

3. Создаём файл запроса о подписи (certificate signing request, CSR):

openssl req -new -key server.key -out server.csr

Программа запросит ряд параметров для сертификата, отвечайте примерно таким образом:

Country Name (2 letter code) [GB]:RU
State or Province Name (full name) [Berkshire]:Tmutarakan region
Locality Name (eg, city) [Newbury]:Tmutarakan
Organization Name (eg, company) [My Company Ltd]:FooBar Tmutarakanian
Organizational Unit Name (eg, section) []:Bystronet
Common Name (eg, your name or your server"s hostname) []:example.com
Email Address []:admin@example.com

Please enter the following "extra" attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

В случае "Common Name" необходимо указать доменное имя сервера. Внимание: при настройке сервиса доменное имя должно быть в точности таким же, иначе будет как минимум выдаваться предупреждение о том, что сертификат выдан на другой сервер.

Дополнительные ("extra") параметры можно не вводить (просто нажмите Enter).

4. На этом этапе можно получить сертификат от доверенного источника (платный). Если достаточно самоподписанного (достаточно для нужд интранета), то генерируем сертификат сами:

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

Параметр после "-days" - время годности сертификата в днях, считая от текущего момента. В примере выше мы создаём сертификат, годный в течение примерно 10 лет.

Всё готово. Файл server.key - ключ, файл server.crt - собственно сертификат.

Просмотров: 2157


25 . 04 . 2024