ローカル開発環境にSSLを設定できるmkcertがめちゃくちゃ便利だった

Advertisement

以前、MAMPでSSLを設定した際には手間のかかるプロセスを経てサーバー証明書と鍵を作成したんですが、mkcertというローカル環境に認証局(CA)をインストールするコマンドラインツールを使うと一瞬で作成できました。

鍵をしっかり管理しないとセキュリティリスクになるので注意が必要ですが、ローカル開発環境でSSLを手軽に設定できるめちゃくちゃありがたいツールです。

以下、mkcertでサーバー証明書と鍵を作って、MAMP 6.3のApache 2.4に設定するところまでをご紹介します。

Macのバージョンなど

以下の環境で設定、動作確認を行いました。

  • macOS Big Sur 11.2.2(Mac mini, M1 2020)
  • MAMP 6.3
  • mkcert 1.4.3(Homebrew 3.0.4でインストール)

証明書と鍵の作成の設定

1. mkcertのインストール

Homebrewを使ってmkcert をインストールします。※僕の場合Homebrewを使ってインストールしましたが、mkcertのGitHubページ に他のインストール方法も書いてあります。

brew install mkcert

僕はFirefoxをメインに使っているのでnssというツールもインストールしました。

brew install nss

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

インストールしたmkcertを使って、以下のコマンドでローカル認証局(CA)を設定します。

mkcert -install

3. 証明書と鍵の作成

次に証明書と鍵を作成します。まずは、証明書と鍵を保存するディレクトリに移動します。僕の場合はMAMPのApache用に以下のディレクトリにしました。

cd /Applications/MAMP/conf/apache/keys/

以下のコマンドでlocalhost用の証明書と鍵を作成します。以下のコマンドを打つとlocalhost.pemlocalhost-key.pemというファイルが作成されます。

mkcert localhost

これでローカル認証局の設定と証明書と鍵の作成が完了です。めちゃくちゃ簡単ですね!

余談になりますがmkcert -installで作成された鍵ファイルのありかは以下のコマンドで確認できます。セキュリティに関わるのでしっかり管理しましょう!

mkcert -CAROOT

MAMPの設定(v6.3時点)

1. ポートの設定

MAMP 6.3のPreferences画面のPortsタブのキャプチャ。Apache Portは80、MySQL Portは3306に変更されている

MAMPのPreferencesのPortsタブでApacheとMySQLのPort番号を変更します。上の画像にある「80 & 3306」のボタンをクリックすると両方とも一気に変更されます。

2. httpd.confの設定変更

/Applications/MAMP/conf/apache/の中にあるhttpd.confファイルのSSL設定がコメントアウトされてるので「#」を削除して有効にします。httpd.confの設定がおかしくなるとサーバーが動かなくなるので、変更前にバックアップを取っておくことをお勧めします(MAMPの場合は/Applications/MAMP/conf/apache/originalにオリジナル・ファイルが入っています)。

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

以下に変更:

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

3. httpd-ssl.confの設定変更

/Applications/MAMP/conf/apache/extra/にあるhttpd-ssl.confファイルの以下の部分を変更します。注意)MAMP 5.xを使っている場合はこの変更の必要はありません。

#   Semaphore:
#   Configure the path to the mutual exclusion semaphore the
#   SSL engine uses internally for inter-process synchronization.
SSLMutex  "file:/Applications/MAMP/Library/logs/ssl_mutex"

以下に変更:

#   Semaphore:
#   Configure the path to the mutual exclusion semaphore the
#   SSL engine uses internally for inter-process synchronization.
Mutex default

さらに、httpd-ssl.confの以下の4つの項目を変更します。

  1. DocumentRoot
  2. ServerName
  3. SSLCertificateFile
  4. SSLCertificateKeyFile

以下のDocumentRootとServerNameを変更します。

##
## 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"

僕の場合は以下のように変更しました:

DocumentRoot "/Users/rriver/Sites/parashuto.com/site"
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"

僕の場合、変更後は以下の通り:

#   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/keys/localhost.pem"
#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/keys/localhost-key.pem"
#SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server-dsa.key"
#SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server-ecc.key"

これでMAMP 6.3で無事にhttps://localhostが動くようになりました!

さいごにひとこと

mkcertはクロスプラットフォームのツールで、MacだけでなくLinuxやWindows版も提供されているそうです。なので、知っておくと便利なツールですね。開発環境の整備などは極力楽に済ませたいですもんね〜。

では、Happy local SSL development environment!

参考にさせてもらったサイト

英語ですが、以下のページでmkcertの使い方だけでなく、認証局についてなど詳しく説明されていました。すごく勉強になりました。

About the author

Rriverのステッカーが貼られたMacBookの向こうにいる自分のMemojiの似顔絵

「明日のウェブ制作に役立つアイディア」をテーマにこのブログを書いています。アメリカの大学を卒業後、ボストン近郊のウェブ制作会社に勤務。帰国後、東京のウェブ制作会社に勤務した後、ウェブ担当者として日英バイリンガルのサイト運営に携わる。詳しくはこちら

ウェブ制作・ディレクション、ビデオを含むコンテンツ制作のお手伝い、執筆・翻訳のご依頼など、お気軽にご相談ください。いずれも日本語と英語で対応可能です。まずは、Mastodon @rriver@vivaldi.net Twitter @rriver 、またはFacebook までご連絡ください。