Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium

Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium Сертификаты
Содержание
  1. Генерация CSR
  2. 1.1 Установка SSL-сертификата для pound
  3. 1.2 Установка SSL-сертификата для nginx
  4. 1.3 Установка SSL-сертификата для apache
  5. 1 Дешифровка csr-файлов
  6. 2 Генерация CSR
  7. 2.1.1 С созданием ключа
  8. 2.1.2 С предварительно созданным ключом
  9. 2.2.1 С созданием ключа
  10. 2.2.2 С предварительно созданным ключом
  11. 3 Генерация самоподписного сертификата
  12. 3.1.1 С созданием ключа
  13. 3.1.2 С предварительно созданным ключом
  14. 3.2.1 С созданием ключа
  15. 3.2.2 С предварительно созданным ключом
  16. Firefox
  17. Mac os x
  18. Macos — chrome и safari
  19. Nginx
  20. Windows
  21. Windows 10 — chrome, ie11 и edge
  22. В ubuntu
  23. Генерация сертификатов ssl / tls
  24. Генерация сертификатов с использованием cfssl и cfssljson
  25. Генерация сертификатов с использованием openssl
  26. Доверие к сертификатам
  27. Использование сертификата
  28. Источник сертификата (certificate authority)
  29. Как выпустить самоподписанный ssl сертификат и заставить ваш браузер доверять ему
  30. Программа сервера на go
  31. Процесс создания сертификата сервера
  32. Рабочий процесс создания сертификата
  33. Сертификат доменного имени
  34. Создаем наше ca
  35. Создаем сертификат подписаный нашим са
  36. Создайте сертификат ca и его ключ
  37. Установите cfssl и cfssljson на linux
  38. Заключение

Генерация 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 С предварительно созданным ключом

Генерация самоподписного сертификата на основе предварительно созданного ключа в интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.

Про сертификаты:  Сертификаты на арматуру СИП до 1 кВ

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 -noout

2. Создайте файл сертификата с расширением .crt:

openssl x509 -outform pem -in ca.pem -out ca.crt

Как выпустить самоподписанный ssl сертификат и заставить ваш браузер доверять ему

Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium

Про сертификаты:  Оформление сертификатов на противопожарные двери. Получение пожарного сертификата на двери. Документация, предусмотренная для получения сертификата на противопожарную дверь. | СЕВТЕСТ

Все крупные сайты давно перешли на протокол 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 это будет выглядеть так:

nginx ssl

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

Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium

Браузер не доверяет этому сертификату. Как быть?

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

Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium

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

Как создавать надежные SSL-сертификаты для локальной разработки | by Рудольф Коршун | NOP::Nuances of Programming | Medium

Успех! Браузер доверяет нашему сертификату.

Сертификатом можно поделиться с другими разработчиками, чтобы они добавили его к себе. А если вы используете Docker, то сертификат можно сохранить там. Именно так это реализовано на всех наших проектах.

Про сертификаты:  Гид по SSL-сертификатам: всё, что нужно о них знать

Делитесь в комментариях, используете ли вы https для локальной разработки?

Максим Ковтун,
Руководитель отдела разработки

Программа сервера на go


Программа сервера на Go myserver.go, которая использует наш подписаный сертификат.

Процесс создания сертификата сервера

В этом руководстве мы объясним шаги, необходимые для создания сертификатов CA, SSL / TLS с использованием следующих утилит:

  1. openssl
  2. 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"
}
]
}
EOF
cfssl 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 теперь отображается символ безопасного соединения.

Оцените статью
Мой сертификат
Добавить комментарий