(2025 年)初投稿です。1 3 年ほど前に WSL2 上のアプリケーションに別ホストからアクセスする方法(管理者権限なし) という記事を投稿しました。その間 Chrome 94 以降で HTTPS ファーストが推進されたり、Safari 18.2 以降も同様だったりで、開発時に別ホストからアクセスする際もセキュア化を求められる機運はありそうです。
実は、上記の記事でご紹介した stone には HTTPS 化機能が備わっています。便利そうですよね。
stone localhost:http 443/ssl
ところが、Windows 版バイナリで実行しても以下のエラーが発生し HTTPS 化できません。
Jan 16 22:34:26.171000 46656 start (2.3e) [47036]
Jan 16 22:34:26.187000 46656 SSL_CTX_use_PrivateKey_file(/usr/local/ssl/certs/stone.pem) error:02001003:system library:fopen:No such process
フォーク版(takuya_ono/stone)で TLS 1.2 に対応した Windows 版 stone のコンパイル方法が共有されていますが、バイナリ配布がないためお手軽ではありません。そんな時は mkcert と local-ssl-proxy を stone に組み合わせると便利です。
なお、この 3 年の間に WSL2 のミラーモードネットワークが実装されました。これを有効にしている場合、stone を介さず別ホストから直接アクセス可能になっています。しかし、ファイアウォールの構成によっては引き続き Windows 側のプロセスを踏み台にすると便利なケースがあります。2
mkcert で証明書を作成・インストールする
mkcert は、ローカルで信頼された証明書を作成するツールです。51.7k Star の超有名 OSS で、例えば Next.js の next dev --experimental-https
でも内部的に利用されています。
# インストール
choco install mkcert
# ローカル CA のインストール
mkcert -install
# ルート証明書のあるディレクトリを表示
mkcert -CAROOT
# 証明書の作成
mkcert -key-file key.pem -cert-file cert.pem <Windows側のIPもしくはホスト名>
本来はローカル検証用の証明書ではありますが、$(mkcert -CAROOT)\rootCA.pem
をインストールすることで他端末からもエラーなく HTTPS 接続可能となります。3
local-ssl-proxy と stone で別ホストからアクセス可能にする
local-ssl-proxy はローカルで信頼された開発証明書を使用したシンプルな HTTPS プロキシです。mkcert で作成した証明書を使用し、HTTP 通信を HTTPS にアップグレードできます。
# インストール
npm install -g local-ssl-proxy
# 実行
local-ssl-proxy --key key.pem --cert cert.pem --source <HTTPS 用のポート> --target <WSL2 側のポート>
このとき、--source
が HTTPS 用のポート、--target
が WSL2 側のポート(HTTP)なのがポイントです。
最後に、local-ssl-proxy がリッスンする HTTPS 用のポートを stone でポートフォワードすれば別ホストからアクセス可能となります。
# stone でポートフォワード
stone <HTTPS 用のポート> <ファイアウォールで解放されたポート>
参考リンク
- Google Developers Japan: HTTPS のデフォルト化に向けて
- すべての「Chrome」をHTTPSファーストに、Googleが本腰を入れる - 窓の杜
- WebKit Features in Safari 18.2 | WebKit
- LOCAL環境でHTTPSが必要なときはlocal-ssl-proxyが便利
- 開発環境をhttps化するmkcertの仕組み
- Next.js の dev サーバーが HTTPS で立ち上がる仕組み
- mkcert(オレオレ証明書)を使ってローカル環境へiPhoneからhttps接続する