Edited at

Mac で開発用 HTTPS サーバ構築

More than 3 years have passed since last update.

ほぼ自分用です。すいません。

Homebrew で nginx をインストールし、オレオレ証明書を作成して HTTPS サーバを起動するための覚え書きです。


準備

Homebrew を使うので事前にインストールします。(省略)

宗教上の事由で MacPorts 等他のパッケージ管理ツールを使用している場合は、それぞれのツールに合わせて操作を行ってください。


OpenSSL

$ openssl version

$ brew install openssl
$ brew link openssl --force
$ openssl version

Yosemite にデフォルトでインストールされている OpenSSL は 0.9.8zc と古いので、最新物をインストールします。

※理由があって 0.9.8zc を使い続ける場合はインストール不要です。

インストールした場合でも brew unlink openssl を実行することで元の OpenSSL が利用できます。


自己署名証明書の作成

/usr/local/etc/openssl/certs 以下に作成します。

-keyout-out に同じファイル名を指定することで、同じファイルに秘密鍵と証明書が書き込まれます。

$ cd /usr/local/etc/openssl/certs

$ openssl req -days 365 -new -nodes -newkey rsa:4096 -x509 -keyout cert.pem -out cert.pem

これで、有効期間が 1 年の証明書(と秘密鍵)が作成されました。

対話形式で証明書の内容を記入します。

今回、 Common Name の項目だけは重要になります。

ここに指定する FQDN は後述の hosts ファイルに記載する FQDN と同じものに設定してください。


証明書のインストール

作成した証明書をキーチェーンに読み込みます。

$ open cert.pem

常に信頼を選択します。


Hosts ファイルの設定

以下のように末尾に1行追記します。


/private/etc/hosts

##

# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

# add
127.0.0.1 example.com


これで、 example.com は 127.0.0.1 で名前解決されます。

⚠不要になったら追加した行は削除しておきましょう。


Diffie-Hellman パラメータの生成

$ openssl dhparam -out dhparam.pem 2048

そこそこ時間かかります。


Nginx

Nginx でローカルに HTTPS サーバを構築します。

$ brew install nginx

http セクションに include conf.d/*.conf が存在しなければ追加します。


/usr/local/etc/nginx

#user www-data;

worker_processes 2;
worker_rlimit_nofile 4096;
#pid /run/nginx.pid;

events {
worker_connections 1024;
# multi_accept on;
}

http {
##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include mime.types;
default_type application/octet-stream;

##
# Virtual Host Configs
##

include conf.d/*.conf;
}


個人的には sites-enabled から sites-available へシンボリックリンクを張る方法が好きですが、ここでは割愛。

conf.d/example.com.conf を作成します。


/usr/local/etc/nginx/conf.d/example.com.conf

upstream backend {

server unix:/tmp/backend.sock;
}

server {
listen 4433 ssl;
server_name _;

# SSL
ssl_certificate /usr/local/etc/openssl/certs/cert.pem;
ssl_certificate_key /usr/local/etc/openssl/certs/cert.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_dhparam /usr/local/etc/openssl/certs/dhparam.pem;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_prefer_server_ciphers on;

     # document root
root /Users/user/Documents/www;

location / {
try_files $uri $uri/index.html @backend;
}

# reverse proxy
location @backend {
proxy_pass http://backend;
}
}


SSL (TLS) の設定は Generate Mozilla Security Recommended Web Server Configuration Files を参照しました。

document root は適宜変更してください。

起動 : $ nginx

再起動: $ nginx -s reload

停止 : $ nginx -s stop


自動起動

$ ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents


最後に

ドキュメントルートに適当な index.html ファイルを置いてコマンドを叩く。

$ open https://example.com:4433/ 

以上。


Note

外部のサーバで HTTPS 運用する場合は、 SSL Server Test (Powered by Qualys SSL Labs) で脆弱性を診断し、 Japan Vulnerability Notes を定期的に確認して OpenSSL は常に更新しましょう。