localhost を使った開発で TLS を有効にする方法

ローカル開発環境で HTTPSを使うため、自己署名 CA を作って localhost 用の証明書を発行する手順

localhost を使った開発で TLS を有効にする方法

HTTPS、いわゆるSSLが実質必須になって長いこと経つが、開発用のローカルサーバについてはHTTP(Sのつかない方)を使うのが普通だ。盗聴されたり通信先を偽装されたりする心配がないので安全上はそれで問題ないのだが、アプリケーションにとって自分に飛んでくるリクエストがHTTPSなのかHTTPなのかを全く気にする必要がないかというと微妙にそうでない時もあり、HTTPSを用いて本番と近い環境をローカルで検証しなければならない時もたまにある。

かといって Let's Encryptはlocalhostに証明書を発行してくれないので、

ということを行う必要がある。

普通は2番目のステップで作成した自分用のCAをユーザー個別にブラウザレベルで信頼すればいいのだが、そのプロジェクト専用の開発VMを立てて複数ユーザーを切って開発しているといったような環境ではいちいち個別に登録するのは面倒なので、ここではOSレベルで信頼済みCAを登録してしまう手順をまとめる。

ローカル CA 証明書の生成

Linuxディストリビューションによって異なるが、以降は下記を前提にする。作業にはroot権限が必要。

10年有効なCA 証明書を作成

mkdir -p /usr/local/share/ca-certificates
openssl req -x509 -newkey rsa:4096 \
  -keyout /etc/ssl/private/ca.key \
  -out /usr/local/share/ca-certificates/ca.crt \
  -days 3650 -nodes \
  -subj "/C=JP/ST=Tokyo/O=MyOrg/CN=MyLocalCA"

システムトラストストアへの追加

信頼する証明書を下記コマンドで、作成した CA 証明書を「信頼済み」としてシステムに認識させる

update-ca-certificates

または(ディストリビューションによる)

update-ca-trust

これで自分のCA が信頼済みとして追加され、curl、wget、Python requests など OpenSSL を使うツールはこの CA が発行した証明書を信頼するようになる。

OpenSSLではなくNSSを使用しているソフトウェア(Chrome) への反映

Linuxディストリビューションによってはp11-kit経由でOpenSSL用のトラストストアをNSSにも共有するよう設定されているのだが、そうでない場合は手動でその措置をする必要がある。

p11-kit-trust.so は NSS の libnssckbi.so と同じ PKCS#11 インターフェースを実装しており、システムトラストストアを読んで返す。NSSのlibnssckbi.so をこれへのシンボリックリンクに置き換えることで、update-ca-certificates の結果を Chrome にも反映できる。(※自己責任)

ln -sf /usr/lib64/pkcs11/p11-kit-trust.so /usr/lib64/libnssckbi.so

サーバー証明書の発行

自分用のローカルCAをシステムに信頼させたら、そのCAで localhost 用のサーバー証明書を発行する。ついでに好きな名前でバーチャルホスト分けもできるようにワイルドカードで *.dev.localhostも使えるようにしておく[1]

最近のブラウザは SAN (Subject Alternative Name) のない証明書を拒否するため、-addext で明示的に指定する。

openssl genrsa -out /etc/ssl/private/dev.localhost.key 2048

openssl req -new \
  -key /etc/ssl/private/dev.localhost.key \
  -subj '/CN=*.dev.localhost' \
  -addext 'subjectAltName=DNS:*.dev.localhost,DNS:dev.localhost,DNS:localhost' \
| openssl x509 -req \
  -CA /usr/local/share/ca-certificates/ca.crt \
  -CAkey /etc/ssl/private/ca.key \
  -CAcreateserial \
  -out /etc/ssl/certs/dev.localhost.crt \
  -days 3650 -copy_extensions copy

こうして作成した証明書を開発用のWebサーバにセットすることで、ブラウザから警告を受けることなくHTTPSでlocalhostないし*.dev.localhostの閲覧ができるようになる。

関連記事


  1. localhost は Public Suffix List (PSL) の扱いにより、単一ラベルドメインとして TLD 相当に扱われるので、その直下のワイルドカードは不適当としてブラウザに拒否される。仕方ないので .devを挟んでいる ↩︎

当社代表のデスクトップ(※)を常時ライブ配信中

※ライブ配信専用PC

OSSの検証や自社用ツールの開発といった公開できる作業に限り、 ライブ配信専用PC上で行っています。常時配信ですのでいつでもお気軽にチャットメッセージ(公開)を残していって下さい。