Появилась задача, обновить ssl сертификат на одном из сайтов. В прошлом году настраивал его, тестировал на ssllabs, была оценка A. Сегодня после продления сертификата решил протестировать сайт, выдал оценку B.
В течении года были некоторые работы с веб сервером, в результате которых видимо сменились дерективы к конфигурации хоста.
Что было сделано:
- исключены не безопасные протоколы
- настроены предпочитаемые алгоритмы шифрования
- настройка HTST
- добавлены CAA записи для домена
Попутно обновили OpenSSL.
1) Исключены не безопасные протоколы
В настройках виртуального хоста, добавлена деректива SSLProtocol в которые введены ограничения по доступным протоколом, в частности исключены SSLv2,3 и TLSv1,1.1
1 2 |
SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 |
2) Настроены предпочитаемые алгоритмы шифрования
Добавлена деректива SSLHonorCipherOrder для использования предпочтений сервера, в выборе используемого алгоритма шифрования, так же опция ON, определяет дерективу SSLCipherSuite как упорядоченный список значений алгоритмов для шифрования соединения.
В SSLCipherSuite запрещены все алгоритмы шифрования, кроме описанных. Порядок их применения с лева на право.
1 2 3 4 |
SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder on SSLCipherSuite "-ALL:EECDH+aRSA+AESGCM:EDH+aRSA+AESGCM:EECDH+aRSA+AES:EDH+aRSA+AES" |
3) Настройка HTST(HTTP Strict Transport Security)
Механизм, принудительно активирующий защищённое соединение через протокол HTTPS. Для его настройки в Apache 2.4 необходимо проверить чтоб был загружен модуль mod_headers.so.
В виртуальный хост необходимо добавить дерективу Header с параметрами Strict-Transport-Security. Параметр max-age рекомендованный ssllabs 180 дней.
1 2 3 4 5 6 |
<VirtualHost *:443> #........... ServerName example.com Header always set Strict-Transport-Security "max-age=15552000;" #........... </VirtualHost> |
4) Добавлены CAA(Certification Authority Authorization) записи для домена
Данная запись собственно абсолютно опциональна, ее суть только в том, что в ней указывается как УЦ может издать для данного домена сертификаты. Собственно если вы укажите в что только Lets`Encrypt, то другие авторизованные УЦ не будут выпускать сертификат под ваш домен.
Собственно можно использоваться два варианта записи с @ для хоста домена, и с * для всех субдоменов домена на этом хосте. Так же в записи есть флаг критичности, 0 — УЦ будут смотреть запись и могут ей не следовать, 128 — будут следовать записи, то есть при ноль другой УЦ может выпустить сертификат при 128 не будет выпускать. Tag — что должно быть в значении, issue — домен центра сертификации, issuewild — домен центра сертификации для wildcard-сертификатов, iodef — email (в формате «mailto:email@example.com») или http/https url куда ЦС будет направлена информация о запросах на выдачу сертификатов, нарушающих правила CAA.
Сама запись:
1 |
@ 128 issue "letsencrypt.org" |
Важно, чтоб в проверке ssllab — DNS CAA было принято, необходимо использовать флаг 128, при нулевом будет выглядеть так же как и без записи.
Полный листинг виртуального хоста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<VirtualHost *:443> ServerName example.com Header always set Strict-Transport-Security "max-age=15552000;" ServerAdmin info@example.com DocumentRoot /home/example.com/web/example.com/public_html ScriptAlias /cgi-bin/ /home/example.com/web/example.com/cgi-bin/ Alias /vstats/ /home/example.com/web/example.com/stats/ Alias /error/ /home/example.com/web/example.com/document_errors/ CustomLog /var/log/httpd/domains/example.com.bytes bytes CustomLog /var/log/httpd/domains/example.com.log combined ErrorLog /var/log/httpd/domains/example.com.error.log <Directory /home/example.com/web/example.com/public_html> AllowOverride All SSLRequireSSL Options +Includes -Indexes +ExecCGI php_admin_value open_basedir /home/example.com/yii2:/home/example.com/web/example.com/public_html:/home/example.com/tmp php_admin_value upload_tmp_dir /home/example.com/tmp php_admin_value session.save_path /home/example.com/tmp </Directory> <Directory /home/example.com/web/example.com/stats> AllowOverride All </Directory> SSLEngine on SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder on SSLCipherSuite "-ALL:EECDH+aRSA+AESGCM:EDH+aRSA+AESGCM:EECDH+aRSA+AES:EDH+aRSA+AES" SSLVerifyClient none SSLCertificateFile /home/example.com/conf/web/ssl.example.com.crt SSLCertificateKeyFile /home/example.com/conf/web/ssl.example.com.key SSLCertificateChainFile /home/example.com/conf/web/ssl.example.com.ca <IfModule mod_ruid2.c> RMode config RUidGid user user RGroups apache </IfModule> <IfModule itk.c> AssignUserID user user </IfModule> IncludeOptional /home/example.com/conf/web/shttpd.example.com.conf* </VirtualHost> |
Данный виртуальный хост используется в панели VestaCP.
Так же вы можете посмотреть пример настройки конфигурации Nginx для прохождения теста ssllab на A+ в статье Настройка A+ на ssllab (Nginx)
Добавить комментарий