Mac で MAMP に SSL(https://)を設定

Mac の MAMP で SSL(https://localhost)を使えるようにするための設定方法の覚え書きです。OpenSSL を使った秘密鍵とサーバ証明書の作成方法の基本的なことや MAMP の Apache の設定方法について。

作成日:2020年2月13日

概要

以下が通常の証明書のおおまかな発行手順です。

  1. 秘密鍵ファイル(server.key)を作成
  2. 秘密鍵ファイルから証明書署名要求ファイル(server.csr)を作成
  3. 証明書署名要求ファイルを認証局に送付
  4. 認証局は認証局の秘密鍵で証明書署名要求ファイルに署名してサーバ証明書(server.crt)を作成して返却

この例の場合は、ローカル環境なので自分が認証局になって(なりすまして)証明書を作成します。

  • 3.の「証明書署名要求ファイルを認証局に送付」は行わない
  • 4.のサーバ証明書の作成は、自分で作った秘密鍵で署名して作成

MAMP で SSL を使えるようにするには以下の2つファイルを MAMP の Apache に設定する必要があります(ファイル名は任意の名前を付けられます)。

  • 秘密鍵のファイル(例:server.key)
  • サーバ証明書のファイル(例:server.crt)

以下を実施すると MAMP のローカル環境で https:/localhost にアクセスできるようになりますが、初回のアクセス時には「この接続ではプライバシーが保護されません」などの警告が表示されます。また、キーチェーンに以下で作成した証明書を追加しても、Safari 以外のブラウザではアドレスバーに「保護されていない通信」などのセキュリティの警告が表示されます。

秘密鍵とサーバ証明書の作成

秘密鍵とサーバ証明書は openssl というコマンドを使って作成します。openssl がインストールされていない場合は、Homebrew などでインストールすることができます。

この例では、作成する秘密鍵とサーバ 証明書は「/Applications/MAMP/conf/apache/」に任意の名前のディレクトリを作成して保存します。この例の場合は「myssl」という名前のディレクトリを作成して保存します。

~ $ cd /Applications/MAMP/conf/apache/    return #MAMP の conf/apache/ へ移動
apache $ mkdir myssl    return # myssl というディレクトリを作成
apache $ cd myssl    return #作成した myssl へ移動
myssl $ 

秘密鍵の作成

この例では RSA 方式(公開鍵暗号方式)の秘密鍵を作成するので openssl genrsa コマンドを利用します。

以下のコマンドは秘密鍵長: 2048bit の server.key という名前の秘密鍵(のファイル)を作成します。

myssl $ openssl genrsa 2024 > server.key  return 
Generating RSA private key, 2024 bit long modulus
.............................+++
....................+++
e is 65537 (0x10001)

myssl $ ls  return #ディレクトリ内のファイルを表示
server.key #openssl genrsa コマンドで作成されたファイル

証明書署名要求(CSR)の作成

次に証明書署名要求(Certificate Signing Request)を作成します。

証明書署名要求は、認証局(この例の場合は自分自身)にサーバの公開鍵に電子署名してもらうよう要求するメッセージ(ファイル)です。

証明書署名要求を作成するには openssl req コマンドを使います。

本来はまず秘密鍵から公開鍵を作る必要がありますが、openssl req コマンドの -key オプションで秘密鍵を指定すれば自動的に公開鍵を取りだしてくれるため、公開鍵の作成は必要ありません。

コマンドを実行すると証明書を発行して欲しいサーバの情報(Distinguished Name)を求められるので入力します。ローカル環境なのでほとんどの項目は何も入力せず return を押してデフォルト値を用いて問題ありませんが、「Common Name」はドメイン名(FQDN)として localhost と入力します。

以下の例では server.csr という証明書署名要求のファイルを作成します。

myssl $ openssl req -new -key server.key > server.csr  return 
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:   return  #省略
State or Province Name (full name) []: return   #省略
Locality Name (eg, city) []: return   #省略
Organization Name (eg, company) []: return   #省略
Organizational Unit Name (eg, section) []: return   #省略
Common Name (eg, fully qualified host name) []:localhost return #ドメインを入力
Email Address []: return   #省略

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: return   #省略

myssl $ ls return #ディレクトリ内のファイルを表示
server.csr  #openssl req コマンドで作成されたファイル
server.key

SSL サーバ証明書の作成

最後に SSL サーバ証明書を作成します。通常は上記で作成した証明書署名要求 (server.csr) を VeriSign などの認証局に送付して署名してもらいますが、最初に作成した自分の秘密鍵 (server.key) で署名します。

サーバ証明書に署名するには openssl x509 コマンドで -req オプションを指定します。

-signkey オプションで自分で作成した秘密鍵(server.key)を指定し、入力ファイルは証明書署名要求 (server.csr)で署名しています。

その際に -days オプションで有効期限を10年(3650日)に指定して証明書(server.crt)を作成しています。

myssl $ openssl x509 -req -days 3650 -signkey server.key < server.csr > server.crt  return 

Signature ok
subject=/CN=localhost
Getting Private key
myssl $ ls return #ディレクトリ内のファイルを表示
server.crt  #openssl x509 コマンドで作成されたファイル
server.csr	
server.key

この時点で「/Applications/MAMP/conf/apache/myssl」ディレクトリには以下のように3つのファイル(server.crt、server.csr、server.key)が作成されています。

SSL サーバ証明書の確認

作成した証明書の内容を確認するには openssl x509 コマンドで -text オプションを指定します。

myssl $ openssl x509 -text < server.crt  return 
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 16694230507965253213 (0xe7add23279c2065d)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: CN=localhost
        Validity
            Not Before: Feb 13 08:04:26 2020 GMT
            Not After : Feb 10 08:04:26 2030 GMT
        Subject: CN=localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2024 bit)
                Modulus:
                    00:cf:06:6a:5b:0d:2d:3e:a1:3d:d4:f0:99:78:d9:
                    ・・・中略・・・
                    a5:ba:2b:78:82:28:cb:40:64:92:7a:50:e8:f7
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
         a2:8e:a4:51:d8:b4:c6:54:e4:c9:5b:47:ff:9a:96:b4:d9:c0:
         ・・・中略・・・
         6d
-----BEGIN CERTIFICATE-----
MIICnDCCAYgCCQDnrdIyecIGXTANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDDAls
・・・中略・・・
IwxHvNGahqmYHH5NmEzVJCHqOZ93VBExbvEokdF4VZDqoSFfLLL16HESx0E9or1t
-----END CERTIFICATE-----

以下のような情報が確認できます。

  • Issuer :証明書署名要求(CSR)に署名した者(CN=localhost)
  • Subject:証明されたいサーバの情報(CN=localhost)
  • Validity:証明書の有効期間(Feb 13 2020 〜 Feb 10 2030 →3650日)

秘密鍵を暗号化

秘密鍵にパスワードを設定(共通鍵暗号方式で暗号化)することもできます。

【注意】 MAMP の場合、httpd-ssl.conf の秘密鍵の指定(SSLCertificateKeyFile)で暗号化した秘密鍵を指定すると、構文チェック(apachectl configtest)では「Syntax OK」となりますが、Apache が起動しませんでした。 別途、暗号化していない秘密鍵を作成して指定すると Apache を起動することができました。

また、秘密鍵を暗号化して証明書を作成してもブラウザ表示での警告を回避できるわけでもないようなので(もしかしたら別途何らかの設定が必要なのかも知れません)、以下の作業を行う意味は殆どないと思います

以下は単に試してみたことの覚書ですので、読み飛ばしていただいて問題ありません(実施すると手間が増えるだけだと思います)。

秘密鍵を暗号化すると、秘密鍵を使おうとするとパスワードを求められます。

以下は -des3 オプションを指定して DES3 方式で暗号化した秘密鍵(server.key)を作成する例です。

またこの例の場合リダイレクトの代わりに -out オプションで出力するファイルを指定しています。

秘密鍵長のオプション(以下の場合は 2048 bit)は最後に指定する必要があります。

パスワードは以降の作業でも求められるのでメモしておきます。

myssl $ openssl genrsa -des3 -out server.key 2048 return
Generating RSA private key, 2048 bit long modulus
.....................+++
...............+++
e is 65537 (0x10001)
Enter pass phrase for server.key:  #パスワードを入力
Verifying - Enter pass phrase for server.key:  #もう一度パスワードを入力

証明書署名要求の作成

以下はパスワードを設定した秘密鍵(server.key)を使って証明書署名要求(server.csr)を作成する例です。

秘密鍵にパスワードが設定してあるため以下のコマンドを実行するとパスワードの入力を求められるので、秘密鍵を作成する際に設定したパスワードを入力します。

myssl $ openssl req -new -key server.key -out server.csr return
Enter pass phrase for server.key:  #パスワードを入力
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:localhost
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:    

SSL サーバ証明書の作成

以下はパスワードを設定した秘密鍵(server.key)と証明書署名要求(server.csr)を使ってサーバ証明書(server.crt)を作成する例です。

この場合もパスワードの入力を求められます。

また、この例の場合は入力ファイルの証明書署名要求 (server.csr)はリダイレクトの代わりに -in オプションを指定しています。

myssl $ openssl x509 -req -signkey server.key -days 3650 -in server.csr -out server.crt return
Signature ok
subject=/CN=localhost
Getting Private key
Enter pass phrase for server.key:  #パスワードを入力

暗号化なしの秘密鍵の作成

このセクションの冒頭にも記載しましたが、httpd-ssl.conf の秘密鍵の指定で、上記で作成した暗号化した秘密鍵(server.key)を指定すると Apache が起動しなかったため、 別途、暗号化していない(パスワードを設定していない)秘密鍵(server-npw.key)を作成します。

httpd-ssl.conf を編集する際に、「SSLCertificateKeyFile」で指定する秘密鍵は「server-npw.key」を指定する必要があります。

myssl $ openssl rsa -in server.key -out server-npw.keyreturn
Enter pass phrase for server.key:  #パスワードを入力
writing RSA key

MAMP Apache の設定

MAMP の Apache に作成した server.key(秘密鍵)と server.crt(サーバ証明書)を設定します。証明書署名要求(server.csr)は、もう使わないので削除しても大丈夫です。

Apache の設定ファイル httpd.conf と httpd-ssl.conf を編集するので、別名で保存するなどバックアップしておきます。

httpd.conf の編集

デフォルトでは MAMP の Apache の設定ファイル(httpd.conf)は SSL の設定ファイルの読み込みは以下のようにコメントアウトされています。

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

SSL の設定ファイル(httpd-ssl.conf)を読み込むように「#」を削除してコメントを外します(有効化します)。

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

httpd-ssl.conf の編集

有効化した httpd-ssl.conf を編集します。

以下のような部分を探して、「DocumentRoot」と「ServerName」を環境に合わせて変更します。

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

この例の場合は、以下のように変更しました。

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

サーバ証明書(Server Certificate)のパス

サーバ証明書のパスを変更するため、以下の行を探してサーバ証明書のパスの部分を変更します。

SSLCertificateFile "/Applications/MAMP/conf/apache/server.crt"

この例ではサーバ証明書のファイルは「/Applications/MAMP/conf/apache/myssl/」に「server.crt」という名前で保存したので以下のように変更しました。

SSLCertificateFile "/Applications/MAMP/conf/apache/myssl/server.crt"

秘密鍵(Server Private Key)のパス

秘密鍵のパスを変更するため、以下の行を探して秘密鍵のパスの部分を変更します。

SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server.key"

この例では秘密鍵のファイルは「/Applications/MAMP/conf/apache/myssl/」に「server.key」という名前で保存したので以下のように変更しました。

SSLCertificateKeyFile "/Applications/MAMP/conf/apache/myssl/server.key"
バーチャルホストの設定

例えば、http://localhost/webdesignleaves/ を http://webdesignleaves.localhost/ でアクセスできるようにバーチャルホスト(Virtual Host)を設定している場合は、追加の設定が必要です。

まず、httpd-ssl.conf ファイルに「NameVirtualHost *:443」を追加します。s場所は <VirtualHost _default_:443> より前に追加します。

##
## SSL Virtual Host Context
##

NameVirtualHost *:443   # ★★★ 追加 ★★★

<VirtualHost _default_:443>

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

続いて設定するそれぞれのバーチャルホストを最後の方に追加します。

この例では、httpd-ssl.conf ファイルの末尾に追加しています。

<VirtualHost *:443>
    DocumentRoot "/Applications/MAMP/htdocs/webdesignleaves"
    ServerName webdesignleaves.localhost
    SSLEngine on
    SSLCertificateFile /Applications/MAMP/conf/apache/myssl/server.crt
    SSLCertificateKeyFile /Applications/MAMP/conf/apache/myssl/server.key
</VirtualHost>

文法チェック

設定ファイルの変更が終了したら、以下のコマンドを実行して設定ファイルに問題がないかを確認します。

「Syntax OK」と表示されれば文法上の問題はありません。(関連項目:apachectl configtest

/Applications/MAMP/Library/bin/apachectl configtest return
Syntax OK  # 設定ファイルの記述が正しい場合

問題がないようであれば、MAMP を再起動します。

セキュリティの警告

設定が完了してブラウザで https://localhost にアクセスすると以下のようなセキュリティの警告が表示されます(以下は Chrome の場合の例です)。

「詳細設定」をクリックすると以下のように表示されるので「xxxx にアクセスする(安全ではありません)」のリンクをクリックするとサイトにアクセスできます。

但し、アドレスバーには警告が表示されます。

以下は Firefox の場合の例です。

キーチェーンに証明書を追加

キーチェーンに証明書を追加することで、Safari の場合は警告が表示されなくなりました。

キーチェーンアクセスを開いてサイドバーの「システム」を選択して作成した証明書のファイル(server.crt)をドロップします。

パスワードを求められるので入力すると、以下のように「localhost」の証明書が追加されます。

追加した証明書をダブルクリックすると以下のようなウィンドウが開くので、「信頼」をクリックして展開し、「この証明書を使用するとき:」のドロップダウンから「常に信頼」を選択します。

Safari で開くと以下のように表示されます。

但し、Chrome では「保護されていない通信」、Firefox では「安全ではない接続」と表示されてしまいます。

以下のサイトを参考にさせていただきました。