2014年1月26日日曜日

自前認証局でSSL対応なNode.jsサーバアプリ

サーバアプリで暗号化通信だけを目的としてSSLを使いたいときは、自前の認証局(Certificate Authority)を立ててやるのが簡単です。セキュリティ面で決してオススメできる方法ではありませんが、無料で手軽に導入できるというメリットは大きいと思います。
これから紹介するのは、自前の認証局を立てて証明書を発行する方法と、SSL対応のNode.jsサーバアプリのサンプルです。

0. opensslのインストール

$ sudo apt-get install openssl

1. 自前認証局を作成

以下の手順で自前認証局(Certificate Authority)の証明書ファイル(crt)を作成します。
$ mkdir ~/ssl-cert && cd ~/ssl-cert
$ openssl genrsa -des3 -out ca.key 1024
$ openssl req -new -key ca.key -out ca.csr
$ openssl x509 -req -days 3650 -in ca.csr -out ca.crt -signkey ca.key
これで3650日(10年)有効な自前認証局のcrt(ca.crt)が出来上がりました。

2. サーバ証明書を発行

$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
これで3650日(10年)有効なサーバ証明書crt(server.crt)が出来上がりました。
作成時に聞かれるパスワードは、この後作るNode.jsサーバアプリ起動時に聞かれるので覚えておきましょう。

さて、これで証明書ファイルの準備は完了です。
この後サーバアプリが必要とするのは、 ca.crt, server.crt, server.key の3つです。なお、*.keyは秘密鍵ですので、公開などしないよう、取り扱いには十分にご注意ください。

3. SSL対応Node.jsサーバアプリを作成


$ mkdir ~/hello-ssl && cd ~/hello-ssl
$ touch package.json
$ touch server.js

package.json
{
  "name": "hello-ssl",
  "description": "ssl test app",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express": "3.x"
  }
}

server.js
/* jshint undef: false, unused: false */
var https = require('https');
var fs = require('fs');
var express = require('express');
app = express();

app.get('/', function (req, res) {
  var body = 'Hello World';
  res.setHeader('Content-Type', 'text/plain');
  res.setHeader('Content-Length', Buffer.byteLength(body));
  res.end(body);
});

var sslOptions = {
  key: fs.readFileSync('../ssl-cert/server.key'),
  cert: fs.readFileSync('../ssl-cert/server.crt'),
  ca: fs.readFileSync('../ssl-cert/ca.crt'),
  requestCert: true,
  rejectUnauthorized: false
};

var secureServer = https.createServer(sslOptions, app).listen('3030', function () {
  console.log("Secure server listening on port 3030");
});

ポイントは、sslOptions でさっき作った証明書などを指定している部分です。サーバ側のkeyとcrt、そして自前認証局のcrtの3つを指定しています。

起動
$ nodejs server.js
Enter PEM pass phrase:
Secure server listening on port 3030
実行すると「Enter PEM pass phrase:」と表示され、サーバ証明書を作るときに入力したパスワードを聞かれますので入力してください。当然ですが、パスワードが違うとサーバアプリは起動されません。

ブラウザで確認
https://localhost:3030/ へアクセスしてみましょう。


Firefoxで確認すると警告が出ますが、「例外を追加」ボタンを押して、「セキュリティ例外を承認」すると無事にSSL対応ページが表示されます。

0 件のコメント:

コメントを投稿