Node.jsNode.jsを使い始める


備考

Node.jsは、GoogleのV8 JavaScriptエンジンを使用するイベントベースの非ブロッキング非同期I / Oフレームワークです。これは、クライアント側とサーバー側の両方でJavaScriptを実行できるため、コードの再利用性とコンテキスト切り替えの欠如の恩恵を受けるアプリケーションの開発に使用されます。オープンソースとクロスプラットフォームです。 Node.jsアプリケーションは純粋なJavaScriptで書かれており、Windows、LinuxなどのNode.js環境内で実行できます。

バージョン

バージョン発売日
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
v7.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年7月6日
v6.2.2 2016年6月16日
v6.2.1 2016年06-02
v6.2.0 2016年5月17日
v6.1.0 2016-05-05
v6.0.0 2016-04-26
v5.12.0 2016年6月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
v5.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月4日
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

Hello World HTTPサーバー

まず、ご使用のプラットフォーム用のNode.jsインストールします。

この例では、 Hello, World! を送信するポート1337でリッスンするHTTPサーバーを作成しますHello, World! ブラウザに送信します。ポート1337を使用する代わりに、他のサービスで現在使用されていない任意のポート番号を使用できます。

http モジュールはNode.js コアモジュール (Node.jsのソースに含まれ、追加のリソースのインストールを必要としないモジュール)です。 http モジュールは、 http.createServer() メソッドを使用してHTTPサーバーを作成する機能を提供します。アプリケーションを作成するには、次の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!」テキストが表示された簡単なWebページが表示されます。

スクリーンショット

編集可能なオンラインの例。

コアモジュール

Node.jsはブラウザ外でJavascriptを実行できるJavascriptエンジン(GoogleのChrome用V8エンジン、C ++で書かれています)です。ノードの機能を拡張するために多数のライブラリが利用可能ですが、エンジンには基本機能を実装する一連のコアモジュールが付属しています。

現在、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' ]
 

このリストは、Node documentation API https://nodejs.org/api/all.html(JSONファイル: https : //nodejs.org/api/all.json )から入手しました。

すべてのコアモジュールを一目で見る

アサート

assert モジュールは不変をテストするために使用することができるアサーションテストの簡単なセットを提供します。

バッファ

ECMAScript 2015(ES6)にTypedArray を導入する前は、JavaScript言語にはバイナリデータのストリームを読み込んだり操作したりする仕組みがありませんでした。 Buffer クラスは、Node.js APIの一部として導入され、TCPストリームやファイルシステム操作などのコンテキストでオクテットストリームとやり取りできるようにしました。

TypedArray がES6で追加されたので、 Buffer クラスは、Node.jsのユースケースに合わせて最適化された方法でUin t8Array APIを実装します。

c / c ++ _ addons

Node.js Addonsは、CまたはC ++で書かれた動的にリンクされた共有オブジェクトで、 require() 関数を使用してNode.jsにロードでき、通常のNode.jsモジュールと同じように使用できます。主に、Node.jsで実行されているJavaScriptとC / C ++ライブラリとの間のインタフェースを提供するために使用されます。

child_process

child_process モジュールは、popen(3)に類似しているが同一ではない方法で子プロセスを生成する機能を提供します。

クラスタ

Node.jsの単一のインスタンスは、単一のスレッドで実行されます。マルチコアシステムを利用するには、負荷を処理するNode.jsプロセスのクラスタを起動する必要があることがあります。クラスタモジュールを使用すると、すべてのサーバーポートを共有する子プロセスを簡単に作成できます。

コンソール

console モジュールは、ウェブブラウザによって提供されるJavaScriptコンソール機構と同様の単純なデバッグコンソールを提供する。

暗号

crypto モジュールは、OpenSSLのハッシュ、HMAC、暗号、解読、署名、検証機能用のラッパーセットを含む暗号機能を提供します。

deprecated_apis

(a)APIの使用が危険であると考えられているか、(b)改良された代替APIが利用可能になっている、(c)将来のメジャーリリースでAPIへの変更の破棄が予想される場合、Node.jsはAPIを非難することがあります。

DNS

dns モジュールには、2つの異なるカテゴリに属する​​関数が含まれています。

  1. 基本的なオペレーティングシステム機能を使用して名前解決を実行する機能で、必ずしもネットワーク通信を実行する必要はありません。このカテゴリに含まれる関数は、 dns.lookup() です。
  2. 実際のDNSサーバーに接続して名前解決を実行し、 常にネットワークを使用してDNSクエリを実行する関数。このカテゴリには、 dns.lookup() を除く dns モジュール内のすべての関数が含まれます。

ドメイン

このモジュールは保留中です 。置換APIが完成すると、このモジュールは完全に廃止されます。ほとんどのエンドユーザーは、このモジュールを使用する必要ありませ 。ドメインが提供する機能を絶対に必要とするユーザーは、当面はその機能に頼っているかもしれませんが、将来は別のソリューションに移行する必要があります。

イベント

Node.jsコアAPIの多くは、特定の種類のオブジェクト(「エミッタ」と呼ばれます)が定期的に名前付きイベントを生成し、Functionオブジェクト(「リスナー」)を呼び出すような慣用的な非同期イベント駆動アーキテクチャをベースに構築されています。

fs

ファイルI / Oは、標準のPOSIX関数に関する単純なラッパーによって提供されます。このモジュールを使用するには、 require('fs') ます。すべてのメソッドは、非同期形式と同期形式を持ちます。

http

Node.jsのHTTPインタフェースは、従来使用が困難であったプロトコルの多くの機能をサポートするように設計されています。特に、チャンクエンコードされた大規模なメッセージ。このインターフェースは、リクエストやレスポンス全体をバッファリングしないように注意しています。ユーザーはデータをストリーミングすることができます。

https

HTTPSは、TLS / SSL上のHTTPプロトコルです。 Node.jsでは、これは別のモジュールとして実装されています。

モジュール

Node.jsには単純なモジュールローディングシステムがあります。 Node.jsでは、ファイルとモジュールは1対1で対応しています(各ファイルは個別のモジュールとして扱われます)。

ネット

net モジュールは、非同期ネットワークラッパーを提供します。サーバーとクライアントの両方を作成するための関数(ストリームと呼ばれます)が含まれています。このモジュールにはrequire('net'); を含めることができますrequire('net');

OS

os モジュールは、多くのオペレーティングシステム関連のユーティリティメソッドを提供します。

パス

path モジュールは、ファイルおよびディレクトリパスを操作するためのユーティリティを提供します。

punycode

Node.jsにバンドルされているpunycodeモジュールのバージョンは廃止予定です

クエリ文字列

querystring モジュールは、URLクエリ文字列の解析と書式設定のためのユーティリティを提供します。

読み込まれた行

readline モジュールは、Readableストリーム( process.stdin など)から一度に1行ずつデータを読み込むためのインターフェイスを提供します。

repl

repl モジュールは、スタンドアロン・プログラムとしても、他のアプリケーションでも使用可能なRead-Eval-Print-Loop(REPL)実装を提供します。

ストリーム

ストリームは、Node.jsのストリーミングデータを操作するための抽象的なインターフェイスです。 stream モジュールは、ストリームインターフェイスを実装するオブジェクトを簡単に構築できる基本APIを提供します。

Node.jsによって提供される多くのストリームオブジェクトがあります。例えば、HTTPサーバとprocess.stdout へのリクエストは両方ともストリームインスタンスです。

string_decoder

string_decoder モジュールは、エンコードされたマルチバイトUTF-8およびUTF-16文字を保持する方法で、 Buffer オブジェクトをストリングにデコードするためのAPIを提供します。

タイマー

timer モジュールは、ある将来の期間に呼び出されるスケジューリング関数用のグローバルAPIを公開します。タイマー関数はグローバルであるため、APIを使用するrequire('timers') timer require('timers') を呼び出すrequire('timers') はありません。

Node.js内のタイマー関数は、Webブラウザーで提供されるタイマーAPIと同様のAPIを実装しますが、Node.jsイベントループの周り構築された別の内部実装を使用します

tls_(ssl)

tls モジュールは、OpenSSLの上に構築されたTLS(Transport Layer Security)およびSSL(Secure Socket Layer)プロトコルの実装を提供します。

トレース

トレースイベントは、V8、ノードコア、およびユーザー空間コードによって生成されたトレース情報を集中管理するメカニズムを提供します。

Node.jsアプリケーションの起動時に--trace-events-enabled フラグを渡すと、トレースを有効にすることができます。

tty

tty モジュールは提供tty.ReadStreamtty.WriteStream クラスを。ほとんどの場合、このモジュールを直接使用する必要はありません。

dgram

dgram モジュールは、UDPデータグラムソケットの実装を提供します。

URL

url モジュールは、URL解決と解析のためのユーティリティを提供します。

ユーティリティ

util モジュールは、主にNode.js自身の内部APIのニーズをサポートするように設計されています。しかし、ユーティリティの多くは、アプリケーション開発者やモジュール開発者にとっても有用です。

v8

v8 モジュールは、Node.jsバイナリに組み込まれているV8のバージョンに特有のAPIを公開しています。

:APIと実装はいつでも変更されることがあります。

VM

vm モジュールは、V8仮想マシンのコンテキスト内でコードをコンパイルおよび実行するためのAPIを提供します。 JavaScriptコードはすぐにコンパイルして実行することも、コンパイルして保存して後で実行することもできます。

:vmモジュールはセキュリティ機構ではありません。 信頼できないコードの実行には使用しないでください

zlib

zlib モジュールは、GzipとDeflate / Inflateを使用して実装された圧縮機能を提供します。

NodeJSアプリケーションのデバッグ

ノードインスペクタを使用することができます。 npm経由でインストールするには、次のコマンドを実行します。

npm install -g node-inspector
 

次に、あなたはアプリケーションをデバッグすることができます

node-debug app.js
 

Githubのリポジトリはhttps://github.com/node-inspector/node-inspectorにあります。


ネイティブにデバッグする

また、次のようにnode.jsをネイティブにデバッグすることもできます。

node debug your-script.js
 

デバッガを目的のコード行で正確にブレークするには、次のようにします。

debugger;
 

詳細はこちらをご覧ください

node.js 8では、次のコマンドを使用します。

node --inspect-brk your-script.js
 

次に、Google Chromeの最新バージョンでabout://inspect 開き、Nodeスクリプトを選択してChromeのDevToolsのデバッグ環境を取得します。

オンラインでアプリケーションを展開する

アプリケーションを(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 はオフラインポート番号です。

Hello World基本ルーティング

ノードを持つ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);
 

しかし、このような "ルート"を定義し続けると、大規模なコールバック関数が1つだけ発生することになります。そのような巨大な混乱を望んでいないので、これをクリーンアップできるかどうかを見てみましょう。

まず、すべてのルートをオブジェクトに保存しましょう:

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"');
    }
}
 

オブジェクトに2つのルートを格納したので、ここで主なコールバックでそれらをチェックできます:

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);
 

今すぐあなたのウェブサイトをナビゲートしようとするたびに、あなたのルートにそのパスの存在を確認し、それぞれの機能を呼び出します。ルートが見つからない場合、サーバーは404(Not Found)で応答します。

また、HTTP Server APIを使用したルーティングは非常に簡単です。

Hello Worldコマンドライン

Node.jsは、コマンドラインユーティリティの作成にも使用できます。以下の例は、コマンドラインから最初の引数を読み込み、Helloメッセージを出力します。

このコードをUnixシステムで実行するには:

  1. 新しいファイルを作成し、以下のコードを貼り付けます。ファイル名は無関係です。
  2. このファイルをchmod 700 FILE_NAME 実行可能にする
  3. アプリを./APP_NAME David 実行する

Windowsでは、ステップ1を実行し、 node APP_NAME David それを実行し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);
 

REPLのHello World

引数なしで呼び出されると、Node.jsは " ノードシェル "とも呼ばれるREPL(Read-Eval-Print-Loop)を開始します。

コマンドプロンプトでnode 入力しnode

$ node
>
 

ノードのシェルプロンプトで> タイプの「Hello World!」

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

エクスプローラー付きのHello World

次の例では、Expressを使用してポート3000でリッスンするHTTPサーバーを作成します。このサーバーは「Hello、World!」と応答します。 Expressは、HTTP APIを作成するのに便利な一般的なWebフレームワークです。

最初に、 myApp 新しいフォルダを作成します。 myApp 入り、次のコードを含む新しいJavaScriptファイルを作成します(たとえば、 hello.js という名前を付けてhello.js )。次に、コマンドラインからnpm install --save express を使用して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フレームワークの詳細については、「 Web Apps with Express」セクションをチェックしてください

基本的なHTTPS Webサーバーを起動して実行する方法

システムにnode.jsがインストールされたら、以下の手順に従って、HTTPとHTTPSの両方をサポートしている基本Webサーバーを稼働させることができます。



手順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.pemca-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 ファイルを作成します。

Node.jsのHTTPSサーバーの最小限の設定は、次のようになります。

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 実行しserver.js

    node server.js

Node.jsのインストールと実行

まず、開発用コンピュータにNode.jsをインストールします。

Windows: ダウンロードページに移動し、インストーラをダウンロード/実行します。

Mac: ダウンロードページに移動し、インストーラをダウンロード/実行します。または、 brew install node を使用してHomebrew経由でNodeをインストールすることもできbrew install node 。 HomebrewはMacintosh向けのコマンドラインパッケージマネージャであり、詳細はHomebrewのWebサイトを参照してください

Linux: コマンドラインのインストールページでディストリビューションの指示に従ってください


ノードプログラムの実行

Node.jsプログラムを実行するには、 node app.js またはnodejs app.js 実行しnode app.js 。ここで、 app.js は、ノードappのソースコードのファイル名です。実行するスクリプトを見つけるためにNodeに.js 接尾辞を含める必要はありません。

あるいは、UNIXベースのオペレーティングシステムでは、ノードプログラムを端末スクリプトとして実行することができます。これを行うには、 #!/usr/bin/env node ようなNodeインタプリタを指すシバンで始める必要があり#!/usr/bin/env node 。このファイルも実行可能ファイルとして設定する必要があります。これはchmod を使って行うことができます。スクリプトはコマンドラインから直接実行できるようになりました。

TLSソケット:サーバーとクライアント

これと通常のTCP接続との主な違いは、プライベートキーとオプションオブジェクトに設定する必要があるパブリック証明書だけです。

キーと証明書を作成する方法

このセキュリティプロセスの第一歩は、プライベートキーの作成です。そしてこの秘密鍵は何ですか?基本的には、情報の暗号化に使用されるランダムノイズのセットです。理論的には、1つの鍵を作成し、それを使って必要なものを暗号化することができます。しかし、特定のものに対して異なるキーを持つことがベストプラクティスです。誰かがあなたの秘密鍵を盗むと、それはあなたの家の鍵を盗むことに似ています。あなたが車、ガレージ、オフィスなどをロックするために同じキーを使用した場合を想像してください。

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

プライベートキーとパブリック証明書を取得したので、2つのNodeJSアプリ間の安全な接続を確立できます。そして、サンプルコードでわかるように、非常に単純なプロセスです。

重要!

私たちは公然の証明書を作成して以来、まったく正直なところ、証明書は無価値です。 NodeJSサーバーはデフォルトでこのような証明書を信頼しません。そのため、次のオプションrejectUnauthorized:falseを使用して証明書を実際に信頼するように伝える必要があります。 非常に重要 :本番環境ではこの変数をtrueに設定しないでください。

TLSソケットサーバー

'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ソケットクライアント

'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();

});