【Ubuntu】【Node.js】SSL対応ウェブアプリ(テスト目的)を作ってみた
こんにちわ!
パンジェンシーです。
今回は、SSL対応の方法です。
と言っても、ちゃんとお金を払って作ってもらう証明書でなく、テスト用のオレオレ証明書を使った方法です。
環境
- Ubuntu 14.04 LTS 64bit
サーバー証明書の作成
まず、作業用のディレクトリーを作成しましょう。
$ mkdir ssl-cert $ cd ssl-cert
次に、秘密鍵を作成します。
$ openssl genrsa -des3 -out server.key 1024
パスフレーズを聞かれるので、入力します。
これで、server.keyが作成されます。
次に、証明書署名要求(csr)を作成します。
$ openssl req -new -key server.key -out server.csr
server.keyを作成した時に入力したパスフレーズを聞かれるので入力します。
他にも色々聞かれますが、「Common Name」の部分は、アプリのIPアドレスを入力しましょう。
ここをちゃんと入力しなかった場合、クライアントのブラウザに証明書をインストールしても、「この証明書はあんたのもんじゃないよ!」とかで怒られて警告が消えません。
特にそれでも問題なければ適当に入力しても構いません。
これで、server.csrが作成されます。
次に、サーバー証明書を作成します。
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
また、server.keyのパスフレーズを聞かれるので入力します。
これでserver.crtが作成されます。
アプリのSSL対応
Expressのバージョンによってもやり方が違うみたいですが、今回は4.x系でのやり方です。
まず、先ほど作成した証明書をディレクトリーごとプロジェクトにコピーします。
ここでは、
で作成したサンプルアプリに修正を加えます。
bin/wwwを以下のように書き直します。
bin/www
#!/usr/bin/env node var debug = require('debug')('sample-login'); var app = require('../app'); var fs = require('fs'); var https = require('https'); var options = { //passphrase: [ここにパスフレーズを入力] key: fs.readFileSync('./ssl-cert/server.key'), cert: fs.readFileSync('./ssl-cert/server.crt') }; app.set('port', process.env.PORT || 3000); var server = https.createServer(options, app).listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); });
実行
では、アプリを実行してみましょう。
$ npm start
パスフレーズを聞かれるので入力するとアプリが起動します(上記コードのoptions内でコメントアウトしているpassphraseの部分にパスフレーズを入力しておけば、ここでいちいち入力しなくていいのですが、パスフレーズが平文でコードに埋め込まれているのはセキュリティ上アカンと思います。今回はテスト用なのでそれでもいいかな?)。
ブラウザから、https://127.0.0.1:3000にアクセスします。
アプリの画面が表示されれば成功です!