HTTPS - это базовая настройка безопасности для всех веб-сайтов. Чтобы включить HTTPS и избежать раздражающей ошибки «сертификат не доверяет» в браузерах, вам необходимо получить сертификат от доверенного эмитента и установить его на свой сервер.
Let's Encrypt - это бесплатный, автоматизированный и открытый центр сертификации. С letsencrypt вы можете бесплатно защитить свой сервер с помощью HTTPS.
В этом посте я расскажу, как защитить ваш сервер nodejs с помощью letsencrypt-express (теперь переименованного в greenlock-express). Хотя в названии есть express, вы все равно можете использовать его на своем неэкспресс-сервере nodejs.
Сначала создадим тестовый сервер:
const http = require('http'); function handler(req, res) { res.end('Hello World!'); } http.createServer(handler).listen(80);
Он прослушивает порт 80 и отвечает «Hello World!» На любой запрос.
Далее вам нужно включить HTTPS, запустив https-сервер:
const http = require('http'); const https = require('https'); function handler(req, res) { res.end('Hello World!'); } http.createServer(handler).listen(80); https.createServer(handler).listen(443)
Сервер https сейчас не работает, так как вы еще не указали для него сертификат.
Теперь используйте letsencrypt-express (greenlock-express) для создания оболочки обработчика: (2018–05–20: следующий код был обновлен для поддержки Let's Encrypt v2)
const PROD = false; const lex = require('greenlock-express').create({ version: 'draft-11', server: PROD ? 'https://acme-v02.api.letsencrypt.org/directory' : 'https://acme-staging-v02.api.letsencrypt.org/directory', approveDomains: (opts, certs, cb) => { if (certs) { // change domain list here opts.domains = ['example.com', 'yourdomain.com'] } else { // change default email to accept agreement opts.email = '[email protected]'; opts.agreeTos = true; } cb(null, { options: opts, certs: certs }); } // optional: see "Note 3" at the end of the page // communityMember: true }); const middlewareWrapper = lex.middleware;
Вам необходимо изменить список доменов и адрес электронной почты по умолчанию в функции approveDomains
в соответствии с вашими потребностями.
Возвращенный объект middlewareWrapper
- это функция, которая принимает любой обработчик со следующей формой и возвращает промежуточное ПО с той же формой:
function(req, res, next)
Это хорошо, потому что его можно использовать в разных веб-фреймворках. Теперь оберните им обработчик запросов https:
https.createServer( lex.httpsOptions, middlewareWrapper(handler) ).listen(433);
Вот и все! Протестируйте свой сервер с помощью HTTPS, если все в порядке, установите для PROD значение true, перезапустите, и ваш сервер будет хорошо защищен HTTPS.
По желанию:
Вы можете перенаправить весь HTTP-запрос на HTTPS, применив следующий код к своему HTTP-серверу:
const redirectHttps = require('redirect-https'); http.createServer(lex.middleware(redirectHttps())).listen(80);
Срок действия сертификата Letencrypt истекает через 90 дней, но вам совсем не о чем беспокоиться, letencrypt-express
будет обновлять сертификат каждые 80 дней в фоновом режиме. Нулевое время простоя!
Примечание 1. Обязательно сначала протестируйте свой сервер с промежуточным сервером (PROD = false), а после завершения проверки установите для PROD значение true. В противном случае возможно, что вы будете заблокированы из-за превышения лимита скорости с ошибочными запросами.
Примечание 2: при тестировании вашего сервера в промежуточном режиме (PROD = false) браузер будет жаловаться, что сертификат не является доверенным. Это совершенно нормально, примите сертификат и посмотрите, доступен ли ваш сайт и работает ли он нормально. Если все в порядке, переходите к PROD.
Примечание 3: По словам сопровождающего Greenlock AJ ONeal, вы можете добавить дополнительную опцию communityMember: true при создании оболочки обработчика. Это позволит вам получать важные обновления о гринлоке, а также о связанных инструментах.