rsz_https-nginx2

В последнее время наблюдается бум перехода на 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.

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

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

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

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

В 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/

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

7. Перейдем по вкладке «Validations Wizard».
8. В поле Type укажем «Domain Name Validation».Нажмем Continue.
9. На странице «Enter Domain Name» укажем имя домена. Нажмем Continue.
10. На следующей странице необходимо указать email, с помощью которого будет проходить валидация. Это адреса postmaster/hostmaster/webmaster @ ИМЯ_домена или адрес, на который домен зарегистрирован. Выберем любой удобный и нажмем Continue.
11. На почту придет «Authentication Code», который необходимо будет ввести на странице валидации.

12. Перейдем по вкладке «Certificates Wizard».
13. В поле «Certificate Target:» выберем Web Server SSL/TLS Certificate. Нажмем Continue.
14. На странице «Generate Private Key» можно либо создать новый Private Key, либо пропустить этот шаг, нажав Skip, чтобы использовать свой Private Key. Если вы создаете новый, то необходимо ввести пароль (Key Password) от 10 символов, длину ключа (Keysize) и алгоритм (Secure Hash Algorithm). Длина ключа 2048 обычно достаточна, алгоритм SHA1 не подходит для новых браузеров, так что выберем SHA2. После этого нажмем Continue.
15. Выберем наш домен из выпадающего списка и нажмем Continue.
16. Теперь необходимо указать субдомен, обычно это WWW.ИМЯ_ДОМЕНА. После этого нажмем Continue и на следующей странице снова Continue.
17. На следующей странице мы получим код сертификата, который необходимо сохранить. В ряде случаев сервис может сообщить, что для выпуска сертификата требуется время. В этом случае уведомление о выпуске придет на почту, а получить сертификат можно будет на вкладке «Tool Box» по ссылке «Retrieve Certificate».
18. После генерации личного ключа, его можно расшифровать с помощью команды «openssl rsa -in ssl.key -out ssl.key», либо в Tool Box сайта StartSSL по ссылке «Decrypt Private Key». Можно этого не делать, но тогда каждый раз при перезапуске nginx придется указывать этот пароль. С другой стороны это безусловно повысит уровень безопасности.

Настройка nginx.

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

1. Сохраним все необходимые сертификаты на сервере с nginx:

 

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

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

 

2. В файл вставим полученный ранее Private key:

3. В файле сохраним полученный сертификат. Вместо %SITENAME% укажите имя своего домена:

4. Скачаем вышестоящий сертификат:

5.Произведем склейку сертификатов для дальнейшего использования в nginx. Вместо %SITENAME% необходимо указать имя вашего домена:

6. Изменим конфигурационный файл nginx для работы по HTTPS. Вместо %SITENAME% укажите имя своего домена без WWW:

7. В секции Server найдем параметр listen, исправим порт с 80 на 443, добавим ключи ssl и spdy:

8. После строки с параметром index вставим следующее, не забыв сменить %SITENAME% на имя домена без WWW:

9. Теперь перейдем в конец файла и добавим новую секцию Server для настройки переадресации с HTTP на HTTPS с возможностью передачи картинок по HTTP (сделано для нормальной индексации картинок Yandex картинками):

9. После сохранения файла проверим конфигурационный файл:

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

Настройка WordPress.

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

Скачаем wp-cli:

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

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

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

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

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

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

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