ADN Open CIS
Сообщество программистов Autodesk в СНГ

07/04/2017

Включение поддержки https для локального nodejs

Для трехсторонней проверки подлинности (3-legged) некоторым службам требуется URL-адрес обратного вызова протокола https. В таком случае, чтобы локально проверить свой веб-сервис, вам нужно будет добавить поддержку https.

Одним из способов достижения этого в случае реализации проекта на nodejs является выполнение следующих двух шагов:

1) Создайте сертификат SSL и ключ для localhost

Комбинация двух ответов на stackoverflow имеет достаточно необходимой информации для выполнения обоих шагов. Ниже приведен пример генерации сертификатов в терминале:

- Создайте сертификат SSL для localhost (ссылка).

Код - PowerShell: [Выделить]
  1. openssl genrsa -des3 -out server.key 1024

- Здесь вам нужно ввести пароль, который вам нужно ввести на следующих шагах
(при запросе типа «Common Name» введите: localhost)

Код - PowerShell: [Выделить]
  1. openssl req -new -key server.key -out server.csr
  2. openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt

Кроме того, не забудьте пароль, который вы использовали, поскольку он понадобится нам на следующем шаге.

2) Используйте модуль https nodejs для маршрутизации всех ресурсов через https

Первоначально у меня был такой код:

Код - JavaScript: [Выделить]
  1. var app = require('./server/server');
  2. // Запустить сервер
  3. var server = app.listen(app.get('port'), function () {
  4.     console.log('Начинаем в ' + (new Date()).toString());
  5.     console.log('Сервер слушает на порту ' + server.address().port);
  6. });

Затем я добавил ссылку на модули https и fs в файле package.json и изменил код следующим образом:

Код - JavaScript: [Выделить]
  1. var app = require('./server/server');
  2. // Настройка локальной поддержки https
  3. var fs = require('fs');
  4. var https = require('https');
  5.  
  6. var options = {
  7.     key: fs.readFileSync('/etc/apache2/ssl/server.key'),
  8.     cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
  9.     passphrase: '<пароль, который вы использовали для сертификата>',
  10.     requestCert: false,
  11.     rejectUnauthorized: false
  12. };
  13. // Запустить сервер
  14. var server = https.createServer(options, app).listen(app.get('port'), function () {
  15.     console.log('Начинаем в ' + (new Date()).toString());
  16.     console.log('Сервер слушает на порту ' + server.address().port);
  17. });

Чистовая версия вашего веб-сервиса, вероятно будет опубликована там, где существует поддержка https по умолчанию (например, heroku), потому там не потребуется ваш самозаверяющийся сертификат.
 В таком случае лучше всего объединить два решения и переключаться между ними в зависимости от среды:

Код - JavaScript: [Выделить]
  1. var app = require('./server/server');
  2. // В случае рабочей среды (например, herokuapp) https будет
  3. // предоставляем автоматически, в противном случае необходимо настроить локальный https
  4. // поддержка с использованием библиотеки https и нашего локально сохраненного ключа
  5. if (process.env.NODE_ENV === "production") {
  6.   // Запустить сервер
  7.   var server = app.listen(app.get('port'), function () {
  8.     console.log('Начинаем в ' + (new Date()).toString());
  9.     console.log('Сервер слушает на порту ' + server.address().port);
  10.   });
  11. } else {
  12.   // Настройка локальной поддержки https
  13.   var fs = require('fs');
  14.   var https = require('https');
  15.   var options = {
  16.     key: fs.readFileSync('/etc/apache2/ssl/server.key'),
  17.     cert: fs.readFileSync('/etc/apache2/ssl/server.crt'),
  18.     passphrase: '<пароль, который вы использовали для сертификата>',
  19.     requestCert: false,
  20.     rejectUnauthorized: false
  21.   };
  22.  
  23.   // Запустить сервер
  24.   var server = https.createServer(options, app).listen(app.get('port'), function () {
  25.     console.log('Начинаем в ' + (new Date()).toString());
  26.     console.log('Сервер слушает на порту ' + server.address().port);
  27.   });
  28. }

Мои браузеры не слишком воодушевлены самоподписанными сертификатами, и потому вычеркивают часть https, но она все еще работает нормально и достаточно хороша для тестирования:

LocalHttps.png

В качестве примера выше, достаточно взглянуть на этот проект github:
https://github.com/adamenagy/data.management-nodejs-integration.egnyte

Источник: https://forge.autodesk.com/blog/enable-https-local-nodejs

Включение поддержки https для локального nodejs
Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 07.04.2017
Отредактировано 08.04.2017 в 20:15:41