読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

Node.js(Express) のWebアプリケーションをLet's Encryptでhttps化する

Node.jsで運用中のアプリケーションをLet's Encryptでhttps化しました。今回はnginxを使わずにNode.jsを直接Webサーバーとして利用します。

環境:

  • Ubuntu 14.04
  • Node.js 6.7.0

前提条件

  • 独自ドメインを設定済みで正引き設定のAレコードでHTTPリクエストを送ることができる。
  • 外部からサーバーのポート80番と443番にアクセスできる
  • gitとpythonをインストール済み

最初にLet's Encryptからプロジェクトをインストールします。

git clone https://github.com/letsencrypt/letsencrypt.git

そしてcertbotを起動します。nginxやApacheを利用する場合はもっと簡単に設定できますが、証明書だけを発行してもらってから、それを手動でアプリケーションに設定する方法をとります。

cd letsencrypt
./certbot-auto certonly

するとwebrootとstandaloneのどちらかを選べという質問が表示されます。ここではstandaloneを選択します。

f:id:mochizuki_p:20161121024900p:plain

次には連絡先としてEメールアドレスを入力するように促されます。入力して次に

f:id:mochizuki_p:20161121024928p:plain

利用規約に同意しろ。ということなので一応目を通しておいてください。Agreeを選択

次は重要です。

f:id:mochizuki_p:20161121025400p:plain

https化したいドメイン名をサブドメインの部分を含めて入力してください。/やhttp://は含みません。

成功すると以下のようなメッセージが表示されます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-02-18. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to mochizuki@example.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

重要なのは3行目にあるパスで、

  /etc/letsencrypt/live/example.com/fullchain.pem. 

とあります。このディレクトリ /etc/letsencrypt/live/example.com に証明書一式が配置されているので確認しましょう。example.comはあなたの利用しているドメイン名が入るはずです。

cert.pem  chain.pem  fullchain.pem  privkey.pem

あとで利用するのはcert.pemとprivkey.pemです。この2つのファイルの絶対パス/etc/letsencrypt/live/example.com/cert.pem

と/etc/letsencrypt/live/example.com/privkey.pemをメモしておきましょう。

次に起動中のNode.jsアプリケーションのホームディレクトリに移動します。

もしhttpsをインストールしていなければ以下を入力

sudo npm install https --save

sudo npm install 

起動中のNode.jsアプリケーションのサーバー設定のファイルを開きます。Expressならbin/wwwのファイルになります。

最初にhttpをコメントアウトしてhttpsに書き換えます

//var http = require('http');
var https = require('https');

そしてポートを80から443へ変更

//var port = normalizePort(process.env.PORT || '80');
var port = normalizePort(process.env.PORT || '443');

そして秘密鍵と証明書のパスを指定したオプションを定義して、サーバーを設定します。

var options = {
  key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem')
};
//var server = http.createServer(app);
var server = https.createServer(options,app)

そしてサーバーを再起動しましょう。

sudo npm start

適当なブラウザからプロトコルをhttpsに変更してアクセスして、鍵マークが付いていたら成功です。

f:id:mochizuki_p:20161121025450p:plain