概要
みなさんこんにちはcandleです。最近SSL通信で根幹に関わるセキュリティホールが見つかったのは記憶に新しいですね。
今回扱う、https通信というのは公開鍵暗号方式を使ったセキュアな通信のことです。
一般にweb上でやり取りされる通信はパケットという単位にデータが分割され、指定のサーバから今使っているPCまでデータが届きます。この時、やろうと思えば第三者がパケットの中身を閲覧することができます。
普通のwebサイトや動画サイトなど個人情報のやり取りなしでアクセスする分には第三者に閲覧されても問題ないのですが、webメールやfacebook、twitterなどそのまんま個人情報のやり取りをする場合、暗号化されていないと、問題です。
例えば、SNSサービスを作ろうと思っているなら、パスワードの入力画面は暗号化通信にした方が良いです。
今回は下のサイトを参考にさせてもらいました。
http://lab.cosmicguild.net/contents/matomemory/mamp-ssl-setting/
前提
MAMPがインストールされている
homebrewかMacportsがインストールされている。
opensslコマンドをインストールする
もしも、opensslがMacにインストールされているならこの部分は飛ばしてかまいません。
opensslをインストールしましょう。
homebrewなら下のコマンドで
brew install openssl
Macportsなら
port install openssl
でインストールできるとおもいます。
秘密鍵とサーバ証明書を用意する
参考サイトにある様に、下のapacheフォルダの中に
新しくkeysというフォルダを作ります。
/Applications/MAMP/conf/apache/
ターミナルを開いて、keysディレクトリに移動します。
cd /Applications/MAMP/conf/apache/keys/
秘密鍵を作る
では秘密鍵を作ります。keysディレクトリの中で下のコマンドを打ちます。
openssl genrsa -des3 1024 >secret-key.pem
するとパスワードが必要といってきます。
Enter pass phrase: Verifying - Enter pass phrase:
同じパスワードをいれましょう。パスワードは4文字以上なので、今回は「beam」にしました。
この秘密鍵をもとに証明書署名要求を作ります。
証明書署名要求とは英語でcertificate signing requestのことです。このcsrファイルを共通して信用されているといわれている認証局に送って、このサーバは信用できると署名してもらうファイルです。
分かりやすく表現すると、会社に出す書類を用意するということです。
下のコマンドを打ち込んで証明書署名要求(csr)をつくります。
openssl req -new -key secret-key.pem -out csr.pem
上のコマンドを入力すると、パスワードを求められます。先ほど秘密鍵を作った時に使ったパスワードを入力します。今回のサンプルの通りなら「beam」入力します。
自分を証明する為の情報を書き込む様に要求がでてきます。それに答えていきましょう。今回はあくまで個人で使うだけだし、認証局に署名してもらうわけじゃないので、適当でかまいません。
Country Name (2 letter code) [AU]: 国名(例Ja) State or Province Name (full name) [Some-State]: 県名(例Tokyo) Locality Name (eg, city) []:市区町村(例 Shinjuku) Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織名(例localhost) Organizational Unit Name (eg, section) []: 部署名(例省略) Common Name (eg, YOUR name) []: コモンネーム(例localhost) Email Address []: メールアドレス(例省略) Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 省略 An optional company name []: 省略
crtファイルを作る
csrファイルに署名をしてcrtファイルを作ります。
本来は認証局にcsrを送って、向こうが署名してcrtファイルで返ってくるのですが、今回は自分で署名します。
openssl x509 -in csr.pem -out server.cert -req -signkey secret-key.pem
同じ様に、秘密鍵のパスワードが求められるので入力しましょう。今回のサンプルでは「beam」でしたのでそれを入力します。
サーバー証明書が作成されました。
パスワードなし秘密鍵を作る
現在の秘密鍵はパスワードがついています。これをMAMPのapacheサーバで使う場合ちょっと問題になるらしいので、パスワードなしの秘密鍵をパスワードありの秘密鍵から生成します。
openssl rsa -in secret-key.pem -out secret-key-nopass.pem
以上でsslで必要なファイルはそろいました。
MAMPのapacheのポート番号を変更する
MAMPのapacheのデフォルトのポート番号は8888です。
これを普通のwebサーバが受け付ける80番に変更します。
MAMPを開き、「環境設定」から「ポート」を選び、「Apacheのポート」を80にします
余談ですが、私はできればポート8888を使いたかったので、8888のままでhttpsを試しましたが、どうやらhttpsはhttp80が動いていないと、うまくいかないことがわかりました。
hostsファイルを書き換えて独自ドメインでアクセスする
現在、MAMPにブラウザからアクセスするには2つあります。どちらもローカルホストを表しています。
1つ目は「localhost」
バーチャルホストを使いたいので、hostsファイルに独自ドメインを書いて使います。
ルートディレクトリのetcの中にhostsファイルがあります。
それをエディタで開きます。私はemacsを使います。
cd /etc/ sudo emacs hosts
hostsファイルに書き込むドメイン名は何でも良いのですが、分かりやすく「local.example.com」にします。
下の内容をhostsファイルに書きましょう。
127.0.0.1 local.example.com
hostsファイルを保存します。
MAMPを起動させて、ブラウザでhttp://local.example.com/MAMP/にアクセスします。
httpd.confファイルを編集する
apacheの設定が書かれているのがhttpd.confというファイルです。
httpd.confファイルにはSSLの設定ファイルとバーチャルホストの設定ファイルを読み込む為の記述があります。
初期設定ではコメントアウトされて無効になっていますが、これを有効にします。
httpd.confをエディタで開きます。
私は何時も、emacsを使っています。自分のなれているエディタで開いてください。
(追記 2017/2/3,コメントで教えて貰ったので修正しました。)
# Various default settings #Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
の部分下の様にします。
# Secure (SSL/TLS) connections Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
次に、httpd.confのバーチャルホストの記述も変更します。下の部分を
# Virtual hosts #Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
コメントインします。
# Virtual hosts Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
httpd-ssl.confを編集する
ターミナルで下のパスに移動します。
cd /Applications/MAMP/conf/apache/extra
httpd-ssl.confを編集します。
<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"
httpd-ssl.confの上の記述を下の様に変更します。DocumentRootはMAMPの標準的な公開ディレクトリのMAMPディレクトリ直下のhtdocsに変更します。ServerNameには先ほどhostsファイルに記述した独自ドメイン名を設定します。今回のサンプル通りなら、local.example.comになります。
<VirtualHost _default_:443> # General setup for the virtual host DocumentRoot "/Applications/MAMP/htdocs" ServerName local.example.com:443 ServerAdmin you@example.com ErrorLog "/Applications/MAMP/Library/logs/error_log" TransferLog "/Applications/MAMP/Library/logs/access_log"
httpd-ssl.confのサーバ証明書のパスを変更します。
デフォルトでは下のパスになっています。
SSLCertificateFile "/Applications/MAMP/conf/apache/server.crt"
これを下の様に変更します。server.crtの名前がserver.certに変更されているのに気をつけてください。
SSLCertificateFile "/Applications/MAMP/conf/apache/keys/server.cert"
秘密鍵のパスを通します。
デフォルトで下のパスになっているので
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/server.key"
これを、下の様に変更します。指定する秘密鍵はパスワードがついていない、secret-key-nopass.pemを使用します。
SSLCertificateKeyFile "/Applications/MAMP/conf/apache/keys/secret-key-nopass.pem"
httpd-vhosts.confを変更する
httpd-ssl.confと同じフォルダにhttpd-vhosts.confがあります。
NameVirtualHostの下あたりに次の内容を書きます。
<VirtualHost *:80> ServerAdmin you@local.example.com DocumentRoot "/Applications/MAMP/htdocs" ServerName local.example.com ErrorLog "logs/local.example.com-error_log" CustomLog "logs/local.example.com-access_log" common </VirtualHost>
これで保存しましょう。
これでSSLの設定は終わりです。
動作確認をする
http://local.example.com/MAMP
にアクセスします。
次に、https://local.example.com/MAMP
にアクセスします。
証明書の承認をしてくださいとでてきます。もちろん、自分で発行しているので「続ける」押して許可しましょう。
httpsでアクセスできました。成功です。
まとめ
httpsは恐らく個人情報をやりとりするサービスを作る人は必要になる機能だと思います。ローカル環境で使えれば、何かと便利だと思います。
まず最初に揚げ足を取る様で申し訳ないです。
「httpd.confファイルを編集する」の、
# Various default settings
#Include /Applications/MAMP/conf/apache/extra/httpd-default.conf
の部分下の様にします。
# 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
を
# Secure (SSL/TLS) connections
Include /Applications/MAMP/conf/apache/extra/httpd-ssl.conf
にですね
間違って記述していました。
修正しました。
ありがとうございます。
どうもどうも、二年振りです(笑)。
そういえばなんですけど、この技、Catalinaの最新版(10.15.3)で、MAMPが5.7でだとダメじゃないですか?
Apache couldn’t be started. Please check your MAMP installation and configuration.
っていうエラーが出て、前から参考にさせていただいてる、このページをずっと見ながらパスとか確認したんですけど、解決が出来なくて。
オレオレ証明書を信頼させる事すら出来ないっぽくもなったみたいです。
参考:https://qiita.com/suin/items/be87a7a581f30b38c5f7
作った証明書をダブルクリックするとキーチェーンが起動してエラーが出て「この項目の内容は取り出せません」って出てくるし、お手上げ状態でした。
OSのダウングレードするしかないかな^^;