パンジェンシーの「汗だく開発日誌」

システム開発の備忘録です。

【Ubuntu】【Node.js】SSL対応ウェブアプリ(テスト目的)を作ってみた

こんにちわ!
パンジェンシーです。

f:id:x-fieldatts:20150502134035p:plain

 

今回は、SSL対応の方法です。

と言っても、ちゃんとお金を払って作ってもらう証明書でなく、テスト用のオレオレ証明書を使った方法です。

環境

 

OpenSSLのインストール

まず、UbuntuにOpenSSLをインストールします。

$ sudo apt-get install openssl

サーバー証明書の作成

まず、作業用のディレクトリーを作成しましょう。

$ 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系でのやり方です。

まず、先ほど作成した証明書をディレクトリーごとプロジェクトにコピーします。

ここでは、

pangency.hatenablog.com

で作成したサンプルアプリに修正を加えます。


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にアクセスします。

アプリの画面が表示されれば成功です!

まとめ

今回は、オレオレ証明書を使ったSSL対応をしました。

テスト用としてはこれでよいと思いますが、決してこのまま外部に出さないようにしましょう…。


以上