きんめも

語彙力がヤバイ

シュッとWoSignで証明書獲得とexpress(Node.js)でHTTPS通信をする

express-generatorで生成されたテンプレートでとりあえずHTTPS通信ができるようにすることを目標とします.

認証局は中国系SSL認証局沃通(WoSign)を使います.
WoSignは有効期限が3年間もあるのでLet’s Encryptよりも管理とかが楽だと思う.
(WoSignはこの前やらかしたけど個人用+ハッカソンのテスト用くらいなら問題ないでしょう…) <2017/1/25 追記> WoSignで新規作成された証明書はブラウザで警告が発生するようになったみたいです なのでこの記事は非推奨です。Let’s Encryptも設定が簡単になったのでそちらを使うのが良いでしょう。

WoSignで証明書を発行してもらう

ここではとにかく早く・楽にHTTPS通信を実現するために,WoSignに秘密鍵を作成してもらいます. WoSignは上記の前例もあるので,本当にセキュアな通信を必要とするならば自分で秘密鍵を作成しそこからCSRを生成すべきでしょう.

  1. WoSignの申請ページドメイン名,国,アカウント作成に必要な情報(フリーメールでも可)を入力します.

  2. myorderに申請したドメインの「Operation」がsent CSRとなっているので,そこをクリックして「Generated by system」でCSR秘密鍵の署名)や秘密鍵を自動で生成してもらいましょう.このとき入力するパスワードはあとで証明書と秘密鍵をダウンロードをする際に必要となります.

  3. 発行処理中のときは「Operation」がPendingとなるので15分くらい待つとGet Certとなるのでそこから証明書と秘密鍵をzip形式でダウンロードできます.

expressに証明書を設定する

express-generatorで生成されたテンプレートを元に説明します.

1. zipファイル中の「for Apache」を解凍.

$ unzip [さっきダウンロードしたファイル名].zip
$ cd  [さっきダウンロードしたファイル名]

$ unzip for\ Apache.zip

2. 証明書の編集

express用にサーバ証明書(2_[ドメイン名].crt)とroot証明書と中間証明書(1_root_bundle.crt)を結合します.(結合時,2と1の順番を間違えるとexpressでエラーになります)ついでに秘密鍵の名前も変えます.

$ cat 2_[ドメイン名].crt 1_root_bundle.crt > server.crt 
$ cp 3_[ドメイン名].key server_private.key

3. expressに証明書をコピー+権限の設定

まずexpressのテンプレートを生成します.(既存のプロジェクトに適用する場合は省略で)

$ express https-test 
$ cd https-test
$ npm i

今回はexpressのapp.jsがあるディレクトリにcertディレクトリを作り,そこに証明書を設置します.

$ mkdir cert

証明書設置後

$ chmod 700 cert
$ chmod 400 cert/*

4. bin/wwwの作成

certディレクトリに設置した証明書を読み込むbin/wwwを作成します.

$ mv bin/www bin/www-http
$ vim bin/www
var debug = require('debug')('web');<
var https = require('https');<
var app = require('../app');<
var fs = require('fs');<

var port = 443;
var options = {
    key: fs.readFileSync('./cert/server_private.key'),
    cert: fs.readFileSync('./cert/server.crt')
};

var server = app.listen(app.get('port'), function() {
https.createServer(options, app).listen(port);

あとはsudo npm startでサーバが立ち上がります.
(443ポートを使用で立ち上げるためsudoが必要になります)