mkcert – ローカル開発のためのHTTPS証明書ツール
概要
mkcertは、ローカル開発環境で信頼された証明書を簡単に作成するためのゼロコンフィグツールです。FiloSottile氏によって開発され、GitHubで公開されています。
従来、ローカル開発でHTTPSを使用する場合、自己署名証明書を使用するとブラウザで警告が表示される問題がありました。mkcertはこの問題を解決し、ブラウザで完全に信頼されるローカル証明書を生成できます。
主な特徴
- ゼロコンフィグ: 複雑な設定なしで使用可能
- ローカルCA自動作成: システムルートストアにローカルCAを自動インストール
- クロスプラットフォーム: Windows、macOS、Linux対応
- 複数ブラウザ対応: Chrome、Firefox、Edge等で動作
- ワイルドカード証明書:
*.example.com形式のワイルドカード対応 - IPアドレス対応: IPv4/IPv6アドレスでの証明書生成可能
仕組み
1. 初期セットアップ (mkcert -install)
$ mkcert -install
│
▼
┌─────────────────────────────────────────────────┐
│ mkcert generates │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ rootCA.pem │ │ rootCA-key.pem │ │
│ │ (Certificate) │ │ (Private Key) │ │
│ │ │ │ ⚠ SECRET! │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Windows │ │ macOS │ │ Linux │
│ System │ │ Keychain │ │ NSS/CA │
│ Store │ │ │ │ Store │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌───────────────────────────────┐
│ Root CA is now TRUSTED by │
│ your system & browsers │
└───────────────────────────────┘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 nssLinux
# 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 localhostCAファイルの場所確認
mkcert -CAROOTコマンドオプション一覧
| コマンド | 説明 |
|---|---|
mkcert -install | ローカルCAをシステムにインストール |
mkcert -uninstall | ローカルCAをシステムから削除 |
mkcert -CAROOT | CAファイルの場所を表示 |
mkcert localhost | localhost用の証明書を生成 |
mkcert *.local 127.0.0.1 | ワイルドカード + IP証明書を生成 |
mkcert -pkcs12 localhost | .p12ファイルを生成 |
mkcert -client localhost | クライアント認証用証明書を生成 |
mkcert -ecdsa localhost | ECDSA鍵の証明書を生成 |
mkcert -cert-file FILE | 出力証明書ファイル名を指定 |
mkcert -key-file FILE | 出力秘密鍵ファイル名を指定 |
ファイルの保存場所
Windows
C:\Users\
<USER>\AppData\Local\mkcert\
├── 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;
}メリット
- 開発効率の向上: HTTPS警告なしでローカル開発が可能
- 本番環境との互換性: HTTPS前提の機能(Service Worker、Secure Cookie等)をローカルでテスト可能
- 簡単なセットアップ: 複雑なopensslコマンドが不要
- クロスブラウザ対応: 主要ブラウザすべてで動作
セキュリティ上の注意
╔═══════════════════════════════════════════════════════════╗
║ ║
║ 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を共有しない: このファイルを共有すると、セキュアなリクエストを傍受される可能性があります
- エンドユーザーのマシンにインストールしない: 開発者のマシンのみで使用