mkcert を使ってローカル開発環境(MAMP) に SSL を設定
ローカル開発環境で SSL(HTTPS)を使いたいとき、従来は OpenSSL で秘密鍵やサーバ証明書を手作業で作成する必要がありました。しかしコマンドのオプションは複雑で、証明書の設定を少しでも間違えるとブラウザに警告が出てしまうなど、とても面倒な作業でした。
そこで登場するのが mkcert です。自分が知らなかっただけですが、mkcert は実は随分以前から存在しており、そんな面倒な作業を一気に簡単にしてくれるツールです。
独自の認証局(CA)の作成から複数ドメイン対応の証明書発行までを、面倒な設定なしで、驚くほどシンプルなコマンドで実現できます。
本記事では、以下の環境で mkcert を使ったローカル証明書の発行方法 と、MAMP(Apache)で HTTPS を有効にする設定手順を解説します。
使用環境(Homebrew と MAMP はインストール済みであることが前提)
- macOS Sonoma 14.7.6
 - Homebrew 4.6.10
 - MAMP 7.2
 - mkcert 1.4.4
 
作成日:2025年09月15日
mkcert とは?
mkcert は、ローカル開発環境で HTTPS(SSL/TLS)を簡単に利用できるようにするツールです。従来の OpenSSL のように複雑なコマンドを覚えたり、ブラウザで警告が出るような自己署名証明書に悩まされたりする必要がなく、数回のコマンド実行で使えるようになります。
mkcert を利用するには、最初にツールをシステムへインストールする必要があります。macOS、Windows、Linux など環境によって導入方法は異なりますが、一度インストールすれば以後の作業は非常にシンプルです。
SSL を有効にするために必要なこと
HTTPS を利用するには、次の要素が欠かせません。
- ローカル認証局(CA)の作成・インストール
          
- ブラウザに信頼される証明書を発行するための「身元証明機関」です。
 
 - 証明書と秘密鍵の作成
          
- 対象のドメイン(例:example.localhost)ごとに発行し、Apache などのサーバーに設定します。
 
 - Apache(MAMP)の設定
          
- 作成した証明書と秘密鍵を正しく読み込むように、Apache の VirtualHost 設定を変更します。
 
 
mkcert はこれらのステップをシンプルにしてくれるため、開発環境での SSL 設定が格段に楽になります。
mkcert のインストール
この例では Homebrew を使って mkcert をインストールします。ターミナルで以下を実行します。
% brew install mkcert
        インストール後、正しく導入されたかを確認します(例:v1.4.4 のように表示されます)。
% mkcert -version
        Mac 以外のインストール方法は mkcert のページの Installation に記載されています。
Firefox で利用する場合は nss(Network Security Services)もインストールします。Firefox は macOS の証明書ストアではなく独自の証明書ストアを使うため、証明書登録時に certutil(nss に含まれる)が必要になります(システムのキーチェーンとは別に証明書を登録する必要があります)。
% brew install nss
        mkcert コマンドのオプション
インストールした mkcert コマンドのオプション(証明書の作成方法など)は以下で確認できます。
% mkcert -help
        ローカル認証局(CA)のインストール
以下のコマンドを実行して、ローカル認証局(CA)を作成・インストールします。
% mkcert -install
        実行すると macOS の 管理者パスワード を求められるので入力します。続いて「システム証明書信頼設定に変更を加える」ための許可ダイアログが表示されるので、そこで再度パスワードを入力します。
コマンドが完了すると、ローカル用の認証局(CA)がシステム証明書ストアに登録されます。nss がインストールされている場合は Firefox の証明書ストアにも追加されます。
確認方法
macOS では「キーチェーンアクセス」を開き、左ペインの「システム」を選択すると「mkcert ユーザー名」のような名前のルート認証局が追加されていることを確認できます。
macOS 14(Sonoma)の場合、「キーチェーンアクセス」は、Finder で「アプリケーション」→「ユーティリティ」から開きます。証明書のみを表示するには、「証明書」タブをクリックします。
この CA が追加されていれば、以降 mkcert で作成する証明書は「信頼できる証明書」として扱われます。
macOS 15(Sequoia)では、キーチェーンアクセスを開くには、Spotlight で検索して、Returnキーを押します。
証明書と秘密鍵の保存場所
CA の証明書と秘密鍵は mkcert -CAROOT で確認できます。macOS では通常以下の場所になります。
このディレクトリには以下のようなファイルが含まれます(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)で、テキストエディタで開くと、以下のように書かれています。
証明書と秘密鍵の作成
MAMP の Apache 設定に組み込む場合は、/Applications/MAMP/conf/apache/ 配下に証明書用ディレクトリを作成して、証明書と秘密鍵を保存するのが一般的なようです。
この例ではわかりやすいように ssl ディレクトリを作成します(ディレクトリ名は任意)。
% cd /Applications/MAMP/conf/apache
% mkdir ssl
% cd ssl
        次に、localhost 用の証明書と秘密鍵を作成します(ssl ディレクトリで以下を実行)。
% mkcert localhost
        実行すると、カレントディレクトリに以下のファイルが生成されます。
- 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(秘密鍵)
 
コマンド実行時のメッセージに証明書の有効期限が表示されます。
ホスト名と hosts ファイル
証明書を作成しただけではアクセスできないため、/etc/hosts に以下を追加して、ブラウザから正しく解決できるようにしておきます。関連項目:hosts ファイルの編集
複数ドメインに対応
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 つ追加ドメインがある」という意味です。最初に指定したホスト名が必ず基準になります。
複数のドメインは、前述の例のような「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 つの追加ドメイン」という意味です。証明書ファイル名は「最初のホスト名+追加数」という形式になります。
証明書の使い回しについて
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)を再起動すれば利用を継続できます。
上記を実行すると、既存の 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 のバージョンや環境によって異なる場合があるので、適宜確認してください。
推奨フロー
- httpd.conf 編集 → mod_socache_shmcb のロード確認、httpd-ssl.conf 読み込み有効化
 - httpd-ssl.conf 編集 →DocumentRoot と ServerName の変更、証明書と秘密鍵の設定
 - Apache 再起動
 - まず https://localhost/ にアクセスして正常に表示されるか確認
 - 問題なければ、バーチャルホストを追加して各ドメイン用の SSL の設定を行う
 
httpd.conf の編集
MAMP の 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
            mod_socache_shmcb モジュールの読み込みが無効のまま、SSL を有効化して、MAMP を再起動すると Apache が起動しません(設定ファイルのチェック)。
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 の設定が読み込まれるようになり、SSL 設定が有効化されます。
次に、この httpd-ssl.conf を編集します。
httpd-ssl.conf の編集
有効化した SSL の 設定ファイル httpd-ssl.conf は以下にあります:
httpd-ssl.conf は、Apache で SSL/TLS(https://〜)通信を行うための設定ファイルで、Apache が HTTPS サイトとして動作するための基本設定を行っています。
ここでは「どのフォルダを公開するか」「どのホスト名でアクセスするか」「ログの保存先」などを定義し、さらに SSLEngine on で SSL を有効化しています。
DocumentRoot と ServerName の変更
httpd-ssl.conf のファイル内にあるデフォルトの VirtualHost 設定の「General setup for the virtual host」部分を探します。
この設定ブロックは、HTTPS (443番ポート) 用のデフォルトバーチャルホストを定義し、以下のような基本的な情報を Apache に伝えるためのものです。
- どのディレクトリを公開するか(DocumentRoot)
 - どのホスト名でアクセスするか(ServerName)
 - ログ出力先や管理者メールアドレス
 - SSL を有効化するかどうか(SSLEngine on)
 - 証明書と秘密鍵のパス
 
_default_ は、「名前ベースのバーチャルホストに一致しない場合に適用されるデフォルト」を意味します。
##
## 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"
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
#   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"
・・・中略・・・
</VirtualHost>
            初期状態では MAMP のサンプル用パスやサーバー名(www.example.com:443 など)が設定されています。これをローカル環境に合わせて変更します。
例として、以下のように修正すると、MAMP の標準ドキュメントルート /Applications/MAMP/htdocs を HTTPS で公開し、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 を使用しています。
証明書と秘密鍵の設定
続いて、mkcert で作成した証明書と秘密鍵のパスを指定します。
以下の部分の 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 モジュールに問題がないかを早い段階でチェックできる)。
 
確認手順
- Apache を再起動
              
- MAMP の GUI から再起動でも、ターミナルからでも構いません。
 
 - ブラウザでアクセス
              
- URL に 
https://localhost/を入力してアクセスします。 
 - URL に 
 
例えば Chrome の場合、セキュリティ警告が出ずに、以下のように表示されれば成功です。
「この接続は保護されています」の部分をクリックすると以下のように表示されます。
「証明書は有効です」の部分をクリックすると、「証明書ビューア」が開き、mkcert で作成した証明書の内容が表示されます。
警告が出る場合は、証明書のインストールや 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> 
 - Apache 2.4 以降ではディレクトリへのアクセスはデフォルトで拒否されます。そのため、対象ディレクトリにアクセスを許可するには明示的に 
 
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` の両方に対応する証明書が生成されます。
生成されるファイル:
- 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 証明書でまとめることも可能です。
例えば以下のコマンドで証明書を発行すると、
以下のファイルが生成されます。
- 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> は省略しています。
MAMP(Apache)が起動しない
SSL の設定を行ったあと、MAMP の Apache を再起動したときにエラーで起動しないことがあります。
よくある原因
- httpd.conf など設定ファイルの記述ミス
 - 必要なモジュールが読み込まれていない
 - 証明書や秘密鍵ファイルのパスが間違っている
 
設定ファイルのチェック
ターミナルで以下のコマンドを実行すると、Apache の設定ファイルに文法エラーがないかをチェックすることができます。
% /Applications/MAMP/Library/bin/apachectl configtest
          この apachectl は、MAMP に同梱されている Apache 用の管理コマンドで、/Applications/MAMP/Library/bin/ ディレクトリに配置されています。
macOS 標準の Apache(インストールされていれば)にも apachectl がありますが、MAMP の Apache を操作するときは必ずこちらのパスを使う必要があります。
- Syntax OK と表示されれば、文法上の問題はありません。
 - エラーがある場合は、原因がエラーメッセージに表示されます。
 
例:モジュール不足によるエラー
これは以下を意味します:
- httpd-ssl.conf の 92 行目で SSLSessionCache shmcb:... が指定されている
 - Apache が shmcb セッションキャッシュをサポートしていない → モジュール未ロード
 - mod_socache_shmcb をロードする必要がある
 
対処方法
この場合、httpd.conf 内の以下の行のコメントアウトを外します(mod_socache_shmcb のロード)。
例:証明書や秘密鍵ファイルのパスが間違っている
上記エラーは、httpd-vhosts.conf の 44 行目の SSLCertificateFile に指定したパスが間違っていることを意味します。そのため、該当部分のパスを修正する必要があります。
エラーログの確認
文法チェックで問題がなくても、モジュールの依存関係や証明書のパス指定ミスなどで Apache が起動しない場合があります。
その際はエラーログを確認します。
MAMP の Apache エラーログ(デフォルト)
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog "/Applications/MAMP/logs/apache_error.log"
          httpd-ssl.conf で指定されているログファイル(例)
<VirtualHost _default_:443>
#   General setup for the virtual host
# DocumentRoot "/Applications/MAMP/Library/htdocs"
# ServerName www.example.com:443
DocumentRoot "/Applications/MAMP/htdocs"
ServerName localhost
ServerAdmin you@example.com
ErrorLog "/Applications/MAMP/Library/logs/error_log"
TransferLog "/Applications/MAMP/Library/logs/access_log"
          








