Как создать SSL-сертификат на Apache для CentOS 7

Вступление

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

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

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

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

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

Предпосылки

Прежде чем вы начнете с этим руководством, необходимо выполнить несколько шагов.

Вам понадобится доступ к серверу CentOS 7 с пользователем без полномочий root с правамиsudo. Если вы еще не настроили это, вы можете запуститьCentOS 7 initial server setup guide, чтобы создать эту учетную запись.

Вам также нужно будет установить Apache, чтобы настроить для него виртуальные хосты. Если вы еще этого не сделали, вы можете использоватьyum для установки Apache через репозитории программного обеспечения CentOS по умолчанию:

sudo yum install httpd

Затем включите Apache как службу CentOS, чтобы он автоматически запускался после перезагрузки:

sudo systemctl enable httpd.service

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

Шаг первый: установите Mod_ssl

Чтобы настроить самозаверяющий сертификат, мы сначала должны убедиться, что на сервере установленmod_ssl, модуль Apache, который обеспечивает поддержку шифрования SSL. Мы можем установитьmod_ssl с помощью командыyum:

sudo yum install mod_ssl

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

Шаг второй: создайте новый сертификат

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

Во-первых, нам нужно создать новый каталог для хранения нашего закрытого ключа (каталог/etc/ssl/certs уже доступен для хранения нашего файла сертификата):

sudo mkdir /etc/ssl/private

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

sudo chmod 700 /etc/ssl/private

Теперь, когда у нас есть место для размещения наших файлов, мы можем создать файлы ключей 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 -x509: указывает, что мы хотим использовать управление запросом подписи сертификата (CSR) X.509. «X.509» - это стандарт инфраструктуры открытых ключей, которого придерживаются SSL и TLS для управления ключами и сертификатами.

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

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

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

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

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

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

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

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:[email protected]

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

Пока мы используем OpenSSL, мы также должны создать сильную группу Диффи-Хеллмана, которая будет использоваться при согласованииPerfect Forward Secrecy с клиентами.

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

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

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

Поскольку версия Apache, поставляемая с CentOS 7, не включает директивуSSLOpenSSLConfCmd, нам придется вручную добавить сгенерированный файл в конец нашего самозаверяющего сертификата. Для этого введите:

cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

Теперь файлapache-selfsigned.crt должен содержать как сертификат, так и сгенерированную группу Диффи-Хеллмана.

Шаг третий: настроить сертификат

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

Откройте файл конфигурации SSL Apache в текстовом редакторе с правами root:

sudo vi /etc/httpd/conf.d/ssl.conf

Найдите раздел, который начинается с<VirtualHost _default_:443>. Мы должны внести некоторые изменения, чтобы убедиться, что наш SSL-сертификат правильно применяется на нашем сайте.

Корректировка директив VirtualHost

Во-первых, раскомментируйте строкуDocumentRoot и измените адрес в кавычках на расположение корня документа вашего сайта. По умолчанию это будет/var/www/html, и вам не нужно изменять эту строку, если вы не меняли корень документа для своего сайта. Однако, если вы следовали руководству вроде нашегоApache virtual hosts setup guide, корень документа вашего сайта может быть другим.

Затем раскомментируйте строкуServerName и заменитеwww.example.com своим доменным именем или IP-адресом сервера (в зависимости от того, какой из них вы указали в качестве общего имени в своем сертификате):

/etc/httpd/conf.d/ssl.conf


. . .
DocumentRoot "/var/www/example.com/public_html"
ServerName www.example.com:443

Затем найдите строкиSSLProtocol иSSLCipherSuite и удалите их или закомментируйте. Конфигурация, которую мы вставим через мгновение, предложит более безопасные настройки, чем настройки по умолчанию, включенные в Apache CentOS:

/etc/httpd/conf.d/ssl.conf

. . .
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

Найдите строкиSSLCertificateFile иSSLCertificateKeyFile и измените их на каталог, который мы создали в/etc/httpd/ssl:

/etc/httpd/conf.d/ssl.conf

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

Теперь мы закончили с изменениями в фактическом блокеVirtualHost. Следующие изменения произойдут после конечного тега</VirtualHost> в этом же файле.

Настройка параметров безопасного SSL

Далее, чтобы настроить Apache SSL более безопасно, мы будем использовать рекомендацииRemy van Elst на сайтеCipherli.st. Этот сайт предназначен для предоставления простых в использовании настроек шифрования для популярного программного обеспечения. Вы можете узнать больше о его решениях относительно выбора Apachehere.

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

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

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

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

Найдите минутку, чтобы прочитатьHTTP Strict Transport Security, or HSTS и, в частности,“preload” functionality. Предварительная загрузка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если ее случайно включить или включить неправильно. В этом руководстве мы не будем предварительно загружать настройки, но вы можете изменить их, если уверены, что понимаете последствия.

Еще одно изменение, которое мы внесем, - это закомментировать директивуSSLSessionTickets, поскольку она недоступна в версии Apache, поставляемой с CentOS 7.

Вставьте в настройках с сайтаAFTER конец блокаVirtualHost:

/etc/httpd/conf.d/ssl.conf

    . . .

. . .

# Begin copied text
# 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
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

Когда вы закончите вносить эти изменения, вы можете сохранить и закрыть файл.

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

Чтобы перенаправить весь трафик на шифрование SSL, создайте и откройте файл, заканчивающийся на.conf, в каталоге/etc/httpd/conf.d:

sudo vi /etc/httpd/conf.d/non-ssl.conf

Внутри создайте блокVirtualHost для соответствия запросам на порту 80. Внутри используйте директивуServerName, чтобы снова сопоставить ваше доменное имя или IP-адрес. Затем используйтеRedirect, чтобы сопоставить любые запросы и отправить их на SSLVirtualHost. Обязательно включите косую черту:

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


        ServerName www.example.com
        Redirect "/" "https://www.example.com/"

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

Шаг четвертый: активировать сертификат

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

Сначала проверьте ваш файл конфигурации на наличие синтаксических ошибок, набрав:

sudo apachectl configtest

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

Output. . .
Syntax OK

Перезапустите сервер Apache, чтобы применить ваши изменения, набрав:

sudo systemctl restart httpd.service

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

Если у вас запущен брандмауэрfirewalld, вы можете открыть эти порты, набрав:

sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

Если у вас запущен брандмауэрiptables, команды, которые вам нужно запустить, сильно зависят от вашего текущего набора правил. Для базового набора правил вы можете добавить доступ по HTTP и HTTPS, набрав:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

В веб-браузере попробуйте зайти на свое доменное имя или IP-адрес с помощьюhttps://, чтобы увидеть новый сертификат в действии.

https://example.com/

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

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

Заключение

Вы настроили сервер Apache для обработки запросов HTTP и HTTPS. Это поможет вам безопасно общаться с клиентами и избежать возможности чтения вашего трафика сторонними лицами.

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

Related