mkcert を使ってローカル開発環境(MAMP) に SSL を設定

ローカル開発環境で SSL(HTTPS)を使いたいとき、従来は OpenSSL で秘密鍵やサーバ証明書を手作業で作成する必要がありました。しかしコマンドのオプションは複雑で、証明書の設定を少しでも間違えるとブラウザに警告が出てしまうなど、とても面倒な作業でした。

そこで登場するのが mkcert です。自分が知らなかっただけですが、mkcert は実は随分以前から存在しており、そんな面倒な作業を一気に簡単にしてくれるツールです。

独自の認証局(CA)の作成から複数ドメイン対応の証明書発行までを、面倒な設定なしで、驚くほどシンプルなコマンドで実現できます。

本記事では、以下の環境で mkcert を使ったローカル証明書の発行方法 と、MAMP(Apache)で HTTPS を有効にする設定手順 を分かりやすく解説します。

使用環境

作成日:2025年09月15日

mkcert のインストール

この例では Homebrew を使って mkcert をインストールします。ターミナルで以下を実行します。

% brew install mkcert
% brew install mkcert
==> Fetching downloads for: mkcert
==> Downloading https://ghcr.io/v2/homebrew/core/mkcert/manifests/1.4.4
######################################################################### 100.0%
==> Fetching mkcert
==> Downloading https://ghcr.io/v2/homebrew/core/mkcert/blobs/sha256:192c46a9873
######################################################################### 100.0%
==> Pouring mkcert--1.4.4.sonoma.bottle.tar.gz
🍺  /usr/local/Cellar/mkcert/1.4.4: 7 files, 4MB
==> Running `brew cleanup mkcert`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> No outdated dependents to upgrade!

インストール後、正しく導入されたかを確認します(例:v1.4.4 のように表示されます)。

% mkcert -version

Mac 以外のインストール方法は mkcert のページの Installation に記載されています。

Firefox で利用する場合は nss もインストールします。Firefox は macOS の証明書ストアではなく独自の証明書ストアを使うため、証明書登録時に certutil(nss に含まれる)が必要になります。

% brew install nss
% brew install nss
==> Fetching downloads for: nss
==> Downloading https://ghcr.io/v2/homebrew/core/nss/manifests/3.115.1
################################################################################################# 100.0%
==> Fetching dependencies for nss: nspr
==> Downloading https://ghcr.io/v2/homebrew/core/nspr/manifests/4.37
################################################################################################# 100.0%
==> Fetching nspr
==> Downloading https://ghcr.io/v2/homebrew/core/nspr/blobs/sha256:926173cc071ce815b2ce530b4a853d7461517
################################################################################################# 100.0%
==> Fetching nss
==> Downloading https://ghcr.io/v2/homebrew/core/nss/blobs/sha256:351a27ba72c48a82714be3b00f61cde66bb5c7
################################################################################################# 100.0%
==> Installing nss dependency: nspr
==> Downloading https://ghcr.io/v2/homebrew/core/nspr/manifests/4.37
Already downloaded: /Users/toyoki/Library/Caches/Homebrew/downloads/33f9f6278844ab4ffa1c8b09cdf9e1d608f0ad0df4c0e17501ed1f94a3c073e0--nspr-4.37.bottle_manifest.json
==> Pouring nspr--4.37.sonoma.bottle.tar.gz
🍺  /usr/local/Cellar/nspr/4.37: 81 files, 1MB
==> Pouring nss--3.115.1.sonoma.bottle.tar.gz
🍺  /usr/local/Cellar/nss/3.115.1: 216 files, 17.0MB
==> Running `brew cleanup nss`...
Disable this behaviour by setting `HOMEBREW_NO_INSTALL_CLEANUP=1`.
Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).
==> No outdated dependents to upgrade!

mkcert コマンドのオプション

インストールした mkcert コマンドのオプション(証明書の作成方法など)は以下で確認できます。

% mkcert -help
% mkcert -help
Usage of mkcert:

  $ mkcert -install
  Install the local CA in the system trust store.

  $ mkcert example.org
  Generate "example.org.pem" and "example.org-key.pem".

  $ mkcert example.com myapp.dev localhost 127.0.0.1 ::1
  Generate "example.com+4.pem" and "example.com+4-key.pem".

  $ mkcert "*.example.it"
  Generate "_wildcard.example.it.pem" and "_wildcard.example.it-key.pem".

  $ mkcert -uninstall
  Uninstall the local CA (but do not delete it).

Advanced options:

  -cert-file FILE, -key-file FILE, -p12-file FILE
      Customize the output paths.

  -client
      Generate a certificate for client authentication.

  -ecdsa
      Generate a certificate with an ECDSA key.

  -pkcs12
      Generate a ".p12" PKCS #12 file, also know as a ".pfx" file,
      containing certificate and key for legacy applications.

  -csr CSR
      Generate a certificate based on the supplied CSR. Conflicts with
      all other flags and arguments except -install and -cert-file.

  -CAROOT
      Print the CA certificate and key storage location.

  $CAROOT (environment variable)
      Set the CA certificate and key storage location. (This allows
      maintaining multiple local CAs in parallel.)

  $TRUST_STORES (environment variable)
      A comma-separated list of trust stores to install the local
      root CA into. Options are: "system", "java" and "nss" (includes
      Firefox). Autodetected by default.

ローカル認証局(CA)のインストール

以下のコマンドを実行して、ローカル認証局(CA)を作成・インストールします。

% mkcert -install

実行すると macOS の 管理者パスワード を求められるので入力します。続いて「システム証明書信頼設定に変更を加える」ための許可ダイアログが表示されるので、そこで再度パスワードを入力します。

% mkcert -install
Created a new local CA 💥  # ローカル認証局が生成された
Sudo password: # パスワードを入力

The local CA is now installed in the system trust store! 👍 # ローカル認証局がシステムの証明書ストアに追加された
The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊 # ローカル認証局がFirefoxの証明書ストアに追加された

コマンドが完了すると、ローカル用の認証局(CA)がシステム証明書ストアに登録されます。nss がインストールされている場合は Firefox の証明書ストアにも追加されます。

確認方法

macOS では「キーチェーンアクセス」を開き、左ペインの「システム」を選択すると「mkcert ユーザー名」のような名前のルート認証局が追加されていることを確認できます。

「キーチェーンアクセス」は、Finder で「アプリケーション」→「ユーティリティ」から開きます。

この CA が追加されていれば、以降 mkcert で作成する証明書は「信頼できる証明書」として扱われます。

証明書と秘密鍵の保存場所

CA の証明書と秘密鍵は mkcert -CAROOT で確認できます。macOS では通常以下の場所になります。

% mkcert -CAROOT
/Users/xxxxx/Library/Application Support/mkcert

このディレクトリには以下のようなファイルが含まれます(Library フォルダは隠しフォルダです)。

  • rootCA.pem:ローカル認証局(CA)の公開証明書
  • rootCA-key.pem:ローカル認証局(CA)の秘密鍵(※ 絶対に外部に漏らさないこと

CA 証明書はデフォルトで 10 年有効です。

CA などの用語について

用語について少し整理。

認証局(CA)とルート認証局の違い

  • 認証局(CA, Certificate Authority)
    • 証明書を発行する機関やソフトウェア。
  • ルート認証局(Root CA)
    • 信頼の最上位に位置する認証局で、自身が自己署名証明書を持ちます。
    • OS やブラウザは、この「ルート CA」を信頼の起点として、そこから下位に連なる「中間 CA」や「サーバー証明書」を信頼する仕組みになっています。

mkcert が作成するもの

  • mkcert -install を実行すると、自己署名の CA 証明書(rootCA.pem) が生成され、macOS の「システム証明書ストア」に ルート認証局(Root CA) として登録されます。
  • したがって、Mac の「キーチェーンアクセス」で確認すると「信頼されたルート証明書」として表示されます。

mkcert はローカル専用の ルート認証局(Root CA) を作成し、macOS の証明書ストアに登録します。

.pem ファイル

.pem は PEM(Privacy Enhanced Mail)形式でエンコードされた証明書や鍵ファイルです。中身はテキスト(Base64)で、テキストエディタで開くと、以下のように書かれています。

-----BEGIN CERTIFICATE-----
...(Base64 文字列)
-----END CERTIFICATE-----

証明書と秘密鍵の作成

MAMP の Apache 設定に組み込む場合は、/Applications/MAMP/conf/apache/ 配下に証明書用ディレクトリを作成して、証明書と秘密鍵を保存するのが一般的です。

この例ではわかりやすいように ssl ディレクトリを作成します(ディレクトリ名は任意)。

% cd /Applications/MAMP/conf/apache
% mkdir ssl
% cd ssl

次に、localhost 用の証明書と秘密鍵を作成します(ssl ディレクトリで以下を実行)。

% mkcert localhost
% mkcert localhost

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

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

It will expire on 12 December 2027 🗓

実行すると、カレントディレクトリに以下のファイルが生成されます。

  • localhost.pem : サーバー証明書
  • localhost-key.pem: 秘密鍵(外部に漏らさないこと)

mkcert で生成される証明書は CA バンドル付きなので、Apache にそのまま設定可能です。

また、複数のドメインやサブドメインを扱う場合は、後述のようにホスト名をスペース区切りで指定できます。

秘密鍵の扱いについて

  • 秘密鍵(localhost-key.pem)は外部に漏らさないこと。
  • Git リポジトリなどに入れないこと。

バーチャルホストごとの証明書発行

開発環境では localhost だけでなく、example.localhost のような独自のローカルドメイン(バーチャルホスト)を設定することもあります。

その場合は、以下のように mkcert の引数にドメイン名(ホスト名)を指定して証明書を作成します。

% mkcert example.localhost

実行すると、カレントディレクトリに次のファイルが生成されます。

  • example.localhost.pem(証明書)
  • example.localhost-key.pem(秘密鍵)

コマンド実行時のメッセージに証明書の有効期限が表示されます。

% mkcert example.localhost

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

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

It will expire on 12 December 2027 🗓 # 有効期限(825日)

ホスト名と hosts ファイル

証明書を作成しただけではアクセスできないため、/etc/hosts に以下を追加して、ブラウザから正しく解決できるようにしておきます。関連項目:hosts ファイルの編集

127.0.0.1 example.localhost

複数ドメインに対応

1つの証明書で複数のドメインを扱いたい場合(例:example.localhost と www.example.localhost)は、スペース区切りで指定できます。

ワイルドカード(*.localhost)には対応していないため、必要なホスト名は明示的に列挙します。

% mkcert example.localhost www.example.localhost

この場合、SAN(Subject Alternative Name)に両方のホスト名が含まれた証明書が生成され、どちらのドメインでも同じ証明書を利用可能です。

SAN は「証明書が有効なホスト名を列挙する仕組み」で、現在のブラウザは「CN(Common Name)」よりも SAN を優先して検証します。

実行すると、カレントディレクトリに次のファイルが生成されます。

  • example.localhost+1.pem(証明書)
  • example.localhost+1-key.pem(秘密鍵)

+1 は「最初のホスト名(example.localhost)に 1 つ追加ドメインがある」という意味です。最初に指定したホスト名が必ず基準になります。

% mkcert example.localhost www.example.localhost

Created a new certificate valid for the following names 📜
 - "example.localhost"
 - "www.example.localhost"

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

It will expire on 12 December 2027 🗓

複数のドメインは、前述の例のような「www. のあり・なし」だけではなく、物理的に別々のサイトを割り当てることも可能です。

mkcert foo.localhost bar.localhost baz.localhost

上記を実行すると、以下のすべてに対応する 1 枚の証明書が生成されます。

  • foo.localhost
  • bar.localhost
  • baz.localhost

作成されるファイル例:

  • foo.localhost+2.pem(証明書)
  • foo.localhost+2-key.pem(秘密鍵)

+2 は「最初のホスト名(foo.localhost)+ 2 つの追加ドメイン」という意味です。証明書ファイル名は「最初のホスト名+追加数」という形式になります。

% mkcert foo.localhost bar.localhost baz.localhost

Created a new certificate valid for the following names 📜
 - "foo.localhost"
 - "bar.localhost"
 - "baz.localhost"

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

It will expire on 12 December 2027 🗓

証明書の使い回しについて

1 枚の SAN 証明書を複数 VirtualHost で使うことは可能ですが、完全に別のプロジェクトや環境では個別発行の方が管理しやすいです。

SAN 証明書 メリットとデメリット

複数ドメインを 1 枚の証明書(SAN 証明書)にまとめることにはメリットとデメリットがあります。

メリット

  • 管理がシンプル:1 枚の証明書で複数ホストをカバー
  • 導入が簡単:VirtualHost ごとに証明書を用意する必要なし
  • 更新作業が楽:有効期限が揃うのでまとめて更新可能

デメリット

  • 追加・削除に弱い:ドメインを追加したい場合は再発行が必要
  • 証明書サイズ増加:SAN が多いと情報量が増える(開発ではほぼ気にしなくてよい)
  • 有効期限が一律:一部だけ延長はできない

運用のポイント

  • 同一サイトで複数ホストを使う場合 → SAN 証明書が便利
    • 例:example.localhost と www.example.localhost(www あり/なしなど)
  • 完全に別サイト(物理的に別々のサイト)として管理する場合 → 個別発行の方がシンプル
    • 例:example.localhost と foo.localhost(別のプロジェクトに使う場合)
  • 新しいドメインを随時追加する場合 → 個別発行して使い分けた方が効率的
    • mkcert newsite.localhost で都度証明書を作れば OK

有効期限

mkcert で発行した証明書には有効期限があります。

現在のバージョン(v1.4.4)では、証明書の有効期限は 825日(約2年3か月) に設定されています(実際の有効期限は、証明書発行時のメッセージで確認できます)。

期限切れになるとブラウザで「この接続は安全ではありません」といった警告が表示されます。

その場合は、同じコマンドで再発行し、Apache(MAMP)を再起動すれば利用を継続できます。

% cd /Applications/MAMP/conf/apache/ssl
% mkcert localhost

上記を実行すると、既存の localhost.pem と localhost-key.pem が上書きされます。

他の設定に影響はありませんが、既存の pem ファイルが上書きされるので、必要なら事前にバックアップします。

SAN 証明書(複数ドメイン対応)を使っている場合も、同じコマンドで再発行が必要です。

※ mkcert が作成するローカル認証局(CA)の有効期限は 10 年程度あるため、基本的には証明書だけを更新すれば問題ありません。

MAMP(Apache)の設定

※ 以下は MAMP バージョン 7.2 の例です。

SSL を有効にするために、Apache の設定ファイル httpd.conf と httpd-ssl.conf を編集します。

念のため、編集前にバックアップを取っておくと安心です。

% cp /Applications/MAMP/conf/apache/httpd.conf /Applications/MAMP/conf/apache/httpd.conf.bak
% cp /Applications/MAMP/conf/apache/extra/httpd-ssl.conf /Applications/MAMP/conf/apache/extra/httpd-ssl.conf.bak

パスは MAMP のバージョンや環境によって異なる場合があるので、適宜確認してください。

推奨フロー

  1. httpd.conf 編集 → mod_socache_shmcb のロード確認、httpd-ssl.conf 読み込み有効化
  2. httpd-ssl.conf 編集 →DocumentRoot と ServerName の変更、証明書と秘密鍵の設定
  3. Apache 再起動
  4. まず https://localhost/ にアクセスして正常に表示されるか確認
  5. 問題なければ、バーチャルホストを追加して各ドメイン用の SSL 設定を行う

httpd.conf の編集

MAMP の Apache 設定ファイル httpd.conf は以下にあります:

/Applications/MAMP/conf/apache/httpd.conf

mod_socache_shmcb のロード

まず、SSL セッションキャッシュ用のモジュール(mod_socache_shmcb)が有効になっているか確認します(MAMP 6 ではデフォルトで有効でしたが、MAMP 7.2 では無効になっています)。

#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

上記のようにコメントアウトされている場合は、この行の先頭の # を削除して、コメントを外します。

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

SSL の設定ファイルの読み込みを有効に

続いて、SSL の設定ファイル(httpd-ssl.conf)を読み込む行を有効化します。

デフォルトでは以下のようにコメントアウトされています。

# Secure (SSL/TLS) connections
#Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf

#Include ... の行の先頭の # を削除してコメントを外し、SSL 設定を有効化します。

# Secure (SSL/TLS) connections
Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf

これで httpd-ssl.conf の設定が読み込まれるようになります。

次に、この httpd-ssl.conf を編集して証明書の場所を指定します。

httpd-ssl.conf の編集

有効化した SSL の 設定ファイル httpd-ssl.conf は以下にあります:

/Applications/MAMP/conf/apache/extra/httpd-ssl.conf
DocumentRoot と ServerName の変更

httpd-ssl.conf のファイル内にあるデフォルトの VirtualHost 設定の「General setup for the virtual host」部分を探します。

デフォルトでは MAMP のサンプル用パスやサーバー名(www.example.com:443 など)が設定されています。これをローカル環境に合わせて変更します。

##
## SSL Virtual Host Context
##

<VirtualHost _default_:443>

#   General setup for the virtual host
DocumentRoot "/Applications/MAMP/Library/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog "/Applications/MAMP/Library/logs/error_log"
TransferLog "/Applications/MAMP/Library/logs/access_log"

この例では、DocumentRootServerName の部分を以下のように変更します。

MAMP のデフォルトの /Applications/MAMP/htdocs と localhost を使用しています。

DocumentRoot "/Applications/MAMP/htdocs"
ServerName localhost

ServerName のポート番号

ここでは ServerName localhost としましたが、以下のようにポート番号を含めて書くこともできます。

ServerName localhost:443

デフォルトの設定は <VirtualHost _default_:443> となっているため、ServerName にポート番号を省略して書いても、自動的に 443 ポートのホスト名として扱われます。

  • ServerName localhost → VirtualHost が 443 のため、自動的に localhost:443 と解釈されます。
  • ServerName localhost:443 → 明示的に「443 ポートの localhost」と指定している書き方です。

どちらでも動作は同じですが、ここではシンプルに ServerName localhost を使用しています。

証明書と秘密鍵の設定

SSLCertificateFile と SSLCertificateKeyFile に、「証明書と秘密鍵の作成」で作成した証明書と秘密鍵を指定します。

#   Server Certificate: (証明書ファイル)
#   Point SSLCertificateFile at a PEM encoded certificate.  If
#   the certificate is encrypted, then you will be prompted for a
#   pass phrase.  Note that a kill -HUP will prompt again.  Keep
#   in mind that if you have both an RSA and a DSA certificate you
#   can configure both in parallel (to also allow the use of DSA
#   ciphers, etc.)
#   Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
#   require an ECC certificate which can also be configured in
#   parallel.
SSLCertificateFile "/Applications/MAMP/conf/apache/server.crt"
#SSLCertificateFile "/Applications/MAMP/conf/apache/server-dsa.crt"
#SSLCertificateFile "/Applications/MAMP/conf/apache/server-ecc.crt"

#   Server Private Key: (秘密鍵ファイル)
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
#   ECC keys, when in use, can also be configured in parallel
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server.key"
#SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server-dsa.key"
#SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server-ecc.key"

この例では、以下のように mkcert localhost コマンドで生成した証明書と秘密鍵を指定します。

#   Server Certificate: (証明書ファイル)
SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/localhost.pem"
#   Server Private Key: (秘密鍵ファイル)
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/localhost-key.pem"

localhost で SSL が動くことを確認

SSL 設定を行った後は、まず localhost で正しく動作するか確認してから、バーチャルホストの設定に進むと安心です。

  • localhost で問題なく動作すれば、バーチャルホスト追加時に発生した問題を個別に切り分けられます。
  • 逆に、ここでうまくいかない場合は、バーチャルホスト設定に進む前に設定ミスや権限問題を修正することができます(Apache や SSL モジュールに問題がないかを早い段階でチェックできる)。

確認手順

  1. Apache を再起動
    • MAMP の GUI から再起動でも、ターミナルからでも構いません。
  2. ブラウザでアクセス
    • URL に https://localhost/ を入力してアクセスします。

例えば Chrome の場合、セキュリティ警告が出ずに、以下のように表示されれば成功です。

警告が出る場合は、証明書のインストールや Apache の SSL 設定を再確認してください。

「証明書は有効です」の部分をクリックすると、「証明書ビューア」が表示されます。

関連項目:MAMP(Apache)が起動しない

補足説明

  • この確認を済ませておくと、後のバーチャルホスト(VirtualHost)設定もスムーズに進められます。
  • まず localhost を SSL 化しておけば、localhost 配下の複数のサブディレクトリサイトもまとめて SSL 対応できます。
  • localhost 配下のすべてのサブディレクトリ(例:localhost/sample1、localhost/sample2)は 1 つの VirtualHost で管理されます。
  • 別ドメイン(例:example.localhost、foo.localhost)をバーチャルホストとして設定している場合は、httpd-vhosts.conf に https(443番ポート)用の VirtualHost を追加します(次項参照)。

https 用の VirtualHost を追加

Apache では、http (80 番ポート) と https (443 番ポート) はそれぞれ別の VirtualHost として扱います。そのため、http 用の設定を残したまま、https 用の VirtualHost を追加する必要があります。

VirtualHost の設定は httpd-vhosts.conf と httpd-ssl.conf に分けることもできますが、将来的なメンテナンスを考えると、同じファイル(httpd-vhosts.conf)にまとめて記述する方が管理が楽です。

設定例

以下は、既存の http 用 VirtualHost に加えて、https 用 VirtualHost を追加した例です。

証明書と秘密鍵は mkcert example.localhost コマンドで発行したものを指定します。

# 既存の 80番ポート用の VirtualHost の設定
<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

# 以下を追加
<VirtualHost *:443>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost

  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/example.localhost.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/example.localhost-key.pem"

  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

設定ポイント

https (443 番ポート) 用の VirtualHost に以下を指定

  • SSLEngine on
    • SSL を有効化するディレクティブです。
  • SSLCertificateFile / SSLCertificateKeyFile
    • 証明書と秘密鍵のファイルパスを指定します。
    • mkcert コマンド実行時に出力されるファイル名・パスを確認します。
  • <Directory>
    • Apache 2.4 以降ではディレクトリへのアクセスはデフォルトで拒否されます。そのため、対象ディレクトリにアクセスを許可するには明示的に Require all granted を記述する必要があります。
    • また、<Directory> ディレクティブディレクティブは VirtualHost の外側にも書けますが、VirtualHost の中に書く方がホストごとに権限が明確になるため推奨です。

      <VirtualHost *:80>
        DocumentRoot "/Applications/MAMP/htdocs/example"
        ServerName example.localhost
      </VirtualHost>
      
      <VirtualHost *:443>
        DocumentRoot "/Applications/MAMP/htdocs/example"
        ServerName example.localhost
      
        SSLEngine on
        SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/example.localhost.pem"
        SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/example.localhost-key.pem"
      </VirtualHost>
      
      <Directory "/Applications/MAMP/htdocs/example">
        Require all granted
      </Directory>
80 番 VirtualHost の扱いについて

すべてのサイトを https で統一する場合、理論的には 80 番ポート(http)の VirtualHost 設定は不要です。しかし、実際の開発環境では「リダイレクト用に残しておく」と便利です。

80 番 VirtualHost を残す理由

  • 誤って http://example.localhost にアクセスした場合でも、自動的に https://example.localhost に誘導できる
  • 本番環境と同じように「http から https へのリダイレクト動作」を再現できる
  • ローカルの古いリンクやブックマークが http:// のままでも問題なくアクセスできる

リダイレクト設定例

http アクセス時に常に https へリダイレクトする場合は、次のように Redirect を指定します。

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost
  Redirect permanent / https://example.localhost/
</VirtualHost>

:80 側での localhost 設定

一方、httpd-ssl.conf には 443 番ポート(https)専用の「デフォルト SSL VirtualHost」が存在します。

<VirtualHost _default_:443>
  DocumentRoot "/Applications/MAMP/htdocs"
  ServerName localhost
  ...
</VirtualHost>

この設定は https 用なので、http(ポート80)には影響しません。

そのため、httpd.conf または httpd-vhosts.conf に :80 用の VirtualHost を定義する必要があります。

定義しない場合、Apache のデフォルト設定が使われ、意図しない DocumentRoot が選ばれる可能性があります。

以下を httpd-vhosts.conf に追加することで、http://localhost/ でアクセスする場合も https://localhost/ と同じ DocumentRoot が使われるようになります。

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs"
  ServerName localhost
  <Directory "/Applications/MAMP/htdocs">
    Require all granted
  </Directory>
</VirtualHost>
1つの証明書で複数ドメインに対応

1つの証明書を複数のホスト名に対応させる方法には2つあります。

  • (A) 同じサイト(同じ DocumentRoot)の場合 → ServerAlias を活用
  • (B) 別サイト(DocumentRoot が異なる場合)の場合 → VirtualHost を分ける
(A) 同じサイト(同じ DocumentRoot)の場合

mkcert では 1 枚の証明書に複数のホスト名(SAN: Subject Alternative Name)を含めることができます。例えば以下のコマンドで発行すると、`example.localhost` と `www.example.localhost` の両方に対応する証明書が生成されます。

% mkcert example.localhost www.example.localhost

生成されるファイル:

  • example.localhost+1.pem(証明書)
  • example.localhost+1-key.pem(秘密鍵)

VirtualHost の設定例

80 番ポートと 443 番ポートの各 <VirtualHost> では ServerName が example.localhost と www.example.localhost で異なるだけで、DocumentRoot を含むその他の設定は同じです。

次項の ServerAlias を利用すれば、簡潔に記述できます。

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName www.example.localhost
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost

  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1-key.pem"
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName www.example.localhost

  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1-key.pem"
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

ServerAlias の活用

同じ DocumentRoot を共有する場合は、ServerAlias を使って VirtualHost を1つにまとめられるので、上記は以下のように記述できます。

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost
  ServerAlias www.example.localhost
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:443>
  DocumentRoot "/Applications/MAMP/htdocs/example"
  ServerName example.localhost
  ServerAlias www.example.localhost

  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/example.localhost+1-key.pem"
  <Directory "/Applications/MAMP/htdocs/example">
    Require all granted
  </Directory>
</VirtualHost>

※ ServerAlias は「同じコンテンツを複数のドメイン(ホスト名)で提供する場合」に使用します。

(B) 別サイト(DocumentRoot が異なる場合)の場合

異なる DocumentRoot を持つ複数サイトを 1 枚の SAN 証明書でまとめることも可能です。

例えば以下のコマンドで証明書を発行すると、

% mkcert foo.localhost bar.localhost baz.localhost

以下のファイルが生成されます。

  • foo.localhost+2.pem
  • foo.localhost+2-key.pem

この証明書の SAN には foo.localhost, bar.localhost, baz.localhost が含まれており、どのドメインでアクセスしても有効になります。

ただし物理的に別サイトなので(DocumentRoot が異なるので)、VirtualHost はドメインごとに分けて設定します(証明書ファイルは同じものを参照します)。ServerAlias は使えません。

<VirtualHost *:443>
  ServerName foo.localhost
  DocumentRoot "/Applications/MAMP/htdocs/foo"
  <Directory "/Applications/MAMP/htdocs/foo">
    Require all granted
  </Directory>
  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2-key.pem"
</VirtualHost>

<VirtualHost *:443>
  ServerName bar.localhost
  DocumentRoot "/Applications/MAMP/htdocs/bar"
  <Directory "/Applications/MAMP/htdocs/bar">
    Require all granted
  </Directory>
  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2-key.pem"
</VirtualHost>

<VirtualHost *:443>
  ServerName baz.localhost
  DocumentRoot "/Applications/MAMP/htdocs/baz"
  <Directory "/Applications/MAMP/htdocs/baz">
    Require all granted
  </Directory>
  SSLEngine on
  SSLCertificateFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2.pem"
  SSLCertificateKeyFile "/Applications/MAMP/conf/apache/ssl/foo.localhost+2-key.pem"
</VirtualHost>

※ 80 番ポートの各 <VirtualHost> は省略しています。

関連項目:SAN 証明書にまとめるこメリットとデメリット

MAMP(Apache)が起動しない

SSL の設定を行ったあと、MAMP の Apache を再起動したときにエラーで起動しないことがあります。

よくある原因

  • httpd.conf など設定ファイルの記述ミス
  • 必要なモジュールが読み込まれていない
  • 証明書や秘密鍵ファイルのパスが間違っている

設定ファイルのチェック

ターミナルで以下のコマンドを実行すると、Apache の設定ファイルに文法エラーがないかチェックできます。

% /Applications/MAMP/Library/bin/apachectl configtest
  • Syntax OK と表示されれば、文法上の問題はありません。
  • エラーがある場合は、原因がエラーメッセージに表示されます。

例:モジュール不足によるエラー

AH00526: Syntax error on line 92 of /Applications/MAMP/conf/apache/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).

これは以下を意味します:

  • httpd-ssl.conf の 92 行目で SSLSessionCache shmcb:... が指定されている
  • Apache が shmcb セッションキャッシュをサポートしていない → モジュール未ロード
  • mod_socache_shmcb をロードする必要がある

対処方法

この場合、httpd.conf 内の以下の行のコメントアウトを外します(mod_socache_shmcb のロード)。

# LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

エラーログの確認

文法チェックで問題がなくても、モジュールの依存関係や証明書のパス指定ミスなどで Apache が起動しない場合があります。

その際はエラーログを確認します。

MAMP の Apache エラーログ(デフォルト)

/Applications/MAMP/logs/apache_error.log

httpd-ssl.conf で指定されているログファイル(例)

/Applications/MAMP/Library/logs/error_log