Начало работы с Node.js

Download node.js eBook

замечания

Node.js представляет собой основанную на событиях, неблокирующую асинхронную инфраструктуру ввода-вывода, которая использует движок Google V8 JavaScript. Он используется для разработки приложений, которые сильно используют возможность запуска JavaScript как на клиенте, так и на стороне сервера и, следовательно, извлекают выгоду из повторного использования кода и отсутствия переключения контекста. Это open-source и кросс-платформенный. Приложения Node.js написаны на чистом JavaScript и могут выполняться в среде Node.js на Windows, Linux и т. Д. ...

Версии

Версия Дата выхода
v8.2.1 2017-07-20
v8.2.0 2017-07-19
v8.1.4 2017-07-11
v8.1.3 2017-06-29
v8.1.2 2017-06-15
v8.1.1 2017-06-13
v8.1.0 2017-06-08
v8.0.0 2017-05-30
v7.10.0 2017-05-02
v7.9.0 2017-04-11
v7.8.0 2017-03-29
v7.7.4 2017-03-21
v7.7.3 2017-03-14
v7.7.2 2017-03-08
v7.7.1 2017-03-02
v7.7.0 2017-02-28
v7.6.0 2017-02-21
v7.5.0 2017-01-31
v7.4.0 2017-01-04
v7.3.0 2016-12-20
v7.2.1 2016-12-06
v7.2.0 2016-11-22
v7.1.0 2016-11-08
версия 7.0.0 2016-10-25
v6.11.0 2017-06-06
v6.10.3 2017-05-02
v6.10.2 2017-04-04
v6.10.1 2017-03-21
v6.10.0 2017-02-21
v6.9.5 2017-01-31
v6.9.4 2017-01-05
v6.9.3 2017-01-05
v6.9.2 2016-12-06
v6.9.1 2016-10-19
v6.9.0 2016-10-18
v6.8.1 2016-10-14
v6.8.0 2016-10-12
v6.7.0 2016-09-27
v6.6.0 2016-09-14
v6.5.0 2016-08-26
v6.4.0 2016-08-12
v6.3.1 2016-07-21
v6.3.0 2016-07-06
v6.2.2 2016-06-16
v6.2.1 2016-06-02
v6.2.0 2016-05-17
v6.1.0 2016-05-05
v6.0.0 2016-04-26
v5.12.0 2016-06-23
v5.11.1 2016-05-05
v5.11.0 2016-04-21
v5.10.1 2016-04-05
v5.10 2016-04-01
V5.9 2016-03-16
версии 5.8 2016-03-09
v5.7 2016-02-23
v5.6 2016-02-09
v5.5 2016-01-21
v5.4 2016-01-06
v5.3 2015-12-15
v5.2 2015-12-09
v5.1 2015-11-17
v5.0 2015-10-29
V4.4 2016-03-08
v4.3 2016-02-09
v4.2 2015-10-12
v4.1 2015-09-17
v4.0 2015-09-08
io.js v3.3 2015-09-02
io.js v3.2 2015-08-25
io.js v3.1 2015-08-19
io.js v3.0 2015-08-04
io.js v2.5 2015-07-28
io.js v2.4 2015-07-17
io.js v2.3 2015-06-13
io.js v2.2 2015-06-01
io.js v2.1 2015-05-24
io.js v2.0 2015-05-04
io.js v1.8 2015-04-21
io.js v1.7 2015-04-17
io.js v1.6 2015-03-20
io.js v1.5 2015-03-06
io.js v1.4 2015-02-27
io.js v1.3 2015-02-20
io.js v1.2 2015-02-11
io.js v1.1 2015-02-03
io.js v1.0 2015-01-14
v0.12 2016-02-09
v0.11 2013-03-28
V0.10 2013-03-11
v0.9 2012-07-20
v0.8 2012-06-22
v0.7 2012-01-17
v0.6 2011-11-04
v0.5 2011-08-26
v0.4 2011-08-26
v0.3 2011-08-26
v0.2 2011-08-26
v0.1 2011-08-26

Сервер HTTP Hello World

Сначала установите Node.js для своей платформы.

В этом примере мы создадим HTTP-сервер, прослушивающий порт 1337, который отправляет Hello, World! в браузер. Обратите внимание, что вместо использования порта 1337 вы можете использовать любой номер порта по вашему выбору, который в настоящее время не используется какой-либо другой услугой.

Модуль http - это основной модуль Node.js (модуль, входящий в состав источника Node.js, который не требует установки дополнительных ресурсов). Модуль http предоставляет функциональные возможности для создания HTTP-сервера с использованием http.createServer() . Чтобы создать приложение, создайте файл, содержащий следующий код JavaScript.

const http = require('http'); // Loads the http module

http.createServer((request, response) => {

    // 1. Tell the browser everything is OK (Status code 200), and the data is in plain text
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    // 2. Write the announced text to the body of the page
    response.write('Hello, World!\n');

    // 3. Tell the server that all of the response headers and body have been sent
    response.end();

}).listen(1337); // 4. Tells the server what port to be on
 

Сохраните файл с любым именем файла. В этом случае, если мы назовем это hello.js мы можем запустить приложение, перейдя в каталог, в котором находится файл, и используя следующую команду:

node hello.js
 

После этого созданный сервер можно получить с помощью URL http: // localhost: 1337 или http://127.0.0.1:1337 в браузере.

Простая веб-страница появится с текстом «Hello, World!» Вверху, как показано на скриншоте ниже.

Скриншот

Редактируемый онлайн-пример.

Основные модули

Node.js - движок Javascript (движок V8 для Google для Chrome, написанный на C ++), который позволяет запускать Javascript за пределами браузера. Хотя для расширения возможностей Node доступны многочисленные библиотеки, в комплект поставки входит набор основных модулей, реализующих основные функции.

В настоящее время в узле имеется 34 основных модуля:

[ 'assert',
  'buffer',
  'c/c++_addons',
  'child_process',
  'cluster',
  'console',
  'crypto',
  'deprecated_apis',
  'dns',
  'domain',
  'Events',
  'fs',
  'http',
  'https',
  'module',
  'net',
  'os',
  'path',
  'punycode',
  'querystring',
  'readline',
  'repl',
  'stream',
  'string_decoder',
  'timers',
  'tls_(ssl)',
  'tracing',
  'tty',
  'dgram',
  'url',
  'util',
  'v8',
  'vm',
  'zlib' ]
 

Этот список был получен из API документации Node https://nodejs.org/api/all.html (файл JSON: https://nodejs.org/api/all.json ).

Все основные модули на первый взгляд

утверждать

Модуль assert предоставляет простой набор тестов утверждения, которые можно использовать для проверки инвариантов.

буфер

До введения TypedArray в ECMAScript 2015 (ES6) язык JavaScript не имел механизма для чтения или обработки потоков двоичных данных. Класс Buffer был представлен как часть API Node.js, чтобы можно было взаимодействовать с октетными потоками в контексте таких потоков, как потоки TCP и операции с файловой системой.

Теперь, когда TypedArray был добавлен в ES6, класс Buffer реализует Uin t8Array API таким образом, который более оптимизирован и подходит для случаев использования Node.js.

C / C ++ _ аддоны

Node.js Addons - это динамически связанные общие объекты, написанные на C или C ++, которые могут быть загружены в Node.js с помощью функции require() и использованы так же, как если бы они были обычным модулем Node.js. Они используются, прежде всего, для обеспечения интерфейса между JavaScript, запущенным в библиотеках Node.js и C / C ++.

child_process

Модуль child_process предоставляет возможность генерировать дочерние процессы способом, похожим, но не идентичным, для popen (3).

кластер

Один экземпляр Node.js работает в одном потоке. Чтобы воспользоваться преимуществами многоядерных систем, пользователь иногда захочет запустить кластер из процессов Node.js для обработки нагрузки. Модуль кластера позволяет вам легко создавать дочерние процессы, которые используют общий доступ к портам сервера.

приставка

console модуль предоставляет простую консоль отладки, похожую на механизм консоли JavaScript, предоставляемый веб-браузерами.

крипто-

crypto модуль обеспечивает криптографическую функциональность , которая включает в себя набор оберток для хэша OpenSSL , , HMAC, шифр, расшифровывать, подписывать и проверять функции.

deprecated_apis

Node.js может испортить API, если: (a) использование API считается небезопасным; (b) был предоставлен улучшенный альтернативный API или (c) нарушение изменений в API ожидается в будущем крупном выпуске ,

DNS

Модуль dns содержит функции, принадлежащие двум различным категориям:

  1. Функции, которые используют базовые средства операционной системы для выполнения разрешения имен, и которые не обязательно выполняют какую-либо сетевую связь. Эта категория содержит только одну функцию: dns.lookup() .
  2. Функции, которые подключаются к реальному DNS-серверу для выполнения разрешения имен и всегда используют сеть для выполнения DNS-запросов. Эта категория содержит все функции в модуле dns кроме dns.lookup() .

домен

Этот модуль ожидает отмены . После того, как API-интерфейс замены будет завершен, этот модуль будет полностью устарел. У большинства конечных пользователей не должно быть причин использовать этот модуль. Пользователи, которые абсолютно должны обладать функциональностью, которую предоставляют домены, могут на это рассчитывать, но в будущем они должны будут перейти к другому решению.

События

Большая часть основного API-интерфейса Node.js построена вокруг идиоматической асинхронной архитектуры, управляемой событиями, в которой определенные типы объектов (называемые «эмиттеры») периодически излучают именованные события, которые вызывают функции-объекты («слушатели»).

фс

Файловый ввод-вывод обеспечивается простыми оболочками вокруг стандартных функций POSIX. Для использования этого модуля require('fs') . Все методы имеют асинхронные и синхронные формы.

HTTP

Интерфейсы HTTP в Node.js предназначены для поддержки многих функций протокола, которые традиционно трудно использовать. В частности, большие, возможно, закодированные в блоке сообщения. Интерфейс не требует буферизации целых запросов или ответов - пользователь может передавать данные.

HTTPS

HTTPS - это протокол HTTP через TLS / SSL. В Node.js это реализовано как отдельный модуль.

модуль

Node.js имеет простую систему загрузки модуля. В Node.js файлы и модули соответствуют друг другу (каждый файл рассматривается как отдельный модуль).

сеть

net модуль предоставляет асинхронную сеть обертки. Он содержит функции для создания серверов и клиентов (называемых потоками). Вы можете включить этот модуль с require('net'); ,

Операционные системы

Модуль os предоставляет ряд методов, связанных с операционной системой.

дорожка

Модуль path предоставляет утилиты для работы с файловыми и каталогами.

Punycode

Версия модуля punycode, входящего в состав Node.js, устарела .

Строка запроса

Модуль querystring предоставляет утилиты для синтаксического анализа и форматирования строк запроса URL.

Readline

Модуль readline предоставляет интерфейс для чтения данных из Readable stream (например, process.stdin ) по одной строке за раз.

РЕПЛ

Модуль repl предоставляет реализацию Read-Eval-Print-Loop (REPL), которая доступна как в виде отдельной программы, так и в других приложениях.

поток

Поток представляет собой абстрактный интерфейс для работы с потоковыми данными в Node.js. Модуль stream предоставляет базовый API, который упрощает сбор объектов, реализующих интерфейс потока.

Существует множество объектов потока, предоставляемых Node.js. Например, запрос на HTTP-сервер и process.stdout являются экземплярами потока.

string_decoder

Модуль string_decoder предоставляет API для декодирования объектов Buffer в строки таким образом, который сохраняет кодированные многобайтовые символы UTF-8 и UTF-16.

таймеры

Модуль timer предоставляет глобальный API для функций планирования, которые будут вызываться в некоторый будущий период времени. Поскольку функции таймера являются глобальными, нет необходимости require('timers') использовать API.

Функции таймера в Node.js реализуют аналогичный API как API таймеров, предоставляемый веб-браузерами, но используют другую внутреннюю реализацию, которая построена вокруг цикла событий Node.js.

tls_ (SSL)

Модуль tls обеспечивает реализацию протоколов безопасности транспортного уровня (TLS) и протокола Secure Socket Layer (SSL), которые построены поверх OpenSSL.

трассировка

Trace Event предоставляет механизм для централизации информации трассировки, созданной V8, ядром узла и кодом пользовательского пространства.

Трассировку можно включить, передав --trace-events-enabled при запуске приложения Node.js.

TTY

Модуль tty предоставляет tty.ReadStream и tty.WriteStream . В большинстве случаев нет необходимости или возможно использовать этот модуль напрямую.

dgram

Модуль dgram обеспечивает реализацию сокетов UDP Datagram.

URL

Модуль url предоставляет утилиты для разрешения URL-адресов и анализа.

Util

Модуль util в первую очередь предназначен для поддержки собственных внутренних API-интерфейсов Node.js. Однако многие утилиты также полезны для разработчиков приложений и модулей.

v8

Модуль v8 предоставляет API-интерфейсы, специфичные для версии V8, встроенной в двоичный файл Node.js.

Примечание . API и реализация могут быть изменены в любое время.

В.М.

Модуль vm предоставляет API для компиляции и запуска кода в контекстах виртуальной машины V8. Код JavaScript может быть скомпилирован и запущен немедленно или скомпилирован, сохранен и запущен позже.

Примечание . Модуль vm не является механизмом безопасности. Не используйте его для запуска ненадежного кода .

Zlib

Модуль zlib обеспечивает функции сжатия, реализованные с использованием Gzip и Deflate / Inflate.

Отладка вашего приложения NodeJS

Вы можете использовать инспектора узлов. Запустите эту команду, чтобы установить ее через npm:

npm install -g node-inspector
 

Затем вы можете отлаживать свое приложение, используя

node debug your-script.js
 

Репозиторий Github можно найти здесь: https://github.com/node-inspector/node-inspector


Отладка изначально

Вы также можете отлаживать node.js изначально, запустив его следующим образом:

debugger;
 

Чтобы остановить ваш отладчик точно в нужной строке кода, используйте это:

node --inspect-brk your-script.js
 

Для получения дополнительной информации см. Здесь .

В node.js 8 используйте следующую команду:

node-debug app.js
 

Затем откройте about://inspect в последней версии Google Chrome и выберите свой сценарий узла, чтобы получить отладочную версию DevTools от Chrome.

Развертывание приложения онлайн

Когда вы развертываете свое приложение в (размещенной в Node.js) размещенной среде, эта среда обычно предлагает переменную окружения PORT которую вы можете использовать для запуска вашего сервера. Изменение номера порта на process.env.PORT позволяет получить доступ к приложению.

Например,

http.createServer(function(request, response) {
   // your server code
}).listen(process.env.PORT);
 

Кроме того, если вы хотите получить доступ к этому автономному устройству во время отладки, вы можете использовать это:

http.createServer(function(request, response) {
  // your server code
}).listen(process.env.PORT || 3000);
 

где 3000 - номер порта в автономном режиме.

Приветственная базовая маршрутизация

Как только вы поймете, как создать HTTP-сервер с узлом, важно понять, как заставить его «делать» вещи на основе пути, к которому пользователь перешел. Это явление называется «маршрутизация».

Самый простой пример этого - проверить if (request.url === 'some/path/here') , а затем вызвать функцию, которая отвечает новым файлом.

Пример этого можно увидеть здесь:

const http = require('http');

function index (request, response) {
    response.writeHead(200);
    response.end('Hello, World!');
}

http.createServer(function (request, response) {
    
    if (request.url === '/') {
        return index(request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

Если вы продолжите определять свои «маршруты», подобные этому, вы получите одну массивную функцию обратного вызова, и мы не хотим такого гигантского беспорядка, поэтому давайте посмотрим, можем ли мы это очистить.

Во-первых, давайте сохраним все наши маршруты в объекте:

http.createServer(function (request, response) {
    
    if (request.url in routes) {
        return routes[request.url](request, response);
    }

    response.writeHead(404);
    response.end(http.STATUS_CODES[404]);

}).listen(1337);
 

Теперь, когда мы сохранили 2 маршрута в объекте, теперь мы можем проверить их в нашем основном обратном вызове:

var routes = {
    '/': function index (request, response) {
        response.writeHead(200);
        response.end('Hello, World!');
    },
    '/foo': function foo (request, response) {
        response.writeHead(200);
        response.end('You are now viewing "foo"');
    }
}
 

Теперь каждый раз, когда вы пытаетесь перемещаться по сайту, он проверяет наличие этого пути в ваших маршрутах и ​​вызывает соответствующую функцию. Если маршрут не найден, сервер ответит 404 (не найден).

И там у вас есть - маршрутизация с помощью API HTTP Server очень проста.

Командная строка Hello World

Node.js также можно использовать для создания утилит командной строки. В приведенном ниже примере читается первый аргумент из командной строки и выводится сообщение Hello.

Чтобы запустить этот код в системе Unix:

  1. Создайте новый файл и вставьте код ниже. Имя файла не имеет значения.
  2. Сделать этот файл исполняемым с помощью chmod 700 FILE_NAME
  3. Запустите приложение с помощью ./APP_NAME David

В Windows вы делаете шаг 1 и запускаете его с node APP_NAME David

#!/usr/bin/env node

'use strict';

/*
    The command line arguments are stored in the `process.argv` array, 
    which has the following structure:
    [0] The path of the executable that started the Node.js process
    [1] The path to this application
    [2-n] the command line arguments

    Example: [ '/bin/node', '/path/to/yourscript', 'arg1', 'arg2', ... ]
    src: https://nodejs.org/api/process.html#process_process_argv
 */

// Store the first argument as username.
var username = process.argv[2];

// Check if the username hasn't been provided.
if (!username) {

    // Extract the filename
    var appName = process.argv[1].split(require('path').sep).pop();

    //  Give the user an example on how to use the app.
    console.error('Missing argument! Example: %s YOUR_NAME', appName);

    // Exit the app (success: 0, error: 1). 
    // An error will stop the execution chain. For example:
    //   ./app.js && ls       -> won't execute ls
    //   ./app.js David && ls -> will execute ls
    process.exit(1);
}

// Print the message to the console.
console.log('Hello %s!', username);
 

Hello World в REPL

При вызове без аргументов Node.js запускает REPL (Read-Eval-Print-Loop), также известный как « оболочка узла ».

В командной строке введите node .

$ node
>
 

В командной строке узла > введите «Hello World!».

$ node
> "Hello World!"
'Hello World!'
 

Hello World with Express

В следующем примере Express используется для создания HTTP-сервера, прослушивающего порт 3000, который отвечает «Hello, World!». Экспресс является широко используемой веб-картой, которая полезна для создания HTTP API.

Сначала создайте новую папку, например myApp . Перейдите в myApp и создайте новый файл JavaScript, содержащий следующий код (например, hello.js его hello.js ). Затем установите экспресс-модуль, используя npm install --save express из командной строки. Подробнее об установке пакетов см. В этой документации .

// Import the top-level function of express
const express = require('express');

// Creates an Express application using the top-level function
const app = express();

// Define port number as 3000
const port = 3000;

// Routes HTTP GET requests to the specified path "/" with the specified callback function
app.get('/', function(request, response) {
  response.send('Hello, World!');
});

// Make the app listen on port 3000
app.listen(port, function() {
  console.log('Server listening on http://localhost:' + port);
});
 

В командной строке выполните следующую команду:

node hello.js
 

Откройте ваш браузер и перейдите по http://localhost:3000 или http://127.0.0.1:3000 чтобы увидеть ответ.

Для получения дополнительной информации о структуре Express вы можете проверить раздел « Веб-приложения с экспрессом »

Как запустить базовый веб-сервер HTTPS!

После установки в вашей системе узла node.js вы можете просто выполнить описанную ниже процедуру, чтобы получить базовый веб-сервер с поддержкой как HTTP, так и HTTPS!



Шаг 1. Создание центра сертификации

  1. создайте папку, в которой вы хотите сохранить свой ключ и сертификат:

    mkdir conf


  1. перейдите в этот каталог:

    cd conf


  1. возьмите этот файл ca.cnf для использования в качестве ярлыка конфигурации:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


  1. создайте новый центр сертификации, используя эту конфигурацию:

    openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


  1. теперь, когда у нас есть наш ca-key.pem сертификации в ca-key.pem и ca-cert.pem , давайте сгенерируем закрытый ключ для сервера:

    openssl genrsa -out key.pem 4096


  1. захватите этот файл server.cnf для использования в качестве ярлыка конфигурации:

    wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


  1. сгенерировать запрос подписи сертификата с использованием этой конфигурации:

    openssl req -new -config server.cnf -key key.pem -out csr.pem


  1. Подпишите запрос:

    openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem



Шаг 2. Установите сертификат как корневой сертификат.

  1. скопируйте свой сертификат в папку корневых сертификатов:

    sudo cp ca-crt.pem /usr/local/share/ca-certificates/ca-crt.pem


  1. обновить магазин CA:

    sudo update-ca-certificates



Шаг 3. Запуск сервера узла.

Во-первых, вы хотите создать файл server.js , содержащий ваш фактический код сервера.

Минимальная настройка для HTTPS-сервера в Node.js будет примерно такой:

var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);
 

Если вы также хотите поддерживать HTTP-запросы, вам нужно сделать только эту небольшую модификацию:

var http = require('http');
var https = require('https');
var fs = require('fs');

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
 
  1. перейдите в каталог, где находится ваш server.js :

    cd /path/to


  1. server.js :

    node server.js

Установка и запуск Node.js

Для начала установите Node.js на компьютер разработки.

Windows: перейдите на страницу загрузки и загрузите / запустите программу установки.

Mac: перейдите на страницу загрузки и загрузите / запустите программу установки. Кроме того, вы можете установить узел через Homebrew с помощью brew install node . Homebrew - это командный пакет для Macintosh, и больше информации об этом можно найти на веб-сайте Homebrew .

Linux: следуйте инструкциям для своего дистрибутива на странице установки командной строки .


Запуск программы узла

Чтобы запустить программу Node.js, просто запустите node app.js или nodejs app.js , где app.js является именем файла исходного кода вашего узла. Вам не нужно включать суффикс .js для узла, чтобы найти сценарий, который вы хотите запустить.

В качестве альтернативы в операционных системах на базе UNIX программа Node может быть выполнена как сценарий терминала. Для этого нужно начинать с shebang, указывающего на интерпретатор узла, например, узел #!/usr/bin/env node . Файл также должен быть установлен как исполняемый файл, который можно выполнить с помощью chmod . Теперь скрипт можно запустить из командной строки.

TLS Socket: сервер и клиент

Единственными существенными отличиями между этим и обычным TCP-соединением являются закрытый ключ и общедоступный сертификат, который вам нужно будет установить в объект опции.

Как создать ключ и сертификат

Первым шагом в этом процессе безопасности является создание закрытого ключа. И что это за секретный ключ? В принципе, это набор случайных шумов, которые используются для шифрования информации. Теоретически вы можете создать один ключ и использовать его для шифрования всего, что хотите. Но лучше всего иметь разные ключи для конкретных вещей. Потому что, если кто-то украл ваш секретный ключ, это похоже на то, что кто-то украл ваши ключи от дома. Представьте себе, если вы использовали тот же ключ для блокировки своего автомобиля, гаража, офиса и т. Д.

openssl genrsa -out private-key.pem 1024

После того, как у нас есть наш закрытый ключ, мы можем создать CSR (запрос подписи сертификата), который является нашим запросом на то, чтобы секретный ключ был подписан модным авторитетом. Вот почему вы должны вводить информацию, связанную с вашей компанией. Эта информация будет видна авторитетом подписания и использована для проверки вас. В нашем случае не имеет значения, что вы набираете, поскольку на следующем этапе мы сами подпишем наш сертификат.

openssl req -new -key private-key.pem -out csr.pem

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

openssl x509 -req -in csr.pem -signkey private-key.pem -out public-cert.pem

Теперь, когда у вас есть закрытый ключ и публичный сертификат, вы можете установить безопасное соединение между двумя приложениями NodeJS. И, как вы можете видеть в примере кода, это очень простой процесс.

Важный!

Поскольку мы создали публичный сертификат, честно говоря, наш сертификат бесполезен, потому что мы - ничто. Сервер NodeJS не будет доверять такому сертификату по умолчанию, и поэтому нам нужно сказать ему, чтобы он действительно доверял нашему сертификату со следующей опцией rejectUnauthorized: false. Очень важно : никогда не устанавливайте эту переменную в true в производственной среде.

Сервер TLS Socket

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem')
};

var server = tls.createServer(options, function(socket) {

    // Send a friendly message
    socket.write("I am the server sending you a message.");

    // Print the data that we received
    socket.on('data', function(data) {

        console.log('Received: %s [it is %d bytes long]',
            data.toString().replace(/(\n)/gm,""),
            data.length);

    });

    // Let us know when the transmission is over
    socket.on('end', function() {

        console.log('EOT (End Of Transmission)');

    });

});

// Start listening on a specific port and address
server.listen(PORT, HOST, function() {

    console.log("I'm listening at %s, on port %s", HOST, PORT);

});

// When an error occurs, show it.
server.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    server.destroy();

});
 

TLS Socket Client

'use strict';

var tls = require('tls');
var fs = require('fs');

const PORT = 1337;
const HOST = '127.0.0.1'

// Pass the certs to the server and let it know to process even unauthorized certs.
var options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('public-cert.pem'),
    rejectUnauthorized: false
};

var client = tls.connect(PORT, HOST, options, function() {

    // Check if the authorization worked
    if (client.authorized) {
        console.log("Connection authorized by a Certificate Authority.");
    } else {
        console.log("Connection not authorized: " + client.authorizationError)
    }

    // Send a friendly message
    client.write("I am the client sending you a message.");

});

client.on("data", function(data) {

    console.log('Received: %s [it is %d bytes long]',
        data.toString().replace(/(\n)/gm,""),
        data.length);

    // Close the connection after receiving the message
    client.end();

});

client.on('close', function() {

    console.log("Connection closed");

});

// When an error ocoures, show it.
client.on('error', function(error) {

    console.error(error);

    // Close the connection after the error occurred.
    client.destroy();

});
 

Stats

24028 Contributors: 66
Sunday, July 23, 2017
Лицензировано согласно: CC-BY-SA

Не связан с Stack Overflow
Rip Tutorial: info@zzzprojects.com

Скачать книгу