2018年2月9日金曜日

【Virtual Host 対応】コマンドツールで MAMP を SSL 対応しよう! - macOS High Sierra 編 -

前に「コマンドツールで MAMP を SSL 対応しよう! - macOS High Sierra 編 -」にて、MAMP で SSL対応するぜぃってやったのですが、このときは1サイト限定でした。まぁ一時的にテストするだけだし、問題ないでしょって思ってたら、Virtual Host で本格的なテスト環境を使いたいなんて人が出てきたのです!

そこまでやる気なかったのですが、乗りかかった船ですし、まぁやってみようということで対応しました。

※なお Firefox については、例外設定をしないと何をどうしても自己証明書(オレオレ証明書)の場合にはエラーでます。中間証明書やそれを使った署名、サーバー証明書+中間証明書を作ったり、中間証明書も Mac 側で信頼できるように設定してもダメじゃーって感じなので、「MAMP にそこまで労力かける意味があるのか」と思い直しました。そのうちまた試すかもしれませんが、Firefox は無視します。動作チェックは SafariとChromeです。



準備


MAMP で SSL を起動するまでの準備は、コマンドツールで MAMP を SSL 対応しよう! - macOS High Sierra 編 - をチェックしてください。

これを最後まですることで、 https://localhost については SSL 対応になります。

Chorme 58 から必須になった SAN (SubjectAltName) には対応していますが、ワイルドカードには対応していません。ドメイン、サブドメインごとに実行してください。

Step 1. example.com と subdomain.example.com の SSL 証明書作成



上記より、「mamp-create-ssl-for-vhosts.csh」をダウンロードして、デスクトップにおいたと仮定します。また Virtual Host として、 example.com と subdomain.example.com の2つを追加したいとします。

ターミナルアプリを起動して

cd $HOME/Desktop
csh -f mamp-create-ssl-for-vhosts.csh  example.com
csh -f mamp-create-ssl-for-vhosts.csh  subdomain.example.com

として証明書を作成してください。
途中確認やパスワードの入力を求めてきます。パスワードはなんでもいいですが、入力したパスワードを何度かいれる必要があるので一時的には覚えておいてください。忘れたら、また同じコマンドを実行すると前の設定を消して再登録します。

1. パスワード(パスフレーズ入力)

writing new private key to 'vhosts/subdomain.example.com.key'
Enter PEM pass phrase:

2. 証明書情報の入力

Country Name (2 letter code) [JP]:
から始まる。全部なにも変更せずに Enterのみを押す。

3. 「1」で入力したパスワードを入力(SSL証明書の発行)

Enter pass phrase for ./private/ssl.key:

4.  y を入力して Enter、確認画面が出るので y を入力して Enter(署名)


Sign the certificate? [y/n]: y

1 out of 1 certificate requests certified, commit? [y/n] y

下記のようになったらOK。ここで fail になる場合にはうまくいっていないので、再度
csh -f mamp-create-ssl-for-vhosts.csh  subdomain.example.com
コマンドを実行して「1」からやりなおそう。

Write out database with 1 new entries
Data Base Updated

5. 「1」で入力したパスワードを入力(SSL証明書からパスワードを抜く)


Enter pass phrase for vhosts/subdomain.example.com.key:
writing RSA key

Apache起動時にSSL証明書のパスワード入力を不要するための措置。

以上、今回は2つのドメインなので、2回やることになります。

フォルダ構成

/Applications/MAMP/conf/apache/ssl フォルダ以下に
example.com.crt
example.com.csr
example.com.key
example.com_nopass.key
subdomain.example.com.crt
subdomain.example.com.csr
subdomain.example.com.key
subdomain.example.com_nopass.key

というファイルが出来ているはず。
そのうち使うのは「青」の4つのファイルです。

Step 2. Virtual Host 設定(httpd-ssl.conf)


/Applications/MAMP/conf/apache/httpd-ssl.conf ファイルに下記の2つを追加します。

1. NameVirtualHost *:443


<VirtualHost> より前に設定しておいてください。


2. example.com と subdomain.example.com 用の Virtual Hostの設定を追加

末尾あたりに

<VirtualHost *:443>
     DocumentRoot "/Applications/MAMP/htdocs/example.com"
     ServerName example.com
     SSLEngine on
     SSLCertificateFile /Applications/MAMP/conf/apache/ssl/vhosts/example.com.crt
     SSLCertificateKeyFile /Applications/MAMP/conf/apache/ssl/vhosts/example.com_nopass.key
</VirtualHost>
<VirtualHost *:443>
     DocumentRoot "/Applications/MAMP/htdocs/subdomain.example.com"
     ServerName subdomain.example.com
     SSLEngine on
     SSLCertificateFile /Applications/MAMP/conf/apache/ssl/vhosts/subdomain.example.com.crt
     SSLCertificateKeyFile /Applications/MAMP/conf/apache/ssl/vhosts/subdomain.example.com_nopass.key
</VirtualHost>

を追加。
MAMPを再起動(サーバー停止 > サーバーを起動でOK)しておいてください。

3. フォルダの作成


アプリケーションフォルダ > MAMP > htdocs フォルダ以下に
  • example.com
  • subdomain.example.com
の2つのフォルダを作成しておいてください。
また index.html (HTML)をいれておくと確認しやすいでしょう。

コマンドでやるなら

mkdir /Applications/MAMP/htdocs/example.com
mkdir /Applications/MAMP/htdocs/subdomain.example.com

STEP 3.  /etc/hosts を編集して、 example.com, subdomain.example.com を名乗ろう!


直接編集するのは
sudo vi /etc/hosts 
とかで出来ます。ただ vi の使い方がーってなるかもしれないので、 Hosts ってアプリをつかうのがオススメです。インストールすると「システム環境設定」にアイコンがでます。


そして開くとグレーアウトして編集できないので左下にある「鍵」アイコンをクリックして、管理者モードにします。
で 「+」ボタンを押して、下図のように example.com と subdomain.example.com に対して、 127.0.0.1 という自分自身を示すIPアドレスを指定してください。




これで準備は整いました。
後はブラウザから

https://example.com


https://subdomain.example.com


にアクセスして安全と出れば成功です!

注意!


Hosts (/etc/hosts)にて、ウェブサイト(URL)の宛先を一時的に変えてしまうことで
実環境のテストや、移行前のテストとかに活用できます。ただテストが終わったら、「チェック」を外して無効化しておかないと、/etc/hosts は DNSよりも優先されるので、いつまでたっても /etc/hosts で設定した宛先のままになるので注意!

2018年2月9日 @kimipooh