「node.jsによるHTTPSサーバの作り方」の版間の差分
提供: Node.js/JavaScript入門
(ページの作成:「node.jsでHTTPSサーバ(SSL)を作成するには、httpsモジュールを使用します。HTTPSサーバは、SSLにより、経路を暗号化し、サーバ-ク...」) |
(相違点なし)
|
2014年8月31日 (日) 16:07時点における版
node.jsでHTTPSサーバ(SSL)を作成するには、httpsモジュールを使用します。HTTPSサーバは、SSLにより、経路を暗号化し、サーバ-クライアント間の盗聴を防ぎます。また、サーバ証明書により、サーバの真正性を保証します。
概要
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.