Title Image

Tailscale内に立てたWEBサービスにSSL証明書を適用する

投稿日

Tailscale 内で立てた WEB サービスを https 化する方法を備忘録的に書きます (HTTPS Certificates は使いません)。

背景

現在、Proxmoxで様々なWEBサービスを立てていますが、外部に公開するものとしないものがあります。

外部に公開するものとしては、ファイル共有サービスや WEB アプリケーションがあります。これらは Cloudflare Tunnels で簡単に外部公開することができます。

一方で、外部に公開しないものとしては Nextcloud や拡張子変換サービスなどがあります。これらは Tailscale のネットワークに属させることで、外部からは見えない形で簡単にアクセス可能となります。

Tailscale のネットワーク内でアクセスするとき、IP アドレスや Magic DNS を使う方法がありますが、自分は Tailscale 内に DNS サーバーを立てています。

自分が保有するドメインを割り当てて Split DNS を使うことでドメインを使って Tailscale 内の各サービスにアクセスできます。

このとき、1つだけ問題が発生します。

証明書がないのでブラウザで警告が出たり、最悪の場合アクセスできなかったりします。

今回はこれを解決する方法を説明します。

外部公開なしに証明書を取得できる理由

通常の SSL 証明書発行 (HTTP-01) は、認証局がそのサーバーにアクセスできる必要があります。

しかし、今回使う DNS-01 チャレンジは、「ドメインの DNS レコードを書き換えられるか」で所有権を確認します。そのため、サーバーが見えない状態でも、正規の証明書が発行可能です。

前提

この記事では以下を前提に説明しています。

手順

WEBサービスを立てる

今回はPDFファイル操作ができる Stirling-PDF を使います。

ホスト内で以下のような docker-compose.yml を作成します。

stirling-pdf が今回立てたいWEBサービスです。この部分は基本的にWEBサービスのドキュメント通りでよいです。

特殊な設定として、今回は nginx のプロキシとなるコンテナからアクセスできるようにしたいので expose で外部コンテナからのアクセスを許可しています。コンテナ内のどのポートでサービスが動いているか確かめてここに書き込みます。

加えて、jc21/nginx-proxy-manager:latest を入れています。これを使うことで、簡単に nginx のプロキシを設定できます。この部分はコピペで問題ありません。

docker-compose.yml
services:
  stirling-pdf:
    image: stirlingtools/stirling-pdf:latest-fat
    container_name: stirling-pdf
    restart: always
    expose: 
      - "8080"
    volumes:
      - ./stirling-data:/configs

  nginx-proxy:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: always
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

以下コマンドでコンテナ群を作成します。

docker compose up -d

DNS を編集するための API を取得する

Cloudflareのコンソールを開いて、左側メニューの 「アカウントの管理」>「アカウント API トークン」を開きます。

「トークンを作成する」をクリックし、下部「API トークン テンプレート」に「ゾーン DNS を編集する」があるので「テンプレートを使用する」をクリック。

以下の画像のような画面になるので、「ゾーンリソース」の一番右側で今回使用したいドメインを選択します。

APIトークンを作成する画像

ドメインを選択したら「概要に進む」>「トークンを作成する」でAPIトークンの作成を完了させます。

画面にトークンが表示されるのでコピーしておいてください (一度画面を閉じると見れなくなります)。

Nginx のプロキシを設定する

IP アドレスを使ってホストのポート 81 にアクセスすると以下のような画面になります。

後ほどのDNS編集の際に使っている可能性があるので、メールアドレスは正しいものを入れておいた方がいいかもしれません。

Nginxのセットアップ画面

設定が終わるとダッシュボードが開き、「0 Proxy Hosts」と表示されている部分をクリックします。

「Proxy Hosts」の画面になるので、「Add Proxy Host」をクリックして、まずは「Details」に以下のように情報を入力します。

Detailsの画面

次に、上部「SSL」を開き、以下のように設定します。

SSLの画面

すべての入力が終わったら、「Save」を押します。

しばらくするとモーダルが閉じます。STATUSOnline になっていれば設定完了です。

確認する

設定したドメインにアクセスしてみます。

SSLの画面

問題なくアクセスできています。証明書に関する警告も表示されていません。

おわりに

何度か証明書の設定は行ってきましたが、毎回調べたりして詰まっていたので記事を書きました。

かなり楽に設定できる手順を開拓できた気がします。