httpsサーバを実行してみたよ

node.jsでは今までhttpサーバしか立てたことがなかったので、httpsサーバを立ててみました。
githubとかbitbucketで使う公開鍵暗号については一応知っていたのだけど、サーバ側になると話は別で、サーバ証明書とかチンプンカンプンだったのです。今もよくわかってないけど。
そろそろ調べておきたいなーと思い、調べたのでした。手順は参考にさせていただいたサイトのものとほとんど変わらないので、調べたというかそのまま試した感じなのですけど。
環境:OS X 10.7.5 / node.js 0.8.11

秘密鍵サーバ証明書を作る

最初にシード値のファイルを作ります。

$ head -c 20 /dev/random > seed.data

とりあえずランダムな20文字を使うことにしたのですけど、どうなんでしょうね。


次に秘密鍵の生成を。

$ openssl genrsa -rand seed.data -des3 1024 >secret-key.pem

ここでパスフレーズの入力を促されるので適当なパスフレーズを入力します。
ちょっとhttpsサーバを立ててみたいだけなので"aaaa"にしておきました。本番サーバでこんなことしたら、椅子を投げられると思います。


次にcsrファイルの作成です。

$ openssl req -new -key secret-key.pem -out csr.pem

なんとなく勘で入力しました。


よくわかっていないのですが、以下のようなオプションを指定する方法でコマンドを入力すると、対話的に聞いてこないみたいです。

$ openssl req -new -newkey rsa:2048 -x509 -nodes -days 365 -set_serial 0 \
  -subj '/C=JP/ST=Kanagawa/L=Yokohama City/CN=*.example.com' \
  -out wildcard.example.com.crt \
  -keyout wildcard.example.com.key

自動化も出来ると思うので、次に鍵を作ることがあればこっちを試してみようかなーと。


次に自己署名証明書秘密鍵?)の作成をします。

$ openssl x509 -in csr.pem -out server.cert -req -signkey secret-key.pem

これで秘密鍵が出来ました。


最後にパスフレーズを聞いてこない秘密鍵を作ります。

$ openssl rsa -in secret-key.pem -out secret-key-nopass.pem

これでないとnode.jsでサーバが起動できないので要注意です。
https.createServerの引数に{passphrase: 'パスフレーズ'}を加えれば大丈夫みたい。

httpsサーバを立てる

httpsサーバとして以下のようなコードを書きます。

index.js
#!/usr/bin/env node

var https = require('https'),
    fs = require('fs');

https.createServer({
  key: fs.readFileSync('./secret-key-nopass.pem'),
  cert: fs.readFileSync('./server.cert')
}, function (req, res) {
  res.writeHead(200);
  res.end('Hello!');
}).listen(3000, function () {
  console.log('server listening on %d', 3000);
});

あとは実行するだけ。

$ node index.js


これでブラウザからhttps://localhost:3000/にアクセスすると、信頼できない接続(Firefoxの場合)とかなんとか表示されたりします。
無視して接続すると"Hello!"が表示されるかと。


node.jsでhttpsサーバは立てられましたが、証明書とかよくわかっていないのでもうちょっと調べたいなーと思いました。まる。


参考:
SSL入門
node-http-proxyでバーチャルホストで振り分けつつhttp/https->websocketリバースプロキシの実験