TOMILOG

Next.jsで開発環境を超カンタンにSSL化

Next.jsで開発環境を超カンタンにSSL化
| 2020/05/18

開発環境で、SSL接続が必要なときってありますよね。ServiceWorkerだったり、WebARだったり。

mkcertを使って認証キーを用意すれば、nuxt.config.jsに数行の設定を追記するだけで、Nuxt.jsでは簡単にブラウザの警告も出さずにSSL化ができます。

mkcertでSSL認証キーの準備

mkcertとは、設定なしに開発環境でSSL認証をできるようにしてくれるツールです。

mkcertをインストール

$ brew install mkcert

(ドキュメントには、Linuxt, Windowsでのインストール方法も記載されています。)

認証局作成

SSL認証キーが正しいかを検査してくれる認証局というものをローカルに準備します。準備といっても一行実行するだけ。

$ mkcert -install

SSL証明書と認証キーを作成

$ cd /my/app/path/cert
$ mkcert localhost 127.0.0.1
Using the local CA at "/Users/****/Library/Application Support/mkcert" ✨

Created a new certificate valid for the following names 📜
 - "localhost"
 - "127.0.0.1"

The certificate is at "./localhost+1.pem" and the key at "./localhost+1-key.pem" ✅

適当なフォルダに証明書と認証キーを作成します。
私は、nuxtのフォルダと並列のディレクトリにcertフォルダを用意して、その中に作成しました。

また、他のドメイン・IPからもアクセスしたい場合は、引数に追加してください。(mkcert localhost 127.0.0.1 0.0.0.0 192.168.43.41

以上で認証キーの準備完了です。

余談ですが、opensslを使ってこちらの記事のようなことをしてました。
これをみたらmkcertのありがたみが100倍になります。。

Nuxt.jsの設定

こちらも非常に簡単!nuxt.config.jsに以下を追記。

// fsとpathを読み込んでない場合は先頭に追記
import fs from 'fs'
import path from 'path'

export default {
  // ここから
  server: {
    https: {
      key: fs.readFileSync(path.join(__dirname, '../cert/localhost+1-key.pem')),
      cert: fs.readFileSync(path.join(__dirname, '../cert/localhost+1.pem')),
    },
  },
  // ここまで
}

はい、これで起動すれば、もうSSL化されています。
https://localhost:3000 でアクセスできるはず。

ひとくふう

ただし、このままでは本番環境で実行するときも、認証キーを読み込みにいってしまうので、開発環境のときのみローカルSSL認証されるようにしましょう。

ということで、こちら。

const server = {}
if (process.env.NODE_ENV === 'development') {
  server.https = {
    key: fs.readFileSync(path.join(__dirname, '../cert/localhost+1-key.pem')),
    cert: fs.readFileSync(path.join(__dirname, '../cert/localhost+1.pem')),
  }
}

export default {
  server,
}

これで、開発環境のときのみSSL化に成功しました。

まとめ

開発環境での認証局・認証ファイルの作成からSSLの設定まで、たったこれだけの作業で可能となります。

mkcertによって開発環境用の認証キーの作成が簡単に行えたわけですから、応用すればwebpack-dev-serverなど他でも活用できます。

とみー
フリーランス ← フルスタックエンジニア ← Webデザイナー。2018年、長野県に移住しフルリモートで様々サービス開発に携わるフロントエンジニアとして活動中。開発で得た知見を発信していきます。