Как настроить SSL и HTTPS для WordPress

Настраивал недавно на нескольких WordPress сайтах SSL сертификаты.

Сайты были размещены на выделенном сервере под управление Ubuntu, по этому первым делом я создал директорию для сертификатов и перешел в неё:

sudo mkdir /etc/apache2/ssl
cd /etc/apache2/ssl

Включим модуль SSL для Apache2 если он не включен:

sudo a2enmod ssl

Далее сгенерировал сертификат:

sudo openssl req -nodes -newkey rsa:2048 -keyout /etc/apache2/ssl/example.com.key -out /etc/apache2/ssl/example.com.csr

В процессе генерации пришлось ответить на несколько вопросов:
Country Name (2 letter code) [AU]: UA (код страны)
State or Province Name (full name) [Some-State]: Sumy (область)
Locality Name (eg, city) []: Romny (город)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Private person (частное лицо или имя организации)
Organizational Unit Name (eg, section) []: (пусто или имя отдела организации)
Common Name (e.g. server FQDN or YOUR name) []: example.com (имя домена, без http и https)
Email Address []: admin@example.com

Можно также подписать сгенерированный сертификат (это содержимое example.com.csr) у какого нибудь доменного регистратора.
Процедура стоит дешево и после неё при подключении не будет высвечиваться сообщение что сертификат не подписан.

Так как сайтов несколько, то в директории /etc/apache2/sites-enabled/ расположены конфигурационные файлы для каждого из них.
Выберу один из них и в самом конце после стандартной директивы:

<VirtualHost *:80> ...</VirtualHost>

добавим еще одну, но с 443 портом и укажем пути к сертификатам:

<VirtualHost *:443>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/
        <Directory />
                Options -Indexes
                AllowOverride All
        </Directory>
        <Directory /var/www/example.com/>
                Options -Indexes
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/example_com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example_com.key
SSLCertificateChainFile /etc/apache2/ssl/example_com.ca-bundle
ErrorLog /var/log/apache2/example_error-ssl.log
LogLevel warn
CustomLog /var/log/apache2/example_access-ssl.log combined
</VirtualHost>

После изменений проверим конфигурацию и перезапустим apache2:

sudo apachectl configtest 
sudo service apache2 restart

Чтобы можно было зайти в WordPress и админку только по HTTPS в wp-config.php раскомментируем следующие параметры:

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

Также можно в админке, в «Настройки» — «Общие» изменить адрес сайта с http:// на https://.
В robots.txt укажем адрес сайта с https, например:

Host: https://ixnfo.com

Также в sitemap.xml должны быть ссылки с https.
В поисковиках нужно подать заявку на переиндексацию карты сайта, в Яндекс.Вебмастер подать заявку в «Переезд сайта» поставив галочку «Добавить HTTPS».
В Google Search Console нужно добавить этот же сайт с https, он будет индексироваться отдельно от http.

Все, теперь сайт можно открывать по https.

Смотрите также мою статью — Перенаправление запросов на SSL

Настройка HTTPS в Apache

Приведу пример настройка HTTPS в Apache с использованием самоподписанного ключа.

Создадим ключ и сертификат:

openssl req -new -x509 -days 365 -keyout server.key -out server.pem

На вопрос «Enter PEM pass phrase:» вводим пароль и запоминаем его. На остальные вопросы можно просто нажимать Enter соглашаясь с предложенными вариантами, только на вопрос «Common Name (e.g. server FQDN or YOUR name):» вводим имя сайта, для которого создается сертификат, например www.example.com.
После ответов на вопросы в директории появятся два файла server.pem и server.crt (ключ и сертификат).
Apache при загрузке будет спрашивать пароль от ключа ранее нами введенный, поэтому снимаем пароль с ключа:

cp server.key{,.orig}
openssl rsa -in server.key.orig -out server.key
rm server.key.orig

Скопируем файлы в директорию /etc/ssl и выставим файлу ключа права чтения только для администратора:

sudo cp server.pem /etc/ssl/certs/
sudo cp server.key /etc/ssl/private/
sudo chmod 0600 /etc/ssl/private/server.key

Активируем ssl модуль apache2:

sudo a2enmod ssl

Включаем настройки default-ssl:

sudo a2ensite default-ssl

Отредактируем файл настроек /etc/apache2/sites-enabled/default-ssl.conf:
После директивы SSLEngine on добавим строку SSLProtocol all -SSLv2 запретив использование устаревшего протокола SSLv2.
Изменим пути к фалам:

SSLCertificateFile  /etc/ssl/certs/server.pem
SSLCertificateKeyFile /etc/ssl/private/server.key

Перезапустим Apache2 чтобы изменения вступили в силу:

sudo service apache2 restart

Протокол HTTPS работает по 443 порту, если используется фаервол, то необходимо открыть этот порт.

Если нужно использовать только HTTPS и запретить HTTP, то активируем mod_rewrite:

sudo a2enmod rewrite

И отредактируем файл /etc/apache2/sites-enabled/000-default.conf:

<VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

Снова перезапустим Apache2 чтобы изменения вступили в силу:

sudo service apache2 restart

Теперь например при открытии адреса http://www.example.com, сервер автоматически будет переадресовывать на https://www.example.com.

Как установить подписанный сертификат смотрите в моей статье:
Установка Certbot в Ubuntu