Как создать самоподписанный сертификат SSL для Apache в Debian 9

Вступление

TLS, или безопасность транспортного уровня, и его предшественник SSL, который обозначает уровень защищенных сокетов, - это веб-протоколы, используемые для упаковки обычного трафика в защищенную зашифрованную оболочку.

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

В этом руководстве мы покажем вам, как настроить самозаверяющий сертификат SSL для использования с веб-сервером Apache в Debian 9.

Предпосылки

Прежде чем начать, у вас должен быть пользователь без полномочий root, настроенный с привилегиями + sudo +. Вы можете узнать, как настроить такую ​​учетную запись пользователя, следуя нашей Initial Server Setup с Debian 9.

Вам также нужно будет установить веб-сервер Apache. Если вы хотите установить на свой сервер весь стек LAMP (Linux, Apache, MariaDB, PHP), вы можете следовать нашему руководству по адресу https://www.digitalocean.com/community/tutorials/how-to-install-linux. -apache-mariadb-php-lamp-stack-debian9 [настройка LAMP в Debian 9]. Если вам нужен веб-сервер Apache, пропустите шаги, относящиеся к PHP и MariaDB.

Когда вы выполните эти предварительные условия, продолжайте ниже.

Шаг 1 - Создание сертификата SSL

TLS / SSL работает с использованием комбинации открытого сертификата и закрытого ключа. Ключ SSL хранится в секрете на сервере. Он используется для шифрования контента, отправляемого клиентам. Сертификат SSL является общедоступным для всех, кто запрашивает контент. Его можно использовать для расшифровки содержимого, подписанного соответствующим ключом SSL.

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

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Вам будет задан ряд вопросов. Прежде чем перейти к этому, давайте посмотрим, что происходит в команде, которую мы выдаем:

  • * openssl *: это основной инструмент командной строки для создания и управления сертификатами, ключами и другими файлами OpenSSL.

  • * req *: эта подкоманда указывает, что мы хотим использовать управление запросом подписи сертификата X.509 (CSR). «X.509» - это стандарт инфраструктуры открытых ключей, которого придерживаются SSL и TLS для управления ключами и сертификатами. Мы хотим создать новый сертификат X.509, поэтому мы используем эту подкоманду.

  • * -x509 *: Это дополнительно изменяет предыдущую подкоманду, сообщая утилите, что мы хотим сделать самозаверяющий сертификат вместо генерации запроса на подпись сертификата, как это обычно происходит.

  • * -nodes *: Это говорит OpenSSL пропустить опцию для защиты нашего сертификата парольной фразой. Нам нужен Apache, чтобы иметь возможность читать файл без вмешательства пользователя при запуске сервера. Парольная фраза предотвратит это, потому что мы должны будем вводить ее после каждого перезапуска.

  • * -days 365 *: эта опция устанавливает период времени, в течение которого сертификат будет считаться действительным. Мы установили это на один год здесь.

  • * -newkey rsa: 2048 *: указывает, что мы хотим создать новый сертификат и новый ключ одновременно. Мы не создали ключ, необходимый для подписи сертификата на предыдущем шаге, поэтому нам нужно создать его вместе с сертификатом. Часть + rsa: 2048 + говорит ему сделать ключ RSA длиной 2048 бит.

  • * -keyout *: эта строка сообщает OpenSSL, куда поместить созданный нами файл закрытого ключа.

  • * -out *: Это сообщает OpenSSL, где разместить сертификат, который мы создаем.

Как мы указали выше, эти опции создадут как файл ключа, так и сертификат. Нам зададут несколько вопросов о нашем сервере, чтобы правильно вставить информацию в сертификат.

Заполните соответствующие подсказки. * Самая важная строка - это та, которая запрашивает `+ Common Name (например, FQDN сервера или ВАШЕ имя) + `. Вам необходимо ввести доменное имя, связанное с вашим сервером, или, более вероятно, публичный IP-адрес вашего сервера. *

Вся подсказка будет выглядеть примерно так:

OutputCountry 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 []:

Оба файла, которые вы создали, будут помещены в соответствующие подкаталоги в + / etc / ssl +.

Шаг 2 - Настройка Apache для использования SSL

Мы создали наши файлы ключей и сертификатов в каталоге + / etc / ssl +. Теперь нам просто нужно изменить конфигурацию Apache, чтобы воспользоваться этими преимуществами.

Мы внесем несколько изменений в нашу конфигурацию:

  1. Мы создадим фрагмент конфигурации, чтобы указать строгие настройки SSL по умолчанию.

  2. Мы изменим включенный файл SSL Apache Virtual Host, чтобы он указывал на наши сгенерированные сертификаты SSL.

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

Когда мы закончим, у нас должна быть безопасная конфигурация SSL.

Создание фрагмента конфигурации Apache с надежными настройками шифрования

Сначала мы создадим фрагмент конфигурации Apache, чтобы определить некоторые настройки SSL. Это обеспечит Apache надежным набором шифров SSL и включит некоторые расширенные функции, которые помогут обеспечить безопасность нашего сервера. Заданные нами параметры могут использоваться любыми виртуальными хостами, поддерживающими SSL.

Создайте новый фрагмент в каталоге + / etc / apache2 / conf-available +. Мы назовем файл + ssl-params.conf +, чтобы прояснить его назначение:

sudo nano /etc/apache2/conf-available/ssl-params.conf

Для безопасной настройки Apache SSL мы будем использовать рекомендации Реми ван Элста на сайте https://cipherli.st [Cipherli.st]. Этот сайт предназначен для предоставления простых в использовании настроек шифрования для популярного программного обеспечения.

Для наших целей мы можем скопировать предоставленные настройки в полном объеме. Мы просто внесем одно небольшое изменение и отключим заголовок + Strict-Transport-Security + (HSTS).

Предварительная загрузка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если ее случайно включить или включить неправильно. В этом руководстве мы не включим параметры, но вы можете изменить их, если уверены, что понимаете последствия.

Прежде чем принять решение, уделите немного времени прочтению на HTTP Strict Transport Security, или HSTS, и, в частности, о https://hstspreload.appspot.com/[лужпprepreload «Функциональность».

Вставьте следующую конфигурацию в файл + ssl-params.conf +, который мы открыли:

/etc/apache2/conf-available/ssl-params.conf

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On


Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Сохраните и закройте файл, когда вы закончите.

Изменение файла виртуального хоста Apache SSL по умолчанию

Теперь давайте изменим + / etc / apache2 / sites-available / default-ssl.conf +, файл виртуального хоста Apache SSL по умолчанию. Если вы используете другой файл блока сервера, подставьте его имя в приведенные ниже команды.

Прежде чем мы продолжим, сделаем резервную копию исходного файла виртуального хоста SSL:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Теперь откройте файл SSL Virtual Host, чтобы внести изменения:

sudo nano /etc/apache2/sites-available/default-ssl.conf

Внутри, с удалением большинства комментариев, блок Virtual Host должен выглядеть примерно так:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin webmaster@localhost

               DocumentRoot /var/www/html

               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined

               SSLEngine on

               SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
               SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>

       </VirtualHost>
</IfModule>

Мы будем вносить небольшие изменения в файл. Мы установим обычные параметры, которые мы хотим настроить, в файле виртуального хоста (адрес электронной почты ServerAdmin, ServerName и т. Д.) И скорректируем директивы SSL, чтобы они указывали на наши файлы сертификатов и ключей. Опять же, если вы используете другой корень документа, обязательно обновите директиву + DocumentRoot +.

После внесения этих изменений ваш серверный блок должен выглядеть примерно так:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin


               DocumentRoot /var/www/html

               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined

               SSLEngine on

               SSLCertificateFile      /etc/ssl/certs/
               SSLCertificateKeyFile /etc/ssl/private/

               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>

       </VirtualHost>
</IfModule>

Сохраните и закройте файл, когда вы закончите.

(Рекомендуется) Изменение файла хоста HTTP для перенаправления на HTTPS

В настоящее время сервер будет предоставлять как незашифрованный HTTP, так и зашифрованный HTTPS-трафик. Для большей безопасности рекомендуется в большинстве случаев автоматически перенаправлять HTTP на HTTPS. Если вы не хотите или нуждаетесь в этой функции, вы можете смело пропустить этот раздел.

Чтобы настроить незашифрованный файл виртуального хоста для перенаправления всего трафика на шифрование SSL, откройте файл + / etc / apache2 / sites-available / 000-default.conf +:

sudo nano /etc/apache2/sites-available/000-default.conf

Внутри блоков конфигурации + VirtualHost + добавьте директиву + + Redirect +, указывающую весь трафик на версию сайта SSL:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
       . . .

       Redirect "/" "https:///"

       . . .
</VirtualHost>

Сохраните и закройте файл, когда вы закончите.

Вот и все изменения конфигурации, которые нужно внести в Apache. Далее мы обсудим, как обновить правила брандмауэра с помощью + ufw +, чтобы разрешить зашифрованный трафик HTTPS на ваш сервер.

Шаг 3 - Настройка брандмауэра

Если у вас включен брандмауэр + ufw +, как рекомендовано в предварительных руководствах, вам может потребоваться изменить настройки, чтобы разрешить трафик SSL. К счастью, при установке в Debian 9 + ufw + поставляется с профилями приложений, которые вы можете использовать для настройки параметров брандмауэра.

Мы можем увидеть доступные профили, набрав:

sudo ufw app list

Вы должны увидеть такой список со следующими четырьмя профилями в нижней части вывода:

OutputAvailable applications:
. . .
 WWW
 WWW Cache
 WWW Full
 WWW Secure
. . .

Вы можете увидеть текущие настройки, набрав:

sudo ufw status

Если вы ранее разрешали только обычный HTTP-трафик, ваш вывод может выглядеть следующим образом:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
WWW                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
WWW (v6)                   ALLOW       Anywhere (v6)

Чтобы дополнительно включить HTTPS-трафик, разрешите профиль «WWW Full», а затем удалите избыточный допуск профиля «WWW»:

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

Ваш статус должен выглядеть следующим образом:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

С вашим брандмауэром, настроенным для разрешения трафика HTTPS, вы можете перейти к следующему шагу, где мы рассмотрим, как включить несколько модулей и файлов конфигурации для правильной работы SSL.

Шаг 4 - Включение изменений в Apache

Теперь, когда мы внесли наши изменения и настроили брандмауэр, мы можем включить модули SSL и заголовков в Apache, включить наш виртуальный хост, готовый к SSL, а затем перезапустить Apache, чтобы эти изменения вступили в силу.

Включите + mod_ssl +, модуль Apache SSL и + mod_headers +, который необходим для некоторых настроек в нашем фрагменте SSL, с помощью команды + a2enmod +:

sudo a2enmod ssl
sudo a2enmod headers

Затем включите ваш виртуальный хост SSL с помощью команды + a2ensite +:

sudo a2ensite default-ssl

Вам также необходимо включить файл + ssl-params.conf +, чтобы прочитать значения, которые вы установили:

sudo a2enconf ssl-params

На данный момент сайт и необходимые модули включены. Мы должны убедиться, что в наших файлах нет синтаксических ошибок. Сделайте это, набрав:

sudo apache2ctl configtest

Если все прошло успешно, вы получите результат, который выглядит следующим образом:

OutputSyntax OK

Пока ваш вывод содержит + Синтаксис OK +, в вашем файле конфигурации нет синтаксических ошибок, и вы можете безопасно перезапустить Apache для реализации изменений:

sudo systemctl restart apache2

С этим, ваш самоподписанный сертификат SSL все готово. Теперь вы можете проверить, правильно ли ваш сервер шифрует свой трафик.

Шаг 5 - Тестирование шифрования

Теперь вы готовы протестировать ваш SSL-сервер.

Откройте веб-браузер и введите + https: // +, а затем доменное имя или IP-адрес вашего сервера в адресную строку:

https://

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

изображение: https: //assets.digitalocean.com/articles/apache_ssl_1604/self_signed_warning.png [Apache самоподписанное предупреждение сертификата]

Это ожидается и нормально. Нас интересует только аспект шифрования нашего сертификата, а не проверка третьей стороной подлинности нашего хоста. Нажмите * ADVANCED *, а затем предоставленную ссылку, чтобы в любом случае перейти к вашему хосту:

изображение: https: //assets.digitalocean.com/articles/apache_ssl_1604/warning_override.png [Самоподписанное переопределение Apache]

Вы должны быть приняты на свой сайт. Если вы заглянете в адресную строку браузера, вы увидите блокировку с символом «х» над ней или другое подобное «небезопасное» уведомление. В этом случае это просто означает, что сертификат не может быть проверен. Он все еще шифрует ваше соединение.

Если вы настроили Apache для перенаправления HTTP на HTTPS, вы также можете проверить, правильно ли работает перенаправление:

http://

Если это приводит к тому же значку, это означает, что ваше перенаправление работало правильно. Однако созданное ранее перенаправление является только временным перенаправлением. Если вы хотите сделать перенаправление на HTTPS постоянным, перейдите к последнему шагу.

Шаг 6 - Переход на постоянное перенаправление

Если ваше перенаправление работало правильно, и вы уверены, что хотите разрешить только зашифрованный трафик, вам следует снова изменить незашифрованный виртуальный хост Apache, чтобы сделать перенаправление постоянным.

Снова откройте файл конфигурации блока сервера:

sudo nano /etc/apache2/sites-available/000-default.conf

Найдите строку + Redirect +, которую мы добавили ранее. Добавьте + постоянный + к этой строке, которая изменяет перенаправление с временного перенаправления 302 на постоянное перенаправление 301:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
       . . .

       Redirect  "/" "https:///"

       . . .
</VirtualHost>

Сохраните и закройте файл.

Проверьте вашу конфигурацию на наличие синтаксических ошибок:

sudo apache2ctl configtest

Если эта команда не сообщает о каких-либо синтаксических ошибках, перезапустите Apache:

sudo systemctl restart apache2

Это сделает перенаправление постоянным, и ваш сайт будет обслуживать трафик только по HTTPS.

Заключение

Вы настроили свой сервер Apache для использования надежного шифрования для клиентских подключений. Это позволит вам безопасно обслуживать запросы и запретит сторонним пользователям читать ваш трафик.

Related