Прикручиваем бесплатный китайский HTTPS на nginx
Почему-то на днях взбрело мне в голову сделать HTTPS на своем старом-древнем проекте audiocoding.ru. Не могу сказать, что он там хоть сколько-то необходим. Да он по сути там и не нужен. Но, несколько поводов для этого странного действия у меня все же было. Во-первых, я никогда не касался установки и настройки HTTPS, очень хотелось заполнить этот пробел. Во-вторых, являясь большим почитателем Mozilla, я прознал, что у них есть некоторые туманные планы по постепенному отказу от HTTP. В общем, в любом случае, введение опционального HTTPS на моем информационном сайте хоть пользы бы и не принесло, но и вряд ли бы помешало. Таким образом, я решил поделиться своей небольшой историей. Попытаюсь не вдаваться в глубокие технические детали, а лучше приведу несколько ссылок в конце заметки.
WoSign бесплатный сертификат на 3 года
Началось все с того, что я узнал про возможность получения бесплатного сертификата на WoSign на 3 года. Меня это заинтересовало, потому что раньше я слышал только про платные и достаточно дорогие сертификаты. Пришлось столкнуться с трудностями в лице китайского языка, но за халяву можно было и потерпеть, правда? Какое-то время поковырявшись, я смог оставить заявку на получение. На следующий день мне на почту пришло письмо, что я могу его забирать. Пройдя по ссылке в письме, мне предоставили возможность загрузить сертификат в запароленном архиве (пароль вы вводите в момент создания заявки). В общем, все отлично сертификат был на руках.
nginx и небольшие подвохи
Естественно нужно было загрузить сертификаты на сервер и что-то с ними сделать. Перечитав немного информации в Интернете, действия сложными не были. Прикладываю вырезки конфигурации nginx-сервера:
http {
...
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
resolver 8.8.8.8 8.8.4.4;
...
server {
listen 80;
listen 443 ssl;
server_name audiocoding.ru;
ssl_certificate path/to/cretificate.crt;
ssl_certificate_key path/to/key.key;
# Этот заголовок заставляет браузер использовать HTTPS принудительно в течении недели,
# но чтобы это сработало, пользователь хоть раз должен зайти на HTTPS-версию сайта.
add_header Strict-Transport-Security 'max-age=604800';
...
}
...
}
Собственно, все казалось бы хорошо, configtest
показывает [ OK ]
, сервер рестартится успешно, но сайт не открывается. Я уже было начал ломать голову, как вдруг какой-то ответ на stackoverflow.com заставил меня сделать фейспалм. Дело в том, что в какие-то времена фанатичности я закрыл все порты в iptables
, кроме 80 и 22. Ну так, недолго думая, открыл еще и 443. Все заработало, сертификат всеми браузерами воспринимается как доверенный. Что ж, поживем – увидим. Быть может, позднее будут какие-то проблемы с Chrome. Китайский сертификат и Google все таки вещи слабосовместимые.
add_header
я все же закомментарил после этих размышлений…
Производительность HTTP против HTTPS
Ну конечно же, мне не могло не прийти в голову, что наверное HTTPS теперь будет медленнее HTTP. Решил прогнать свою главную страницу через siege
, команду выбрал достаточно простую:
siege -b -t10s -c50 http://audiocoding.ru/
Для HTTPS аналогично.
Итак, тесты для HTTP показали:
Transactions: 823 hits
Availability: 100.00 %
Elapsed time: 9.57 secs
Data transferred: 15.18 MB
Response time: 0.56 secs
Transaction rate: 86.00 trans/sec
Throughput: 1.59 MB/sec
Concurrency: 48.56
Successful transactions: 823
Failed transactions: 0
Longest transaction: 1.01
Shortest transaction: 0.17
Для HTTPS:
Transactions: 622 hits
Availability: 100.00 %
Elapsed time: 9.68 secs
Data transferred: 11.47 MB
Response time: 0.75 secs
Transaction rate: 64.26 trans/sec
Throughput: 1.19 MB/sec
Concurrency: 48.24
Successful transactions: 622
Failed transactions: 0
Longest transaction: 1.26
Shortest transaction: 0.29
Таким образом, делаем вывод, что HTTPS замедлил работу сайта на 25%. Да, это на самом деле много в относительном значении. В абсолюнтых показателях, взяв кратчайшее время, 170 мс против 290 мс – разница вроде бы и не велика, но все равно ощутима. В общем-то отчасти еще и поэтому, поддержку HTTPS я оставлю опциональной.
Ах да, чуть не забыл, тесты выполнялись на виртуальной машине за $10 в облаке DigitalOcean (1GB RAM, 1 ядро CPU, 30GB SSD). Географически siege
запускался в Москве, сервер при этом находился в Амстердаме.
Ссылки
Как и обещал, прикладываю несколько тематических ссылок, чтобы вам было проще разобраться с материалом: