node.jsによるHTTPSサーバの作り方
提供: Node.js/JavaScript入門
スポンサーリンク
node.jsでHTTPSサーバ(SSL)を作成するには、httpsモジュールを使用します。HTTPSサーバは、SSLにより、経路を暗号化し、サーバ-クライアント間の盗聴を防ぎます。また、サーバ証明書により、サーバの真正性を保証します。セキュリティを強化したいときに、HTTPSを使用します。
概要
httpsサーバを作るには、以下の手順が必要です。
- SSL証明書の作成
- 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
両方にアクセスできました。
関連項目
- node.jsでファイルを読む
- node.jsによるHTTPサーバの作り方
- node.jsによるHTTPSサーバの作り方
- node.jsでSPDY対応ウェブサーバ
- node.js foreverでHTTPサーバをデーモン化する
- node.js HTTPサーバでApacheライクなログを記録する
- node.js HTTPサーバでレスポンスをgzipやdeflateで圧縮する
- node.js clusterでHTTPサーバをマルチプロセス化する
ツイート
スポンサーリンク