HTTPS для сайта на WordPress под управлением nginx.

В последнее время наблюдается бум перехода на HTTPS не только для интернет магазинов, но и для информационных сайтов, коими по большей части и являются сайты, созданные на популярной платформе WordPress. Двигателем подобного перехода послужило заявление создателей Chromium о маркировке сайтов без HTTPS как небезопасных. Движок Chromium используется во многих популярных браузерах (основной тут конечно Google Chrome). Кроме того, Google заявил об изменении в ранжировании сайтов и приоритизации в выдаче ресурсов, использующих безопасное соединение.

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

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

UPD: В связи с появлением атаки Weak Diffie-Hellman and the Logjam Attack статья обновлена. Проверьте свои сайты на предмет уязвимости к этой атаке!

В статье предполагается, что наш сервер использует nginx в качестве веб сервера. Если ваш сайт все еще использует Apache, советую задуматься о переходе, так как это даст достаточно приличный прирост производительности и позволит использовать последний тренд в оптимизации HTTPS — технологию SPDY. Подробная инструкция по настройке WordPress на nginx доступна по ссылке: Руководство по настройке блога WordPress на nginx.

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

Все операции по настройке HTTPS можно разделить на 4 этапа:

  1. Получение сертификата.
  2. Настройка nginx.
  3. Настройка WordPress.
  4. Проверка результата.

Получение сертификата.

В данной главе мы поговорим о получении бесплатного валидного сертификата от компании StartSSL. Конечно есть ненулевая вероятность того, что в старых браузерах нет их корневого сертификата, но по итогам установки их сертификата на сервер Admins.SU, не встретилось ни одного клиента с подобной проблемой. Большинство элементов сайта StartSSL.com русифицировано, так что с регистрацией проблем возникнуть не должно, но на всякий случай опишу все шаги.

  1. Перейдем на страницу https://www.startssl.com/?app=12

Если мы попробуем сразу зайти в контрольную панель по кнопке Authenticate, то получим ошибку: При соединении с auth.startssl.com произошла ошибка. SSL-узлу не удалось договориться о приемлемом наборе параметров безопасности. (Код ошибки: ssl_error_handshake_failure_alert). Все дело в том, что аутентификация происходит по сертификату, который необходимо получить в результате регистрации.

Так что для начала нажмем на кнопку Sign-up.

  1. Заполним все требуемые поля. Пусть вас не вводит в заблуждение отсутствие звездочки напротив телефона. Без него регистрация не пройдет

  2. Получим на почту код подтверждения, который и введем на сайте.

  3. После завершения регистрации в браузер пропишется сертификат, по которому и будет осуществлен доступ в панель управления StartSSL.

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

В Google Chrome:

a. Войдите в настройки Google Chrome. b. На главной странице настроек снизу нажмите «Показать дополнительные настройки». c. В секции HTTPS/SSL найдите кнопку «Настроить сертификаты» и нажмите на нее. d. Во вкладке «Личные» найдите ваш сертификат от StartCom выданный, на вашу почту. e. Выберите этот сертификат и нажмите «Экспорт». f. В меню про экспорт закрытого ключа выберите «Да, экспортировать закрытый ключ». g. В следующем окне отметьте галочками «Включить по возможности все сертификаты в путь сертификации» и «Экспортировать все расширенные свойства». h. Укажите имя файла, в который вы сохраните сертификат i. После сохранения файла сохраните его в надежном месте.

В Firefox:

a. Войдите в настройки Firefox. b. Перейдите в меню «Дополнительные». c. Откройте вкладку «Сертификаты». d. Нажмите на кнопку «Просмотр сертификатов». e. Перейдите во вкладку «Ваши сертификаты». f. Найдите ваш сертификат на имя почты. g. Нажмите на кнопку «Сохранить копию». h. Укажите имя файла имя файла и нажмите «Сохранить». i. Укажите пароль для сертификата. Нажмите ОК.

Теперь можно зайти на страницу https://auth.startssl.com/

  1. На странице https://auth.startssl.com/ нажмем на кнопку «Contol Panel».

  2. Перейдем по вкладке «Validations Wizard».

  3. В поле Type укажем «Domain Name Validation».Нажмем Continue.

  4. На странице «Enter Domain Name» укажем имя домена. Нажмем Continue.

  5. На следующей странице необходимо указать email, с помощью которого будет проходить валидация. Это адреса postmaster/hostmaster/webmaster @ ИМЯ_домена или адрес, на который домен зарегистрирован. Выберем любой удобный и нажмем Continue.

  6. На почту придет «Authentication Code», который необходимо будет ввести на странице валидации.

  7. Перейдем по вкладке «Certificates Wizard».

  8. В поле «Certificate Target:» выберем Web Server SSL/TLS Certificate. Нажмем Continue.

  9. На странице «Generate Private Key» можно либо создать новый Private Key, либо пропустить этот шаг, нажав Skip, чтобы использовать свой Private Key. Если вы создаете новый, то необходимо ввести пароль (Key Password) от 10 символов, длину ключа (Keysize) и алгоритм (Secure Hash Algorithm). Длина ключа 2048 обычно достаточна, алгоритм SHA1 не подходит для новых браузеров, так что выберем SHA2. После этого нажмем Continue.

  10. Выберем наш домен из выпадающего списка и нажмем Continue.

  11. Теперь необходимо указать субдомен, обычно это WWW.ИМЯ_ДОМЕНА. После этого нажмем Continue и на следующей странице снова Continue.

  12. На следующей странице мы получим код сертификата, который необходимо сохранить. В ряде случаев сервис может сообщить, что для выпуска сертификата требуется время. В этом случае уведомление о выпуске придет на почту, а получить сертификат можно будет на вкладке «Tool Box» по ссылке «Retrieve Certificate».

  13. После генерации личного ключа, его можно расшифровать с помощью команды «openssl rsa -in ssl.key -out ssl.key», либо в Tool Box сайта StartSSL по ссылке «Decrypt Private Key». Можно этого не делать, но тогда каждый раз при перезапуске nginx придется указывать этот пароль. С другой стороны это безусловно повысит уровень безопасности.

Настройка nginx.

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

  1. Сохраним все необходимые сертификаты на сервере с nginx:
1
sudo mkdir /etc/nginx/ssl && cd $_

1.1. Данный пункт появился в связи с новой атакой Weak Diffie-Hellman and the Logjam Attack. Для унификации инструкции, данный пункт обязателен для любой версии Linux, т.к. ниже в конфигах на него идут отсылки.

Исполним данный код:

1
2
3
4
5
6
sudo mkdir -p /etc/nginx/ssl/private
sudo chmod 710 /etc/nginx/ssl/private

cd /etc/nginx/ssl/private
sudo openssl dhparam -out dhparams.pem 2048
sudo chmod 600 dhparams.pem
  1. В файл вставим полученный ранее Private key:
1
2
cd /etc/nginx/ssl
sudo nano private.key
  1. В файле сохраним полученный сертификат. Вместо %SITENAME% укажите имя своего домена:
1
sudo nano %SITENAME%.pem
  1. Скачаем вышестоящий сертификат:
1
sudo wget https://www.startssl.com/certs/sub.class1.server.ca.pem
  1. Произведем склейку сертификатов для дальнейшего использования в nginx. Вместо %SITENAME% необходимо указать имя вашего домена:
1
cat %SITENAME%.pem sub.class1.server.ca.pem > %SITENAME%-chain.pem
  1. Изменим конфигурационный файл nginx для работы по HTTPS. Вместо %SITENAME% укажите имя своего домена без WWW:
1
sudo nano /etc/nginx/conf.d/%SITENAME%.conf
  1. В секции Server найдем параметр listen, исправим порт с 80 на 443, добавим ключи ssl и spdy:
1
2
# listen *:80;
listen *:443 ssl spdy;
  1. После строки с параметром index вставим следующее, не забыв сменить %SITENAME% на имя домена без WWW:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Включить поддержку ssl.
ssl on;
# Путь до файла, содержащего склеенный сертификат домена и вышестоящего узла
ssl_certificate /etc/nginx/ssl/%SITENAME%-chain.pem;
# Путь до Private Key
ssl_certificate_key /etc/nginx/ssl/private.key;
# Разрешенные протоколы. SSL3 дырявый, SSL2 старый. TLSv1 оставляем только для совместимости со старыми браузерами. Если таких нет, лучше удалить.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Виды разрешенных шифров. Указаны наиболее распространенные, исключая небезопасные.
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
# Исключаем возможность BEAST-атаки.
ssl_prefer_server_ciphers on;
# Исключаем возможность атаки Weak Diffie-Hellman and the Logjam Attack
ssl_dhparam /etc/nginx/ssl/private/dhparams.pem;
# Время жизни SSL сессии.
ssl_session_cache shared:SSL:10m;
# Таймаут сессии.
ssl_session_timeout 5m;
#Позволяет серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей.
ssl_stapling on;
# Требуется для ssl_stapling.
resolver 8.8.8.8 8.8.4.4;
# HSTS. Механизм, активирующий форсированное защищённое соединение по HTTPS
add_header Strict-Transport-Security max-age=31536000;
  1. Теперь перейдем в конец файла и добавим новую секцию Server для настройки переадресации с HTTP на HTTPS с возможностью передачи картинок по HTTP (сделано для нормальной индексации картинок Yandex картинками):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Не забудьте изменить %SITENAME% на имя домена.
server {
listen *:80;
server_name %SITENAME% www.%SITENAME%;
access_log /var/log/nginx/%SITENAME%.access.log;
error_log /var/log/nginx/%SITENAME%.error.log;
root /srv/%SITENAME%;
index index.php;
# Для всех файлов кроме php, отключить логирование, установить максимальный срок жизни кэша.
location ~* ^.+\.(jpg|jpeg|gif|png|ico|bmp)$ {
access_log off; log_not_found off; expires 60d;
}
location / {
# Перенаправим все остальные запросы на HTTPS.
return 301 https://$server_name$request_uri;
}
  1. После сохранения файла проверим конфигурационный файл:
1
sudo nginx -t

Если все сделано правильно, перезапустим nginx:

1
service nginx restart

Настройка WordPress.

Для нормальной работы WordPress по HTTPS необходимо изменить его настройки. Для этого воспользуемся wp-cli.

Скачаем wp-cli:

1
2
cd ~/
curl -L https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar > wp-cli.phar

Дадим wp-cli права на выполнение, переместим его в директорию из PATH, проверим работоспособность:

1
2
3
sudo chmod +x /usr/bin/wp-cli.phar
sudo mv /usr/bin/wp-cli.phar /usr/bin/wp
wp --version

Теперь перейдем в директорию с сайтом и выполним команду wp search-replace. Вместо %SITENAME% укажите имя своего домена без WWW:

1
wp search-replace 'http://%SITENAME%' 'https://%SITENAME%'

Поздравляю, настройка завершена. Осталось зайти в административную панель WordPress и удалить кэши.

Проверка результата.

Убедившись, что сайт теперь полностью под властью SSL, можно проверить настройки на стандартные проблемы в безопасности с помощью замечательного ресурса https://www.ssllabs.com

На момент написания статьи сайт с приведенными выше настройками заработал оценку A+.

ВАЖНО: статья не прошла боевого крещения и возможно не учитывает каких либо индивидуальных тонкостей в настройке. Если у вас возникли проблемы с использованием HTTPS и вы следовали выше приведенной инструкции, пожалуйста не стесняйтесь оставлять комментарии, я обязательно помогу.


Смотрите также

comments powered by Disqus