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