
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 при создании оболочки обработчика. Это позволит вам получать важные обновления о гринлоке, а также о связанных инструментах.