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

Вступление

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

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

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

[.Примечание]##

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

Самозаверяющий сертификат может подойти, если у вас нет доменного имени, связанного с вашим сервером, и в случаях, когда зашифрованный веб-интерфейс не предназначен для пользователя. Если у васdo есть доменное имя, во многих случаях лучше использовать сертификат, подписанный ЦС. Вы можете узнать, как настроить бесплатный доверенный сертификат с помощью проекта Let’s Encrypthere.

Предпосылки

Прежде чем вы начнете, у вас должен быть настроен пользователь без полномочий root с привилегиямиsudo. Вы можете узнать, как создать такую ​​учетную запись пользователя, следуя нашимinitial server setup for Ubuntu 16.04.

Вам также нужно будет установить веб-сервер Apache. Если вы хотите установить весь стек LAMP (Linux, Apache, MySQL, PHP) на свой сервер, вы можете следовать нашему руководству поsetting up LAMP on Ubuntu 16.04. Если вам нужен веб-сервер Apache, пропустите шаги, относящиеся к PHP и MySQL, в руководстве.

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

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

TLS/SSL works by using a combination of a public certificate and a private key. Ключ 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: эта подкоманда указывает, что мы хотим использовать управление запросом подписи сертификата (CSR) X.509. «X.509» - это стандарт инфраструктуры открытых ключей, которого придерживаются SSL и TLS для управления ключами и сертификатами. Мы хотим создать новый сертификат X.509, поэтому мы используем эту подкоманду.

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

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

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

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

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

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

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

Заполните соответствующие подсказки. The most important line is the one that requests the Common Name (e.g. server FQDN or YOUR name). You need to enter the domain name associated with your server or, more likely, your server’s public IP address.с

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

OutputCountry 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, мы также должны создать сильную группу Диффи-Хеллмана, которая будет использоваться при согласованииPerfect Forward Secrecy с клиентами.

Мы можем сделать это, набрав:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Это может занять несколько минут, но когда это будет сделано, у вас будет сильная группа DH в/etc/ssl/certs/dhparam.pem, которую мы можем использовать в нашей конфигурации.

Шаг 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 мы будем использовать рекомендацииRemy van Elst на сайтеCipherli.st. Этот сайт предназначен для предоставления простых в использовании настроек шифрования для популярного программного обеспечения. Вы можете узнать больше о его решениях относительно выбора Apachehere.

[.Примечание]##

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

Выбор используемого вами конфига будет во многом зависеть от того, что вам нужно поддерживать. Они оба обеспечат большую безопасность.

Для наших целей мы можем скопировать предоставленные настройки в полном объеме. Мы просто сделаем два небольших изменения.

Установите директивуSSLOpenSSLConfCmd DHParameters так, чтобы она указывала на файл Диффи-Хеллмана, который мы создали ранее. Кроме того, найдите время, чтобы прочитатьHTTP Strict Transport Security, or HSTS и, в частности,“preload” functionality. Предварительная загрузка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если ее случайно включить или включить неправильно. В этом руководстве мы не будем предварительно загружать настройки, но вы можете изменить это, если уверены, что понимаете последствия:

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

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLSessionTickets Off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

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

Изменить файл виртуального хоста 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

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

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


        
                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

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

        

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

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

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


        
                ServerAdmin [email protected]
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

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

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        

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

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


        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .

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

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

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

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

sudo ufw app list

Вы должны увидеть такой список:

OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

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

sudo ufw status

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

OutputStatus: active

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

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

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

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

sudo ufw status
OutputStatus: active

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

Шаг 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

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

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Первая строка - это просто сообщение о том, что директиваServerName не установлена ​​глобально. Если вы хотите избавиться от этого сообщения, вы можете установитьServerName на доменное имя вашего сервера или IP-адрес в/etc/apache2/apache2.conf. Это необязательно, так как сообщение не принесет вреда.

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

sudo systemctl restart apache2

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

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

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

https://server_domain_or_IP

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

Apache self-signed cert warning

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

Apache self-signed override

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

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

http://server_domain_or_IP

Если это приводит к тому же значку, это означает, что ваше перенаправление работало правильно.

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

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

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

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

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

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


        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .

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

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

sudo apache2ctl configtest

Когда вы будете готовы, перезапустите Apache, чтобы сделать перенаправление постоянным:

sudo systemctl restart apache2

Заключение

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

Related