Создание самоподписанного SSL-сертификата для Nginx в Ubuntu 18.04
TLS (Transport Layer Security) и его предшественник SSL (Secure Socket Layers) – это криптографические протоколы, которые используются для защиты передачи данных в Интернете.
Эта технология позволяет защитить обмен данными между сервером и клиентом и предотвратить перехват или несанкционированный доступ к передаваемой информации. Кроме того, эти протоколы предоставляют систему сертификатов, которая помогает пользователям проверить подлинность сайтов, на которые они заходят.
Данный мануал поможет создать самоподписанный SSL-сертификат для веб-сервера Nginx в Ubuntu 18.04.
Примечание: Самоподписанный сертификат не сможет подтвердить подлинности сервера, так как он не подписан проверенным центром сертификации (ЦС); тем не менее, такой сертификат позволит шифровать взаимодействие с веб-клиентами. Самоподписанный сертификат подходит пользователям, у которых пока что нет доменного имени. При наличии домена рекомендуется обратиться за подписью сертификата к одному из надёжных ЦС. Также можно получить бесплатный доверенный сертификат от сервиса Let’s Encrypt.
Требования
- Сервер Ubuntu 18.04, настроенный по этому мануалу.
- Предварительно установленный веб-сервер Nginx. Можно установить стек LEMP, одним из компонентов которого является Nginx (для этого следуйте руководству Установка стека LEMP в Ubuntu 18.04); чтобы установить только Nginx, выполните инструкции мануала Установка Nginx в Ubuntu 18.04.
1: Создание SSL-сертификата
Для работы TLS/SSL использует комбинацию открытого сертификата и закрытого ключа. Закрытый ключ хранится на сервере и не разглашается. SSL-сертификат используется открыто и доступен всем пользователям, запрашивающим контент.
Чтобы создать самоподписанный сертификат и ключ, запустите команду:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Команда задаст ряд вопросов. Рассмотрим компоненты команды подробнее:
- openssl: базовый инструмент командной строки для создания и управления сертификатами, ключами и другими файлами OpenSSL.
- req: эта подкоманда указывает, что на данном этапе нужно использовать запрос на подпись сертификата X.509 (CSR). X.509 – это стандарт инфраструктуры открытого ключа, которого придерживаются SSL и TLS при управлении ключами и сертификатами. То есть, данная команда позволяет создать новый сертификат X.509.
- -x509: эта опция вносит поправку в предыдущую субкоманду, сообщая утилите о том, что вместо запроса на подписание сертификата необходимо создать самоподписанный сертификат.
- -nodes: пропускает опцию защиты сертификата парольной фразой. Нужно, чтобы при запуске сервер Nginx имел возможность читать файл без вмешательства пользователя. Установив пароль, придется вводить его после каждой перезагрузки.
- -days 365: эта опция устанавливает срок действия сертификата (как видите, в данном случае сертификат действителен в течение года).
- -newkey rsa:2048: эта опция позволяет одновременно создать новый сертификат и новый ключ. Поскольку ключ, необходимый для подписания сертификата, не был создан ранее, нужно создать его вместе с сертификатом. Данная опция создаст ключ RSA на 2048 бит.
- -keyout: эта опция сообщает OpenSSL, куда поместить сгенерированный файл ключа.
- -out: сообщает OpenSSL, куда поместить созданный сертификат.
Как уже было сказано, все эти опции сгенерируют ключ и сертификат. Заполните появившиеся поля данными о сервере, которые будут отображаться в сертификате.
Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера. В целом эти поля выглядят примерно так:
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com
Файлы ключа и сертификата будут помещены в каталог /etc/ssl.
При использовании OpenSSL нужно также создать ключи Диффи-Хеллмана, которые нужны для поддержки PFS (совершенной прямой секретности).
Для этого введите:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Этот процесс займёт несколько минут. Ключи DH будут помещены в /etc/nginx/dhparam.pem.
2: Настройка Nginx для поддержки SSL
Итак, на данном этапе ключ и сертификат созданы и хранятся в каталоге /etc/ssl. Теперь нужно отредактировать настройки Nginx:
- Создать сниппет, указывающий место хранения файлов SSL-сертификата и ключа.
- Добавить настройки SSL.
- Настроить блоки server для обслуживания запросов SSL и поддержки новых настроек.
Расположение ключа и сертификата
Создайте новый сниппет Nginx в каталоге /etc/nginx/snippets.
Рекомендуется указать в названии файла его назначение (к примеру, self-signed.conf):
sudo nano /etc/nginx/snippets/self-signed.conf
В этот файл нужно добавить директиву ssl_certificate, которая будет указывать путь к сертификату, и директиву ssl_certificate_key, которая задаёт путь к соответствующему закрытому ключу.
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Сохраните и закройте файл.
Настройка SSL
Теперь нужно создать другой сниппет, предназначенный для настроек SSL. Он позволит серверу Nginx использовать надёжный механизм шифрования и включит некоторые дополнительные функции безопасности.
Эти установленные параметры можно повторно использовать в будущих конфигурациях Nginx, потому этому файлу лучше дать какое-нибудь общее имя:
sudo nano /etc/nginx/snippets/ssl-params.conf
Для безопасной настройки SSL обратимся к рекомендациям Remy van Elst на сайте Cipherli.st. Этот сайт предназначен для распространения простых и надёжных параметров шифрования для популярного программного обеспечения.
Примечание: Данный список настроек подходит для более новых клиентов. Чтобы получить настройки для других клиентов, перейдите по ссылке Yes, give me a ciphersuite that works with legacy / old software.
Скопируйте все предложенные параметры. Остаётся только добавить в них DNS резолвер для upstream запросов. В руководстве для этого используется Google.
Также нужно отключить заголовок Strict-Transport-Security (HSTS). Предварительная загрузка заголовка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если заголовок был включен случайно или некорректно. В этом мануале мы не будем включать эту опцию, но вы можете изменить это позже, если уверены, что понимаете последствия.
Скопируйте этот сниппет и вставьте его в ssl-params.conf:
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
# add_header Strict-Transport-Security «max-age=63072000; includeSubDomains; preload»;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection «1; mode=block»;
Примечание: Поскольку сертификат является самоподписанным, SSL stapling не будет использоваться. Nginx выдаст предупреждение, отключит stapling для данного сертификата и продолжит работу.
Сохраните и закройте файл.
Настройка Nginx для поддержки SSL
В мануале предполагается, что вы используете виртуальный хост (блок server) default, который хранится в каталоге /etc/nginx/sites-available. Если вы используете другой файл, пожалуйста, укажите его имя.
Для начала создайте резервную копию файла блока server.
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak
Затем откройте файл блока server в текстовом редакторе:
sudo nano /etc/nginx/sites-available/default
Файл должен выглядеть примерно так:
server <
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
. . .
>
Ваш файл может быть составлен в другом порядке, и вместо директив root и index у вас может быть location, proxy_pass или другие пользовательские конфигурации. Это нормально, вам нужно только обновить директивы listen и включить сниппеты SSL. Этот блок нужно настроить для поддержки трафика SSL по порту 443, а затем создать новый блок server для обработки трафика по порту 80 и автоматической переадресации трафика на порт 443.
Примечание: Во время настройки рекомендуется использовать временный редирект 302. Убедившись в правильности настроек, можно включить постоянный редирект 301.
В текущем файле обновите директивы listen для поддержки порта 443 и ssl, а затем включите два новых сниппета:
server <
listen 443 ssl ;
listen [::]: 443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
. . .
>
Затем добавьте второй блок server в этот файл (после закрывающей фигурной скобки (>) первого блока):
. . .
server <
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 302 https://$server_name$request_uri;
>
Сохраните и закройте файл.
3: Настройка брандмауэра
Если вы включили брандмауэр ufw (согласно мануалу по начальной настройке), на данном этапе его нужно настроить для поддержки трафика SSL. К счастью, веб-сервер Nginx регистрирует при установке несколько своих профилей в ufw.
Чтобы просмотреть доступные профили, введите:
sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Чтобы просмотреть текущие настройки брандмауэра, наберите:
sudo ufw status
Если разрешен только трафик HTTP, они будут иметь такой вид:
Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Чтобы добавить поддержку трафика HTTPS, нужно настроить профиль Nginx Full и отключить профиль Nginx HTTP.
sudo ufw allow ‘Nginx Full’
sudo ufw delete allow ‘Nginx HTTP’
После этого настройки брандмауэра должны выглядеть так:
sudo ufw status
Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
4: Обновление настроек Nginx
Итак, теперь настройки веб-сервера и брандмауэра откорректированы. Перезапустите Nginx, чтобы изменения вступили в силу.
Сначала нужно проверить синтаксис на наличие ошибок.
Если ошибок не обнаружено, команда вернёт:
nginx: [warn] «ssl_stapling» ignored, issuer certificate not found
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Обратите внимание на предупреждение в начале. Как говорилось ранее, веб-сервер будет возвращать предупреждение в случае использования самоподписанного сертификата. Соединения всё рано шифруются правильно.
Если в синтаксисе обнаружены ошибки, исправьте их. Затем перезапустите веб-сервер:
sudo systemctl restart nginx
5: Тестирование шифрования
Теперь нужно убедиться, что трафик между сервером и клиентом шифруется. Откройте в браузере следующую ссылку:
Поскольку сертификат был подписан самостоятельно, браузер сообщит о его ненадёжности:
Your connection is not private
Attackers might be trying to steal your information
(for example, passwords,messages, or credit cards). NET::ERR_CERT_AUTHORITY_INVALID
Это нормальное поведение программы в подобной ситуации, поскольку браузер не может проверить подлинность хоста. Однако в данном случае нужно только шифровать трафик, с чем самоподписанный сертификат вполне справляется, потому предупреждение браузера можно пропустить. Для этого нажмите кнопку ADVANCED и кликните по предложенной ссылке.
После этого вы получите доступ к своему сайту.
Если вы настроили два блока server для переадресации трафика HTTP на HTTPS, проверьте, работает ли переадресация:
6: Постоянный редирект
Если шифрование работает должным образом, настройте постоянный редирект вместо временного.
Откройте файл блока server:
sudo nano /etc/nginx/sites-available/example.com
Найдите в нём return 302 и замените значение строки на return 301.
return 301 https://$server_name$request_uri;
Сохраните и закройте файл.
Проверьте синтаксис на ошибки:
Если ошибок нет, перезапустите Nginx:
sudo systemctl restart nginx
Заключение
Теперь сервер Nginx может шифровать передаваемые данные, что защитит взаимодействие сервера с клиентами и предотвратит перехват трафика злоумышленниками.
Конечно, при разработке сайта рекомендуется подписать SSL-сертификат в надежном центре сертификации, что позволит избежать появления отпугивающих предупреждений.
How To Create A Self-Signed SSL Certificate On Linux
This is a guide to creating self-signed SSL certificates using OpenSSL on Linux. It provides an easy “cut and paste” code that you will need to generate your first RSA key pair. After creating your first set of keys, you should have the confidence to create certificates for a variety of situations. RSA keys are used everywhere these days and knowing how to generate them is an essential skill to possess for system admins, and an easy procedure for the hobbyist to pick up.
SSL certificates are used by many protocols and services, ranging from HTTPS to VPN. No matter what the application, being comfortable generating your own self-signed SSL certificates easily, will dramatically change the way you approach your system.
Below are the quick commands needed to get your SSL certificate and key. If you are trying to create a certificate for Web (https) you can take advantage of the free signed certificates that Cloudflare provides,. Self-signing a certificate for web use, particularly e-commerce, is a bad idea, its best to use Cloudflare or purchase a reputable signed certificate. A signed certificate signifies a trusted authority issued it. This provides SEO benefits in addition to security. Visitors to your site will get warnings if you try to use a self-signed certificate.
It is more than a disadvantage to try and use a self-signed certificate for a website.
Many trusted services insure their certificates against breaches. GoDaddy, a domain registrar, and web host, provides insurance on SSL certificates up to $100,000.
If you need an SSL certificate for anything other than https — read on.
All the commands below were run on Ubuntu 18.04 using apt-get and OpenSSL. If you don’t have Linux, or want to take advantage of free cloud time, click here to signup with Vultr and launch an Ubuntu 18.04 instance in a few clicks. If you are on a RedHat/CentOS system use yum instead of apt-get. If you use a different Linux distro, package manager, or you want to install OpenSSL from source: clone the files using git, and view the file in the main directory called INSTALL. Clone OpenSSL using the below commands:
How To Generate A SSL Certificate:
You should see an output similar to the output below. Many systems have OpenSSL installed already, so don’t be surprised if you have nothing to install. Use yum instead of apt-get if your system requires it.
The command below creates a certificate called ryanserver1.crt, and a private key called ryanserver1.key. The SSL certificates generated with the options below, are created without a passphrase, and are valid for 365 days. The values can be edited to match your specifications.
Change the names of the .crt and .key outputs from ryanserver1 to your filename in the code below and run the command.
You will be asked a number of questions relating to the owner of the certificate. For most non-production applications, you can simply hit enter a few times to accept the default values. The executed command should look like this:
The certificate and key should now be in your current directory. Use ls to see a list of files, use pwd to determine the full path to the files. To show the contents of the certificate and key use cat. Your application will require the full path to the SSL certificates, you can move them with mv or you can link to their current position editing your applications config file.
You now have a working self-signed key and certificate without a passphrase. To learn more about generating SSL certificates and the advanced options available using OpenSSL, be sure to visit the OpenSSL git repo and read through the OpenSSL docs.
How to Generate SSL Certificates on Linux Using OpenSSL
The process of generating SSL/TLS certificates is a common task for many Linux system administrators. Luckily, even if you are not an administrator, it is easy to do so using OpenSSL, an open-source tool that is installed by default on many Linux distributions. Here we explain what OpenSSL is, how to install it, and most importantly, how to use it to generate SSL and TLS certificates on your system.
Content
What Is OpenSSL?
OpenSSL is a library developed by the OpenSSL Project to provide open-source SSL and TLS implementations for the encryption of network traffic. It is readily available for a variety of Unix-based distributions and can be used to generate certificates, RSA private keys, and perform general cryptography-related tasks.
Limitation of Self-Signed SSL Certificate
When you use OpenSSL to generate a SSL certificate, it is considered “self-signed.” It means that the SSL certificate is signed with its own private key and not from a Certificate Authority (CA).
As such, the SSL certificate cannot be “trusted” and should not be used for any public facing site. If used, the users will likely see warnings from their browsers about the certificate.
A self-signed certificate is useful for local development or any apps running in the background that don’t face the Internet.
Alternatively, you can use LetsEncrypt or obtain a certificate verified by a trusted authority, such as Comodo CA.
Installation
Most Linux distributions already have a version of OpenSSL built in by default. If not, you can easily install it.
You can install it on Ubuntu and Debian by using the apt command:
On CentOS (or its alternative), you can install it by using the yum command:
You can also easily download it from its website as a “.tar.gz” file.
Basic Usage
Now that you have OpenSSL installed, we can have a look at some of the basic functions the program provides.
You can start by viewing the version and other relevant information about your OpenSSL installation:
You can check out the manual provided:
Generating a Certificate Using a Configuration File
Generating a certificate using OpenSSL is possible in many ways. One of them is by using a configuration file which will specify details about the organization.
To start, you can create a configuration file called “config.conf” and edit it using Nano:
Here is an example of the content of the configuration file:
You can just copy and paste this into the file and make the necessary changes to reflect your organization’s information.
Next, you have to generate an RSA private key, which will then be used to generate a root certificate -:
The -out flag is used in this case to specify the name of the key that will be generated. A key size of 2048 bits is also specified, which is the default for RSA keys.
You will also have to generate a Certificate Signing Request (CSR):
In this case, the -key flag is used to specify the RSA key, the -out flag specifies the name of the CSR file and the -config flag is used to specify the name of the config file.
After this, you can generate a root certificate, which is used to generate our final certificate:
In the process of generating this root certificate, the -sha256 flag is used to specify SHA256 as the message digest.
Now, as for the final step, we can finally type the following to generate our certificate:
The -CA flag specifies the root certificate, the -CAkey flag specifies the private key and -extfile specifies the name of the configuration file. The “final.crt” file will be the SSL certificate you want.
Generating a Certificate without a Configuration File
Alternatively, you can also generate a certificate using OpenSSL without a configuration file.
You can start by generating an RSA private key:
Next, you will have to generate a CSR:
When generating a CSR, you will be prompted to answer questions about your organization.
Finally, we can generate the certificate itself:
Verification of Keys and Certificates
Keys and certificates are easily checked and verified using OpenSSL, with the -check flag:
You can check certificate signing requests:
and certificates as well:
Frequently Asked Questions
1. Do I still have to worry about Heartbleed?
Heartbleed (CVE-2014-0160) is an old vulnerability found in OpenSSL in 2014. TLS-servers and clients running OpenSSL both were affected. A patch was quickly released a few days after its discovery, and this vulnerability isn’t something to worry about in 2022 as long as you are running a modern and up-to-date version of OpenSSL.
If you are using OpenSSL on Debian and Ubuntu-based systems, you can always update it by running the following commands:
2. How long do SSL certificates last before they expire?
This depends on the value you choose when generating the certificate. This can be specified by using the -days flag when generating a certificate.
Создание сертификата OpenSSL
В наши дни очень часто для повышения безопасности сетевых соединений или просто для аутентификации используются SSL сертификаты. Одна из самых популярных свободных программ для создания сертификатов — это OpenSSL. Это утилита командной строки, которая позволяет создавать различные виды сертификатов, например, PKI или HTTPS.
В этой статье мы рассмотрим что такое сертификаты, какими они бывают, разберем подробно создание сертификата OpenSSL. Причем рассмотрим каждый этап, чтобы вам было легче понять что и как происходит.
Что такое сертификаты?
Думаю нужно начать с самого начала. Сертификаты в первую очередь позволяют идентифицировать человека или сервис, подтвердить что вы тот, за кого себя выдаете. А работает это так — есть два ключа — закрытый и открытый. Зашифровать сообщение можно с помощью открытого ключа, но чтобы его расшифровать нужен только закрытый ключ. Если у вас нет закрытого ключа, то вы попросту не сможете расшифровать зашифрованное сообщение. Фактически зашифровать сообщение может каждый, но расшифровать его способен только владелец закрытого (секретного ключа).
Если вы смогли расшифровать отправленное сообщение, зашифрованное с помощью вашего открытого ключа, то значит — это вы. Ключи работают только в паре, и вы не сможете расшифровать ничего другим ключом. Но еще остался один момент. Как определить что этот открытый ключ именно ваш и ему можно доверять? Все просто, достаточно, чтобы кто-то из авторитетных источников, например, Comodo или LetsEncrypt подписал ваш ключ. Это так называемые центры сертификации.
В этой инструкции мы будем иметь дело с такими видами ключей:
- .pem, .crt, .cer — готовый, подписанный центром сертификации сертификат, расширения разные, но означают одно и то же. Если совсем просто, то сертификат, это подписанный открытый ключ, плюс немного информации о вашей компании;
- .key — закрытый или открытый ключ;
- .csr — запрос на подпись сертификата, в этом файле хранится ваш открытый ключ плюс информация, о компании и домене, которую вы указали.
А теперь рассмотрим как создать сертификат openssl, как его подписать и что для этого нужно сделать. Генерация ключей openssl — это довольно простая задача, если во всем разобраться.
Создание закрытого ключа
В этой статье я буду использовать папку
/certs для создания сертификатов. Вы можете создать эту папку и сразу перейти в неё с помощью команды:
Прежде всего необходимо создать закрытый ключ для сертификата. Для этого нужно использовать команду genrsa:
openssl genrsa -out domain.key 2048
Ей необходимо передать имя файла ключа с помощью опции -out. Вы можете выбрать любое имя, оно не имеет значения. Также можно указать размер ключа, например 2048. Если этого не сделать, то будет создан ключ размером 512 бит. Все ключи размером меньше 512 бит считаются небезопасными. После выполнения команды в текущей папке появится файл ключа:
Для того чтобы получить сертификат, который можно использовать нужно этот ключ подписать. А для этого надо создать запрос на подпись.
Создание запроса на подпись
При создании запроса на подпись нужно указать необходимую информацию. Обязательное поле здесь только одно. Это CN. Здесь должно быть указанно ваше доменное имя, для которого вы собираетесь использовать сертификат, также можно указать дополнительную информацию о вашей компании, адресе и организации, но это уже необязательно. Для создания запроса на подпись для ранее созданного ключа используйте такую команду:
openssl req -key domain.key -new -out domain.csr
Во время создания запроса большинство параметров можно оставить по умолчанию. Обязательно заполнять только Common Name (e.g. server FQDN or YOUR name). Если вы хотите создать сертификат для сайта, то в этом поле нужно указать домен этого сайта. В этом примере будет создан сертификат для localhost:
Вы также можете создать закрытый ключ и запрос на подпись открытого ключа одной командой:
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
Опция -newkey указывает, что нужно создать новую пару ключей, а в параметрах мы сообщаем тип rsa и сложность 2048 байт. Опция -nodes указывает, что шифровать ключ не нужно, опция -new указывает что нужно создать запрос csr.
Кроме того, можно создать csr запрос из уже существующего сертификата и закрытого ключа, тогда вам не придется вводить информацию, она будет получена из сертификата:
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr
Параметр —x509toreq указывает, что нужно использовать сертификат для X509 для получения CSR. X509, это сертификаты, подписанные сами собой. Обычно сертификат подписывается другим сертификатом, а этот был подписан сам собой. Если вы получили сертификат от CA, то этот параметр не нужен.
Подпись сертификатов OpenSSL
Допустим, у вас есть приватный ключ и запрос на подпись, фактически, открытый ключ. Теперь вам нужно его подписать чтобы получить сертификат, который можно использовать. Тут есть несколько вариантов. Можно отправить csr файл на подпись какому-либо центру сертификации, например, LetsEncrypt. Можно подписать сертификат тем же ключом, с помощью которого он был создан, и третий вариант — создать свой центр сертификации.
Первый способ я рассматривать не буду. Здесь все просто. Либо используете утилиту сервиса, либо заполняете веб форму и получаете готовый сертификат. Второй вариант гораздо интереснее.
Подпись сертификата самим собой
Мы подпишем наш сертификат сами, ключом, на основе которого он был создан:
openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt
С помощью параметра -days мы указываем что сертификат будет действительным в течение 365 дней, то есть в течение года. Обратите внимание, что во время подписи проверяется CN, поэтому если вы не зададите этот параметр на этапе создания запроса на подпись, то ничего не заработает.
Вы можете объединить все в одну команду и сразу создать закрытый ключ, csr и подписанный сертификат:
openssl req -newkey rsa:2048 -nodes -keyout domain.key
-x509 -days 365 -out domain.crt
Или создать самоподписанный сертификат openssl из существующего закрытого ключа без csr:
openssl req -key domain.key -new -x509 -days 365 -out domain.crt
Опция -new говорит, что нужно запросить информацию о csr у пользователя. Чтобы браузер доверял ключу нужно этот же сертификат импортировать в список доверенных.
Подпись сертификатов с помощью OpenSSL
А теперь рассмотрим третий способ выполнить создание сертификата OpenSSL — подписать его с помощью собственного CA, центра сертификации.
Вот вы сейчас думаете что это что-то такое сложное, да? А нет, это обычная папка, в которой лежит защищенный паролем закрытый ключ, с помощью которого мы будем подписывать все другие ключи. А открытая часть этого ключа должна быть добавлена во все браузеры, которые будут ему доверять.
Вообще, центр сертификации в крупных корпорациях находится на отдельных компьютерах, которые даже к сети не подключены. Но для примера мы разместим папку в нашей домашней папке:
Дальше нужно создать самоподписанный сертификат openssl для нашего CA.
openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3654 -out ca.crt
С помощью параметра -days мы устанавливаем долгий строк действия — десять лет. Программа запросит стандартные данные, которые используются при создании сертификатов. Эти данные будут выводится в браузере при просмотре информации о центре сертификации если вы будете использовать подписанные сертификаты для HTTPS. В поле Common Name можно указать имя вашей организации:
Осталось подписать наш сертификат, созданный ранее:
openssl x509 -req -in
/certs/domain.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out domain.crt -days 365
Готово, теперь наш сертификат подписан. Но теперь, чтобы браузеры ему доверяли нужно добавить сертификат CA в список доверенных сертификатов браузера.
Подпись сертификатов с помощью EasyRSA
Создание центра сертификации можно немного упростить. Существует набор скриптов под названием EasyRSA, который позволяет инициализировать центр сертификации, а также подписывать и отзывать сертификаты. Сначала установите пакет easy-rsa из официальных репозиториев:
sudo apt install easy-rsa
Далее нужно создать папку в которой будут находится файлы центра сертификации. Например, в домашней папке:
После этого скопируйте файлы из /usr/share/easy-rsa/ в эту папку:
cp -R /usr/share/easy-rsa/*
Дальше перейдите в неё и инициализируйте центр сертификации:
Прежде чем вы сможете создать сертификат, необходимо создать файл vars и в нём прописать информацию о центре сертификации. Например:
set_var EASYRSA_REQ_COUNTRY «US»
set_var EASYRSA_REQ_PROVINCE «California»
set_var EASYRSA_REQ_CITY «California»
set_var EASYRSA_REQ_ORG «Losst»
set_var EASYRSA_REQ_EMAIL «support@losst.pro»
set_var EASYRSA_REQ_OU «Losst»
set_var EASYRSA_ALGO «rsa»
set_var EASYRSA_DIGEST «sha512»
Первые 7 параметров аналогичны тем, что заполняются при создании запроса на подписание сертификата. Параметр EASYRSA_ALGO позволяет настроить алгоритм шифрования, можно использовать стандартный RSA или алгоритм на основе эллиптических кривых ES. Последний параметр — это формат подписи сертификатов. После этого можно создать сертификат CA:
Для корневого сертификата необходимо задать пароль. Если этого не сделать, сертификат не будет создан:
А в Common Name можно указать название центра сертификации, которое будет отображаться в браузере в информации о том кем подписан сертификат:
После этого можно переходить к подписи CSR. Например, давайте подпишем domain.csr, который был создан ранее. Сначала этот запрос надо импортировать. Для этого используйте такую команду:
В первом параметре нужно указать путь к фалу CSR, а во втором имя, с помощью которого вы будете взаимодействовать с сертификатом.
После этого вы можете подписать этот запрос используя имя, заданное при импорте:
./easyrsa sign-req server domain-server
Команде необходимо передать два параметра тип сертификата и имя запроса. Тип сертификата может быть server или client. Программа попросит подтвердить данные сертификата, наберите yes и нажмите Enter:
А затем нужно будет ввести пароль от корневого сертификата. После этого будет создан новый сертификат в папке pki/issued с расширением .crt.
Просмотр сертификатов
Сертификаты сохраняются в формате PEM, а это значит, что вы не сможете их открыть как текстовый файл и нужно использовать специальные команды для просмотра информации о них. Сначала смотрим содержимое CSR:
openssl req -text -noout -verify -in domain.csr
Смотрим содержимое сертификата в режиме обычного текста:
openssl x509 -text -noout -in domain.crt
Проверяем действительно ли сертификат подписан нужным CA:
openssl verify -verbose -CAfile
Просмотр закрытого ключа:
openssl rsa -check -in domain.key
Чтобы проверить связаны ли между собой закрытый ключ, сертификат и открытый ключ (запрос на подпись) можно подсчитать сумы md5 для этих ключей, если значения совпадут, то есть вероятность что это ключи из одной пары:
openssl rsa -noout -modulus -in
/certs/domain.key | openssl md5
openssl x509 -noout -modulus -in
/certs/domain.crt | openssl md5
openssl req -noout -modulus -in
/certs/domain.csr | openssl md5
Как использовать сертификат
Не зависимо от того какой способ создания сертификата OpenSSL вы выбрали у вас будет два файла. Это файл закрытого ключа с расширением .key и файл сертификата с расширение .crt. В данном примере это:
- domain.key
- domain-server.crt
Также вам может понадобится сертификат fullchain. Обычно этот файл содержит сам подписанный сертификат и сертификаты промежуточных центров сертификации. Но в случае если вы подписываете сертификат своим центром сертификации, промежуточных сертификатов у вас нет, а значит в качестве fullchain можно использовать сам подписанный сертификат.
Если вы хотите подключить ваши сертификаты к Apache, используйте такие директивы в файле виртуального хоста:
SSLEngine on
SSLCertificateFile /путь/к/сертификату/domain-server.crt
SSLCertificateKeyFile /путь/к/файлу/domain.key
SSLCertificateChainFile /путь/к/файлу/domain-server.crt
Для Nginx директивы подключения сертификатов выглядят похожим образом:
ssl_certificate /путь/к/файлу/domain-server.crt
ssl_certificate_key /путь/к/файлу/domain.key
Их нужно добавить внутри блока server для сайта на котором вы хотите настроить HTTPS.
Выводы
В этой статье мы рассмотрели как выполняется генерация сертификата openssl, какие бывают сертификаты, ключи и как все эти понятия связаны между собой. Это очень сложная и обширная тема, и недостаточно одной статьи чтобы все охватить, но, надеюсь, что теперь вам намного понятнее как это все работает.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.