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リバースプロキシの実験