node.jsによるHTTPSサーバの作り方

提供: Node.js/JavaScript入門
移動: 案内検索
スポンサーリンク

node.jsでHTTPSサーバ(SSL)を作成するには、httpsモジュールを使用します。HTTPSサーバは、SSLにより、経路を暗号化し、サーバ-クライアント間の盗聴を防ぎます。また、サーバ証明書により、サーバの真正性を保証します。セキュリティを強化したいときに、HTTPSを使用します。

概要

httpsサーバを作るには、以下の手順が必要です。

  1. SSL証明書の作成
  2. httpsモジュールを作ったプログラミング

証明書の作成

ここでは、自己署名証明書(俺々証明書、オレオレ証明書)を使用します。自己署名証明書の場合、サイトの真正性の保証はできないので、プログラムの動作テスト目的でのみ、使用してください。

$ openssl genrsa -out server_key.pem 2048
$ openssl req -batch -new -key server_key.pem -out server_csr.pem \
-subj "/C=JP/ST=Tokyo/L=Musashino-shi/O=Foo/OU=Bar/CN=foo.bar.com"
$ openssl x509 -in server_csr.pem -out server_crt.pem -req \
-signkey server_key.pem -days 73000 -sha256

プログラムの流れ

基本的には、HTTPサーバの作りと同じですが、以下の点がことなります。

  • サーバの秘密鍵と証明書を読み込む必要がある。
  • httpsモジュールのcreateServerにパラーメタとして、証明書と鍵のデータを渡す。

ソースコード

/*
 * https1.js
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
var https = require('https');
var fs = require('fs');
var ssl_server_key = 'server_key.pem';
var ssl_server_crt = 'server_crt.pem';
var port = 8443;
 
var options = {
        key: fs.readFileSync(ssl_server_key),
        cert: fs.readFileSync(ssl_server_crt)
};
 
https.createServer(options, function (req,res) {
        res.writeHead(200, {
                'Content-Type': 'text/plain'
        });
        res.end("Hello, world\n");
}).listen(port);

実行例

$ node https1.js


$ curl  https://localhost:8443/ --insecure
Hello, world

自己署名証明書を使用する時、CAにルート証明書がないため、以下のエラーになります。サンプルプログラムの動作目的で、curlコマンドの-kもしくは、--insecure を指定して実行して試してみください。一般のサイトに対するアクセスは、--insecure を使用するべきでは、ありません。

$ curl -I https://localhost:8443/
curl: (60) SSL certificate problem: self signed certificate
More details here: http://curl.haxx.se/docs/sslcerts.html
 
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

HTTPとHTTPSサーバの両方をサポートするには

HTTPサーバとHTTPSサーバの両方を同じプログラムでサポートするには、httpモジュールとhttpsモジュールの両方をしようし、2つのサービスを起動します。それぞれ、別ポートでサービスします。

https2.js

/*
 * https2.js
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
var https = require('https');
var http = require('http');
var fs = require('fs');
var ssl_server_key = 'server_key.pem';
var ssl_server_crt = 'server_crt.pem';
 
var http_port = 8080;
var https_port = 8443;
 
var options = {
        key: fs.readFileSync(ssl_server_key),
        cert: fs.readFileSync(ssl_server_crt)
};
 
https.createServer(options, function (req,res) {
        res.writeHead(200, {
                'Content-Type': 'text/plain'
        });
        res.end("Hello, world on https\n");
}).listen(https_port);
 
http.createServer(function (req,res) {
        res.writeHead(200, {
                'Content-Type': 'text/plain'
        });
        res.end("Hello, world on http\n");
}).listen(http_port);

実行例

サーバを起動します。

$ node https2.js

それぞれにcurlコマンドでアクセスしてみます。

$ curl https://localhost:8443/ --insecure
Hello, world on https
$ curl http://localhost:8080/
Hello, world on http

両方にアクセスできました。

関連項目




スポンサーリンク