- Генерация CSR
- 1.1 Установка SSL-сертификата для pound
- 1.2 Установка SSL-сертификата для nginx
- 1.3 Установка SSL-сертификата для apache
- 1 Дешифровка csr-файлов
- 2 Генерация CSR
- 2.1.1 С созданием ключа
- 2.1.2 С предварительно созданным ключом
- 2.2.1 С созданием ключа
- 2.2.2 С предварительно созданным ключом
- 3 Генерация самоподписного сертификата
- 3.1.1 С созданием ключа
- 3.1.2 С предварительно созданным ключом
- 3.2.1 С созданием ключа
- 3.2.2 С предварительно созданным ключом
- Firefox
- Mac os x
- Macos — chrome и safari
- Nginx
- Windows
- Windows 10 — chrome, ie11 и edge
- В ubuntu
- Генерация сертификатов ssl / tls
- Генерация сертификатов с использованием cfssl и cfssljson
- Генерация сертификатов с использованием openssl
- Доверие к сертификатам
- Использование сертификата
- Источник сертификата (certificate authority)
- Как выпустить самоподписанный ssl сертификат и заставить ваш браузер доверять ему
- Программа сервера на go
- Процесс создания сертификата сервера
- Рабочий процесс создания сертификата
- Сертификат доменного имени
- Создаем наше ca
- Создаем сертификат подписаный нашим са
- Создайте сертификат ca и его ключ
- Установите cfssl и cfssljson на linux
- Заключение
Генерация CSR
Если ваш домен хоститься на godaddy серверах, то заморочек с продлением и покупкой сертификатов не будет. В моем случаи домен хоститься на серверах нашей фирмы, в связи с чем нужно генерировать csr(certificate signing request).Certificate signing request – это файлик, который являет собой запрос на получение сертификата и содержит в закодированном виде нужную для центров сертификации информацию и открытый (публичный) ключ.
Для генерации csr нужен закрытый(приватный) ключ, который генерируется на стороне сервера, где будет устанавливаться сертификат конкретного домена. Длина ключа должна быть не менее 2048 bit.Приступаем к генерации приватного ключа. Для этого будем использовать, обновленный после фикса Heartbleed уязвимости, openssl.
1.1 Установка SSL-сертификата для pound
Для pound нам нужно сгенерировать pem ключ, который состоит из промежуточного сертификата, нашего подписанного сертификата и секретного ключа.
1.2 Установка SSL-сертификата для nginx
Для nginx нам нужно сгенерировать crt файлик, который состоит из промежуточного сертификата и нашего подписанного сертификата (из двух файлов, которые били в скаченном архиве).
1.3 Установка SSL-сертификата для apache
Для генерации SSL ключа под apache вообще не нужно делать никаких лишних движений, просто прописать пути к приватному ключу, промежуточному и нашему подписанному сертификате в настройках виртуального хоста apache.
1 Дешифровка csr-файлов
Если продлеваете сертификат и забыли, какие данные вводили при генерации csr, можно использовать openssl для просмотра информации о старом сертификате.
2 Генерация CSR
Когда имеется много разных доменов и нужно часто создавать SSL ключи – интерактивный режим становиться выносом мозга и потерянным временем. Openssl позволяет генерировать csr запрос не только в интерактивном режиме. Наведу пару дополнительных способов генерации csr-файла.
2.1.1 С созданием ключа
Генерация csr-файла и ключа в интерактивном режиме одной командой без запроса на ввод пароля(с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
2.1.2 С предварительно созданным ключом
Генерация csr-файла на основе предварительно созданного ключа в интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
2.2.1 С созданием ключа
Генерация csr-файла и ключа в не интерактивном режиме одной командой без запроса на ввод пароля(с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
2.2.2 С предварительно созданным ключом
Генерация csr-файла на основе предварительно созданного ключа в не интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
3 Генерация самоподписного сертификата
Когда нужно тестировать SSL для какого-то локального сайта, можно использовать самоподписний сертификат, который позволит вам полноценно тестировать SSL, но будут вылазить сообщения, что сайт является не доверенным (сертификат липовый).
3.1.1 С созданием ключа
Генерация самоподписного сертификата с приватным ключом в интерактивном режиме, т.е. нужно будет вводит всю csr информацию без запроса на ввод пароля (с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ
3.1.2 С предварительно созданным ключом
Генерация самоподписного сертификата на основе предварительно созданного ключа в интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
3.2.1 С созданием ключа
Генерация самоподписного сертификата с приватным ключом в не интерактивном режиме без всяких вопросов и запроса на ввод пароля (с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
3.2.2 С предварительно созданным ключом
Генерация самоподписного сертификата на основе предварительно созданного ключа в не интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
Firefox
Даже после того, как вы установите доверенный источник сертификата в хранилище, Firefox все равно будет выдавать предупреждения. Этого может не случиться в Windows 10, но почти наверняка случится в macOS. Справиться с этим достаточно просто. Firefox демонстрирует вот такой экран:
Чтобы добавить разрешения сертификату, кликните «Дополнительно…». Сразу же после этого кликните на «Принять риск и продолжить», чтобы дать понять, что вы знаете о риске.
Это нужно сделать всего один раз, но для каждого локального домена.
Mac os x
Safari, FireFox, Chrome — используют системный репозиторий.
Запускаем KeyChain Access.Идём в меню File — Import Items (login или System) — выбираем файл rootCA.crt.Когда нас спросят, отвечаем — Always Trust.
Для вашего личного Safari достаточно выбрать login.
Macos — chrome и safari
1. Дважды кликните на корневом сертификате (ca.crt).
2. Выберите нужную связку ключей [keychain] (login, если вы хотите, чтобы сертификат считался доверенным только в вашем аккаунте, или System, если сертификат должен считаться доверенным во всей системе).
3. Добавьте сертификат.
4. Откройте «Keychain Access» (если еще не открыт).
5. Выделите keychain, который выбрали раньше.
6. Вы должны увидеть сертификат MY-CA (это будет имя, которое вы, как CN, дали вашему источнику сертификата).
7. Дважды кликните по сертификату.
8. Разверните «Доверять» и выберите опцию «Доверять всегда» в пункте «При использовании этого сертификата».
9. Закройте окно сертификата и введите свой пользовательский пароль (если требуется).
Nginx
server {
listen 443;
ssl on;
ssl_certificate /path/to/localhost.crt;
ssl_certificate_key /path/to/localhost.key;
...
}Windows
IE, Chrome — используют репозиторий сертификатов Windows.
Мой путь к нему таков:
Chrome — Settings — Manage Certificates…Выбрать таб Trusted Root Certificate Authorities — Import — rootCA.crtперезапустить Chrome
FireFox на виндоус имеет свой репозиторий.
Java имеет свой репозиторий.
Windows 10 — chrome, ie11 и edge
1. Дважды кликните на сертификате (ca.crt).
2. Кликните на кнопку «Установить сертификат».
3. Выберите, хотите ли вы хранить его на уровне пользователя или на уровне машины.
4. Кликните «Дальше».
5. Выберите «Разместить все сертификаты в следующем хранилище».
6. Кликните «Обзор».
7. Выберите «Доверенные корневые источники сертификатов».
8. Кликните «ОК».
9. Кликните «Дальше».
10. Кликните «Завершить».
11. Если появится подсказка, кликните «Да».
В ubuntu
sudo mkdir /usr/share/ca-certificates/extra
sudo cp rootCA.crt /usr/share/ca-certificates/extra/rootCA.crt
sudo dpkg-reconfigure ca-certificates
sudo update-ca-certificates
Генерация сертификатов ssl / tls
Шаг 1: Создайте server-csr.json с данными вашего сервера.
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=web-servers server-csr.json | cfssljson -bare server
Генерация сертификатов с использованием cfssl и cfssljson
CFSSL и CFSSLJSON являются инструментами PKI от Cloudflare.Это делает вашу жизнь проще для создания CSR и ключей сертификатов.
Генерация сертификатов с использованием openssl
Утилита Openssl присутствует по умолчанию во всех системах на базе Linux и Unix.
Доверие к сертификатам
Чтобы получить обозначение безопасного доступа, ваш новый источник сертификата должен считаться доверенным на вашей машине. Процесс присваивания этого статуса различается в зависимости от операционной системы и удовлетворит большинство браузеров. Если вы используете Firefox, процесс имеет некоторые отличия.
Использование сертификата
Приложениям, обслуживающим ваш контент, понадобится доступ к файлам сертификата и закрытого ключа. Это может быть локальный веб-сервер (Apache или NGINX), локальный сервис или какой-то другой локальный инструмент, допустим, сборщик модулей DevServer.
Вот несколько примеров:
Источник сертификата (certificate authority)
1. Создайте закрытый ключ и самоподписанный сертификат
openssl req -x509 -nodes -new -sha512
-days 365 -newkey rsa:4096 -keyout ca.key
-out ca.pem -subj "/C=US/CN=MY-CA"Опционально: если необходимо, можно заменить MY-CA в CN на что-нибудь другое.
Если вам захочется проверить информацию сертификата, его содержимое можно вывести, запустив следующий код:
openssl x509 -in ca.pem -text -noout2. Создайте файл сертификата с расширением .crt:
openssl x509 -outform pem -in ca.pem -out ca.crtКак выпустить самоподписанный ssl сертификат и заставить ваш браузер доверять ему

Все крупные сайты давно перешли на протокол https. Тенденция продолжается, и многие наши клиенты хотят, чтобы их сайт работал по защищенному протоколу. А если разрабатывается backend для мобильного приложения, то https обязателен. Например, Apple требует, чтобы обмен данными сервера с приложением велся по безопасному протоколу. Это требование введено с конца 2021 года.
На production нет проблем с сертификатами. Обычно хостинг провайдер предоставляет удобный интерфейс для подключения сертификата. Выпуск сертификата тоже дело не сложное. Но во время работы над проектом каждый разработчик должен позаботиться о сертификате сам.
В этой статье я расскажу, как выпустить самоподписанный SSL сертификат и заставить браузер доверять ему.
Чтобы выпустить сертификат для вашего локального домена, понадобится корневой сертификат. На его основе будут выпускаться все остальные сертификаты. Да, для каждого нового top level домена нужно выпускать свой сертификат. Получить корневой сертификат достаточно просто.
Сначала сформируем закрытый ключ:
openssl genrsa -out rootCA.key 2048Затем сам сертификат:
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pemНужно будет ввести
страну
,
город
,
компанию
и т.д. В результате получаем два файла:
rootCA.key
и
rootCA.pem
Переходим к главному, выпуск самоподписанного сертификата. Так же как и в случае с корневым, это две команды. Но параметров у команд будет значительно больше. И нам понадобится вспомогательный конфигурационный файл. Поэтому оформим все это в виде bash скрипта create_certificate_for_domain.sh
Первый параметр обязателен, выведем небольшую инструкцию для пользователя.
if [ -z "$1" ]
then
echo "Please supply a subdomain to create a certificate for";
echo "e.g. mysite.localhost"
exit;
fiСоздадим новый приватный ключ, если он не существует или будем использовать существующий:
if [ -f device.key ]; then
KEY_OPT="-key"
else
KEY_OPT="-keyout"
fiЗапросим у пользователя название домена. Добавим возможность задания “общего имени” (оно используется при формировании сертификата):
DOMAIN=$1
COMMON_NAME=${2:-$1}Чтобы не отвечать на вопросы в интерактивном режиме, сформируем строку с ответами. И зададим время действия сертификата:
SUBJECT="/C=CA/ST=None/L=NB/O=None/CN=$COMMON_NAME"
NUM_OF_DAYS=999В переменной SUBJECT перечислены все те же вопросы, который задавались при создании корневого сертификата (
страна
,
город
,
компания
и т.д). Все значение, кроме CN можно поменять на свое усмотрение.
Сформируем csr файл (Certificate Signing Request) на основе ключа. Подробнее о файле запроса сертификата можно почитать в этой статье.
openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csrФормируем файл сертификата
. Для этого нам понадобится вспомогательный файл с настройками. В этот файл мы запишем домены, для которых будет валиден сертификат и некоторые другие настройки. Назовем его
v3.ext
. Обращаю ваше внимание, что это отдельный файл, а не часть bash скрипта.
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = %%DOMAIN%%
DNS.2 = *.%%DOMAIN%%Да, верно, наш сертификат будет валидным для основного домена, а также для всех поддоменов. Сохраняем указанные выше строки в файл
v3.ext
Возвращаемся в наш bash скрипт. На основе вспомогательного файла v3.ext создаем временный файл с указанием нашего домена:
cat v3.ext | sed s/%%DOMAIN%%/$COMMON_NAME/g > /tmp/__v3.extВыпускаем сертификат:
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.extПереименовываем сертификат и удаляем временный файл:
mv device.csr $DOMAIN.csr
cp device.crt $DOMAIN.crt
# remove temp file
rm -f device.crt;Скрипт готов. Запускаем его:
./create_certificate_for_domain.sh mysite.localhostПолучаем два файла:
mysite.localhost.crt
и
device.key
Теперь нужно указать web серверу пути к этим файлам. На примере nginx это будет выглядеть так:

Запускаем браузер, открываем https://mysite.localhost и видим:

Браузер не доверяет этому сертификату. Как быть?
Нужно отметить выпущенный нами сертификат как Trusted. На Linux (Ubuntu и, наверное, остальных Debian-based дистрибутивах) это можно сделать через сам браузер. В Mac OS X это можно сделать через приложение Keychain Access. Запускаем приложение и перетаскиваем в окно файл mysite.localhost.crt. Затем открываем добавленный файл и выбираем Always Trust:

Обновляем страницу в браузере и:

Успех! Браузер доверяет нашему сертификату.
Сертификатом можно поделиться с другими разработчиками, чтобы они добавили его к себе. А если вы используете Docker, то сертификат можно сохранить там. Именно так это реализовано на всех наших проектах.
Делитесь в комментариях, используете ли вы https для локальной разработки?
Максим Ковтун,
Руководитель отдела разработки
Программа сервера на go
Программа сервера на Go myserver.go, которая использует наш подписаный сертификат.
Процесс создания сертификата сервера
В этом руководстве мы объясним шаги, необходимые для создания сертификатов CA, SSL / TLS с использованием следующих утилит:
- openssl
- cfssl
Рабочий процесс создания сертификата
Ниже приведены шаги, необходимые для создания сертификатов CA, SSL / TLS.
Сертификат доменного имени
В большинстве случаев достаточно зарегистрировать в сертификате вашу рабочую станцию. Тем не менее, если вы предпочитаете собственные доменные имена для локальных приложений, в созданный сертификат можно добавить несколько альтернативных имен.
1. Создайте файл расширения x509 v3:
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
# Локальные хостинги
DNS.1 = localhost
DNS.2 = 127.0.0.1
DNS.3 = ::1
# Перечислите доменные имена
DNS.4 = local.dev
DNS.5 = my-app.dev
DNS.6 = local.some-app.dev
EOFСледуя этому шаблону, можно добавить сколько угодно доменных имен.
Примечание: пожалуйста, обновите DNS.4, DNS.5 и DNS.6 или удалите их, если у вас не настроены никакие локальные доменные имена.
2. Создайте закрытый ключ и запрос на подпись сертификата:
openssl req -new -nodes -newkey rsa:4096
-keyout localhost.key -out localhost.csr
-subj "/C=US/ST=State/L=City/O=Some-Organization-Name/CN=localhost"Опционально: страну, штат, город и организацию можно изменять.
3. Создайте самоподписанный сертификат:
openssl x509 -req -sha512 -days 365
-extfile v3.ext
-CA ca.crt -CAkey ca.key -CAcreateserial
-in localhost.csr
-out localhost.crtСоздаем наше ca
Первая команда создаёт корневой ключ
openssl genrsa -out rootCA.key 2048
Для меня ключ 2048 bit достаточен, если вам хочется, вы можете использовать ключ 4096 bit.
Вторая команда создаёт корневой сертификат.
openssl req -x509 -new -key rootCA.key -days 10000 -out rootCA.crt
Отвечать на вопросы тут можно как душе угодно.
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
10000 дней срок его годности, примерно столько живет сертификат, которым google требует подписывать андроид приложения для Google Play. Если вы паникер, подписывайте на год или два.
Все! Теперь мы можем создавать сертификаты для наших серверов и устанавливать корневой сертификат на наши клиентские машины.
Создаем сертификат подписаный нашим са
Генерируем ключ.
openssl genrsa -out server101.mycloud.key 2048
Создаем запрос на сертификат.
openssl req -new -key server101.mycloud.key -out server101.mycloud.csr
Тут важно указать имя сервера: домен или IP (например домен
server101.mycloud
Common Name (eg, YOUR name) []: server101.mycloud
и подписать запрос на сертификат нашим корневым сертификатом.
openssl x509 -req -in server101.mycloud.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server101.mycloud.crt -days 5000
Теперь на клиенты нужно установить корневой сертификат rootCA.crt
rootCA.crt — можно давать друзьям, устанавливать, копировать не сервера, выкладывать в публичный доступrootCA.key — следует держать в тайне
Создайте сертификат ca и его ключ
Шаг 1: Создайте папку с именем cfssl для хранения всех сертификатов и перейдите в папку.
mkdir cfssl cd cfssl
Шаг 2: Создайте файл ca-csr.json с необходимой информацией.
cat > ca-csr.json <<EOF
{
"CN": "Demo CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "California",
"ST": "Milpitas"
}
]
}
EOFcfssl print-defaults config cfssl print-defaults csr
Шаг 3: Создайте ca-config.json с подписью и данными профиля.
Это будет использоваться для создания сертификатов сервера или клиента, которые можно использовать для настройки аутентификации на основе SSL / TSL.
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"web-servers": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
EOFУстановите cfssl и cfssljson на linux
1. Загрузите исполняемые файлы и сохраните их в /usr/local/bin
3. Проверьте установку, выполнив команду cfssl:
Заключение
Теперь, когда сертификат создан и доверие к нему обеспечено, вы без проблем можете посещать свой локальный домен! Обслуживание приложений стало безопасным, и вы можете спокойно продолжать разработку. Возвращаясь к примеру с Express, результат на экране будет таким:
Сайт полностью загружен, и рядом с URL в Chrome теперь отображается символ безопасного соединения.
