🔒

IPアドレス証明書を発行してデモアプリを社内公開したい

に公開

研究開発において、社内向けにデモアプリを公開したいことがあります。この時、http:// ではなく https:// で公開したいのはやまやまですが、OpenSSL などで作成した自己署名証明書を安易に適用しても、ブラウザでのアクセス時に以下のような警告が表示されます。

これではデモアプリを気軽に使ってもらうことができません。

IPアドレス証明書

ところで先日 6-day and IP Address Certificates are Generally Available という件名の記事が Let's Encrypt からリリースされていました。一部抜粋して日本語に翻訳すると以下の通りです。

Let’s Encryptでは、短寿命証明書およびIPアドレス証明書の一般提供を開始しました。これらの証明書は160時間(6日強)の有効期間を持ちます。短寿命証明書を取得するには、ACMEクライアントで「shortlived」証明書プロファイルを選択するだけです。
...
IPアドレス証明書は、サーバー運営者がドメイン名ではなくIPアドレスへのTLS接続を認証することを可能にします。Let's EncryptはIPv4とIPv6の両方をサポートしています。IPアドレス証明書は短寿命証明書である必要があります。これは、IPアドレスがドメイン名よりも流動的であるため、より頻繁な検証が重要であるという判断に基づくものです。IPアドレス証明書とその活用事例については、当社初のIP証明書発表記事で詳しくご紹介しています。

6 日程度の短期のデモアプリの公開であれば、たとえば IP アドレスに対する証明書を発行することで、前述のような警告画面の問題を回避できる可能性があります。おそらく本記事は N 番煎じですが、試しておきたいと思います。

実験環境

  • EC2 (t3.medium)

を使いました。これにした理由としては、t3.micro でやると uv がパッケージをインストールする段階(依存関係の解決中)でハングしたためです。スワップ領域を設定すれば回避できたかもしれませんが、今回は簡単のため、インスタンスのスペックを上げる方法で対応しました。

また、証明書の発行において、今回は EC2 の 80 番ポートを使う選択を採りましたので、セキュリティグループでポート 80 番を開けておく必要がありました。証明書発行後はデモアプリ自体は 443 番ポートでのみ動作するため、不要な公開範囲を減らす目的で、セキュリティグループから 80 番ポートの許可設定を外しておくことを推奨します。

実験用の仮想環境を準備する

実はそれほど大袈裟なことをする必要がなく、Certbot の Developer Guide を参考に証明書を発行すれば良いようです。まず、

sudo dnf install python3.12 python3.12-devel augeas-devel gcc git

で必要なツール類を導入します。次に Certbot をクローンします。

git clone https://github.com/certbot/certbot

そして以下で作業用の仮想環境を作ります。この中で uv が動くので EC2 のスペックが低すぎる場合には何かしらの対策が必要そうでした。

cd certbot
python3.12 tools/venv.py

IPアドレス証明書を発行する

今回 sudo を使いたいというのがありまして、直接仮想環境内のバイナリを叩きたいと思います。

sudo ./venv/bin/certbot certonly \
  --ip-address $(curl -s https://checkip.amazonaws.com) \
  --preferred-profile shortlived

ここで checkip.amazonaws.com が気になるところですが、AWS CLI の Amazon EC2 セキュリティグループの作成、設定、および削除 を引用しますと以下の通りです。

注記
当社では、以下のサービス https://checkip.global.api.aws/ を提供し、お客様のパブリック IP アドレスを特定できます。
...
まず、あなたの IP アドレスを探してください。

$ curl https://checkip.amazonaws.com
x.x.x.x

上記のコマンドを実行すると以下のようなメッセージが出ます。今回は「Runs an HTTP server locally which serves the necessary validation files〜」に対応するものを選んで、EC2 内で証明書発行用のサーバを 80 番ポートで起動して署名します。これは状況により 14 番のことも 15 番のこともあるようなので、メッセージに注意してください。

14: Nginx Web Server plugin (nginx)
15: Runs an HTTP server locally which serves the necessary validation files
under the /.well-known/acme-challenge/ request path. Suitable if there is no
HTTP server already running. HTTP challenge only (wildcards not supported).
(standalone)
16: Saves the necessary validation files to a .well-known/acme-challenge/
directory within the nominated webroot path. A separate HTTP server must be
running and serving files from the webroot path. HTTP challenge only (wildcards
not supported). (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-15] then [enter] (press 'c' to cancel): 15
Enter email address or hit Enter to skip.
 (Enter 'c' to cancel): 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at:
https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf
You must agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: 

これを進めると、以下のようなログが出て、証明書が作成されたことがわかります。

Account registered.
Requesting a certificate for xxx.xxx.xxx.xxx

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xxx.xxx.xxx.xxx/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/xxx.xxx.xxx.xxx/privkey.pem
This certificate expires on 2026-XX-XX.
These files will be updated when the certificate renews.

Nginx で試す

さて、nginx をインストールして試してみましょう。

sudo dnf install nginx

そして設定を変更します。以下、SSL 用の設定部分だけ抜粋していますが、ssl_certificate と ssl_certificate_key に、先ほど Certbot で発行した証明書を指定しています。設定はあくまで例なので細かいところの調整は各自でお願いします。

/etc/nginx/nginx.conf
...
#Settings for a TLS enabled server.

    server {
        listen       443 ssl;
        listen       [::]:443 ssl;
        http2        on;
        server_name  _;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/letsencrypt/live/xxx.xxx.xxx.xxx/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/xxx.xxx.xxx.xxx/privkey.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
...

設定のチェックは以下でできます。

sudo nginx -t

問題がないことが分かったところで nginx を起動します。

sudo systemctl start nginx
sudo systemctl enable nginx

ブラウザでアクセスする

ブラウザで https://〜 でアクセスしてみましょう。

警告画面が出ることなくアクセスできました。

まとめ

短期間の証明書ですが、デモアプリを短期公開する上では利用できそうであることがわかりました。

モリサワ Tech Blog

Discussion