mkcert

mkcert – ローカル開発のためのHTTPS証明書ツール

概要

mkcertは、ローカル開発環境で信頼された証明書を簡単に作成するためのゼロコンフィグツールです。FiloSottile氏によって開発され、GitHubで公開されています。

従来、ローカル開発でHTTPSを使用する場合、自己署名証明書を使用するとブラウザで警告が表示される問題がありました。mkcertはこの問題を解決し、ブラウザで完全に信頼されるローカル証明書を生成できます。

主な特徴

  • ゼロコンフィグ: 複雑な設定なしで使用可能
  • ローカルCA自動作成: システムルートストアにローカルCAを自動インストール
  • クロスプラットフォーム: Windows、macOS、Linux対応
  • 複数ブラウザ対応: Chrome、Firefox、Edge等で動作
  • ワイルドカード証明書: *.example.com形式のワイルドカード対応
  • IPアドレス対応: IPv4/IPv6アドレスでの証明書生成可能

仕組み

1. 初期セットアップ (mkcert -install)

2. 証明書の生成

              $ mkcert localhost 127.0.0.1 example.test
                               │
                               ▼
         ┌─────────────────────────────────────────────────┐
         │                  mkcert                         │
         │                                                 │
         │  ┌───────────────┐      ┌───────────────┐      │
         │  │ rootCA.pem   │      │rootCA-key.pem │      │
         │  └───────┬───────┘      └───────┬───────┘      │
         │          │    Signs with        │              │
         │          └──────────┬───────────┘              │
         │                     ▼                          │
         │          ┌───────────────────┐                 │
         │          │ Generate & Sign   │                 │
         │          │ New Certificate   │                 │
         │          └─────────┬─────────┘                 │
         └────────────────────┼────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
   ┌─────────────────────┐       ┌─────────────────────┐
   │   localhost.pem     │       │  localhost-key.pem  │
   │   (Certificate)     │       │   (Private Key)     │
   │                     │       │                     │
   │  Valid for:         │       │  Use with your      │
   │  - localhost        │       │  web server         │
   │  - 127.0.0.1        │       │                     │
   │  - example.test     │       │                     │
   └─────────────────────┘       └─────────────────────┘

3. ブラウザでの信頼フロー

   ┌──────────┐         HTTPS Request          ┌──────────────────────┐
   │          │ ─────────────────────────────▶ │    Local Server      │
   │  Browser │         localhost:443          │  (nginx/node/etc)    │
   │          │ ◀───────────────────────────── │                      │
   └──────────┘    Returns localhost.pem       │  Uses:               │
        │                                      │  - localhost.pem     │
        │                                      │  - localhost-key.pem │
        ▼                                      └──────────────────────┘
   ┌──────────────────────────────────────┐
   │  Browser checks certificate chain:   │
   │                                      │
   │  localhost.pem                       │
   │       │                              │
   │       │ signed by                    │
   │       ▼                              │
   │  rootCA.pem (in system store)        │
   │       │                              │
   │       ▼                              │
   │  ✓ TRUSTED! No warnings!             │
   └──────────────────────────────────────┘

4. 信頼チェーン

               ┌─────────────────────────────┐
               │      mkcert Root CA         │
               │   (Installed in System)     │
               │                             │
               │   "mkcert development CA"   │
               └─────────────┬───────────────┘
                             │
                             │ Signs
                             ▼
         ┌───────────────────────────────────────┐
         │         Site Certificates             │
         │                                       │
         │  ┌───────────┐  ┌───────────┐        │
         │  │ localhost │  │*.dev.local│  ...   │
         │  └───────────┘  └───────────┘        │
         └───────────────────────────────────────┘

インストール方法

Windows

# Chocolatey
choco install mkcert

# Scoop
scoop bucket add extras
scoop install mkcert

※管理者権限で実行する必要がある場合があります

macOS

# Homebrew
brew install mkcert
brew install nss  # Firefox対応

# MacPorts
sudo port install mkcert
sudo port install nss

Linux

# Arch Linux
sudo pacman -Syu mkcert

# Homebrew on Linux
brew install mkcert

# 事前に証明書ユーティリティをインストール
# Debian/Ubuntu: apt install libnss3-tools
# Fedora: dnf install nss-tools
# Arch: pacman -S nss

基本的な使い方

クイックスタート

# 1. 初期セットアップ(初回のみ)
mkcert -install

# 2. 証明書を生成
mkcert localhost 127.0.0.1

# 3. サーバーで使用
#    - localhost.pem     (証明書)
#    - localhost-key.pem (秘密鍵)

証明書生成の例

# localhostの証明書を生成
mkcert localhost

# 複数のドメイン/IPを指定
mkcert example.com "*.example.com" localhost 127.0.0.1 ::1

# 出力ファイル名を指定
mkcert -cert-file cert.pem -key-file key.pem localhost

CAファイルの場所確認

mkcert -CAROOT

コマンドオプション一覧

コマンド説明
mkcert -installローカルCAをシステムにインストール
mkcert -uninstallローカルCAをシステムから削除
mkcert -CAROOTCAファイルの場所を表示
mkcert localhostlocalhost用の証明書を生成
mkcert *.local 127.0.0.1ワイルドカード + IP証明書を生成
mkcert -pkcs12 localhost.p12ファイルを生成
mkcert -client localhostクライアント認証用証明書を生成
mkcert -ecdsa localhostECDSA鍵の証明書を生成
mkcert -cert-file FILE出力証明書ファイル名を指定
mkcert -key-file FILE出力秘密鍵ファイル名を指定

ファイルの保存場所

Windows

C:Users<USER>AppDataLocalmkcert
├── rootCA.pem          <- ルート証明書
└── rootCA-key.pem      <- 秘密鍵(共有禁止!)

macOS / Linux

~/.local/share/mkcert/   (macOSは ~/Library/Application Support/mkcert)
├── rootCA.pem          <- ルート証明書
└── rootCA-key.pem      <- 秘密鍵(共有禁止!)

対応ルートストア

  • macOS/Windowsシステムストア
  • Linux(update-ca-trust、update-ca-certificates、trust)
  • Firefox(NSS)
  • Chrome/Chromium
  • Java(JAVA_HOME設定時)

使用例

Node.js Expressでの使用

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

const options = {
  key: fs.readFileSync('./localhost-key.pem'),
  cert: fs.readFileSync('./localhost.pem')
};

https.createServer(options, app).listen(443);

Node.jsでの環境変数設定

Node.jsはシステムルートストアを使用しないため、環境変数の設定が必要です:

# Linux/macOS
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"

# Windows (PowerShell)
$env:NODE_EXTRA_CA_CERTS = "$(mkcert -CAROOT)rootCA.pem"

nginxでの設定例

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /path/to/localhost.pem;
    ssl_certificate_key /path/to/localhost-key.pem;
}

メリット

  1. 開発効率の向上: HTTPS警告なしでローカル開発が可能
  2. 本番環境との互換性: HTTPS前提の機能(Service Worker、Secure Cookie等)をローカルでテスト可能
  3. 簡単なセットアップ: 複雑なopensslコマンドが不要
  4. クロスブラウザ対応: 主要ブラウザすべてで動作

セキュリティ上の注意

╔═══════════════════════════════════════════════════════════╗
║                                                           ║
║   rootCA-key.pem = FULL POWER to intercept HTTPS          ║
║                                                           ║
║   ✗ DO NOT share this file                                ║
║   ✗ DO NOT use in production                              ║
║   ✗ DO NOT install on end-user machines                   ║
║                                                           ║
║   ✓ Development & testing ONLY                            ║
║                                                           ║
╚═══════════════════════════════════════════════════════════╝

重要な警告

  • 開発専用ツール: mkcertは開発・テスト目的のみに使用してください
  • 本番環境では使用禁止: 本番環境では Let’s Encrypt 等の信頼されたCAを使用
  • rootCA-key.pemを共有しない: このファイルを共有すると、セキュアなリクエストを傍受される可能性があります
  • エンドユーザーのマシンにインストールしない: 開発者のマシンのみで使用

参考リンク