きたる2026/01/15、Let’s EncryptがIPアドレスに対する証明書発行をしたので試してみたというお話。
IPといっても、プライベートIPが対象ではなく、グローバルIPに対して発行できる。
とりあえず、なんの稼働もしていないVPSにグローバルIPがあったので動作テストをしてみることにした。
短期証明書、IPによる証明について
近年、セキュリティ上の懸念から期間の長い(1年とか2年とか)証明書の発行が難しくなってきています。
詳しい説明は探してもらえば出てくると思いますが、最終的に、2029年には最大49日の証明書になる予定です。
さすがに49日サイクルの証明書更新を手動でやるのは現実的ではないですよね。
参考:https://groups.google.com/a/groups.cabforum.org/g/servercert-wg/c/bvWh5RN6tYI?pli=1
ChatGPTに聞いてみた。
便利な時代になりましたね。
IPに対する証明書ってどんな優位性があるんだ?使い道がい真ひとつわからん
結論:**「IP直打ちでもブラウザ警告なしでTLSできる」**のが最大の優位性。
ドメインがあるなら、基本はドメイン証明書の方が便利で運用もラク。
IP証明書の“強いところ”(=優位性)
- DNS不要:ドメイン取得やDNS設定なしでTLS化できる(短期検証や暫定公開に強い)
- IPでアクセスされる前提の相手に刺さる:
- ベンダー製品/外部SaaS連携で「接続先をFQDNじゃなくIPで固定してほしい」みたいな世界
- お客さんのFW/プロキシの許可設定が「宛先IP固定」で回ってる世界
- 移行・障害時の“最後の避難口”:DNS切替が間に合わない/できないときでも、IPで一時公開して https の体裁を保てる
具体的な使い道(実務で遭遇しがち)
- 管理画面(ルータ/アプライアンス/踏み台/監視)をIPで開く運用
→ 「IPでブックマーク」が現実に多いので、警告が消える価値は地味にデカい
- 短期間の検証環境(PoC、期間限定公開、引っ越し中の仮置き)
→ ドメイン準備の手間を省いてスピード優先
- IPそのものが入口になるケース(例:Anycastで “サービス名よりIPが入口” みたいなやつ)
逆に、IP証明書が微妙なところ(ここで「使い道が薄い」と感じやすい)
- IPが変わったら即終了:IPに紐づくので、変更=再発行&設定変更
- 80/443 を外から到達可能にする必要が出がち(環境によってはこれが一番だるい)
- 公開情報として残りやすい:公開したくないIPだと不向き(インターネットに刻むタトゥーになりがち)
- 大抵のWeb運用は結局FQDNが要る:HSTS、CDN、複数サイト同居、リバプロ、運用…全部ドメイン前提の方が強い
判断基準(これだけ覚えればOK)
- 「人やシステムがIPでアクセスするのが前提」 → IP証明書が効く
- 「まともに運用する公開Web/複数サービス/将来拡張あり」 → ドメイン証明書が基本安定
実際に使ってみる。
環境のセットアップ
VPSを初期化した上で、必要なソフトウェアを導入する。
いつものおまじない
パッケージ一覧を更新しアップデートする。
1
2
|
sudo apt-get update
sudo apt-get upgrade -y
|
Apacheの導入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
sudo apt-get install apache2
# サービスの有効化
sudo systemctl enable apache2
# サービスの再起動と確認
admin@vmi2887430:~$ sudo systemctl restart apache2
admin@vmi2887430:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-01-27 03:48:54 CET; 8s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 9084 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 9087 (apache2)
Tasks: 55 (limit: 9483)
Memory: 5.3M (peak: 6.1M)
CPU: 51ms
CGroup: /system.slice/apache2.service
├─9087 /usr/sbin/apache2 -k start
├─9088 /usr/sbin/apache2 -k start
└─9089 /usr/sbin/apache2 -k start
|
acme.shの導入
通常、Let’s Encryptの証明書発行にはCertbotが使われることが多いが、現在のリリースでは、まだ対応しておらず、issueで取り上げられているバージョンを使用しないといけなかったため、今回はacme.shを利用してみることにした。
基本的にこのスクリプトはrootユーザーで実行することが前提っぽいです。sudoで実施するのは想定されていないっぽい?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# rootユーザーへのスイッチ
sudo su -
# メールアドレスは適宜読み替えてくださいね
curl https://get.acme.sh | sh -s email=name@example.com
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 1032 0 1032 0 0 13199 0 --:--:-- --:--:-- --:--:-- 13230100 1032 0 1032 0 0 13152 0 --:--:-- --:--:-- --:--:-- 13063
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 229k 100 229k 0 0 646k 0 --:--:-- --:--:-- --:--:-- 647k
[Tue Jan 27 03:57:26 CET 2026] Installing from online archive.
[Tue Jan 27 03:57:26 CET 2026] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Tue Jan 27 03:57:27 CET 2026] Extracting master.tar.gz
[Tue Jan 27 03:57:27 CET 2026] Installing to /home/admin/.acme.sh
[Tue Jan 27 03:57:27 CET 2026] Installed to /home/admin/.acme.sh/acme.sh
[Tue Jan 27 03:57:27 CET 2026] Installing alias to '/home/admin/.bashrc'
[Tue Jan 27 03:57:27 CET 2026] Close and reopen your terminal to start using acme.sh
[Tue Jan 27 03:57:27 CET 2026] Installing cron job
34 7 * * * "/home/admin/.acme.sh"/acme.sh --cron --home "/home/admin/.acme.sh" > /dev/null
[Tue Jan 27 03:57:27 CET 2026] bash has been found. Changing the shebang to use bash as preferred.
[Tue Jan 27 03:57:30 CET 2026] OK
[Tue Jan 27 03:57:30 CET 2026] Install success!
# シェル再起動のため一度rootユーザーから抜ける
exit
# 再度superuserへ
sudo su -
# acme.shの動作確認
acme.sh
https://github.com/acmesh-official/acme.sh
v3.1.3
Usage: acme.sh <command> ... [parameters ...]
Commands:
-h, --help Show this help message.
-v, --version Show version info.
(略)
|
acme.shでの証明書発行
今回、初めて、acme.shを使ったので間違っていたら申しわけないです。
1
2
3
4
5
6
7
8
9
10
11
|
# rootユーザーでの実施。
acme.sh --issue \
-d 203.0.113.10 \
--server letsencrypt \
--apache \
--cert-file /etc/apache2/ssl/cert.pem \
--key-file /etc/apache2/ssl/key.pem \
--fullchain-file /etc/apache2/ssl/fullchain.pem \
--certificate-profile shortlived \
--days 3 \
--reloadcmd "service apache2 force-reload"
|
パラメータの簡単に解説。
--issue Issue a cert.(証明書を発行)
-d 本来はdomainのことでしょうが、今回はIPでの発行のためIPを入れます。
--apache apacheを使った認証を行います。standaloneだと80番のポートがぶつかる関係から今回はapacheを使った認証を利用しました。
--cert-file,--key-file,--fullchain-file 証明書の出力先です。
--certificate-profile shortlived モードを短期証明に切り替えます。
--days 更新のしきい値(何日前になったら更新する)。6日より小さければいいはず。
--reloadcmd 証明書の自動更新のときにapacheを再起動する設定です。
- 便利なことに、このシェルに書き込むとcronにまで書いてくれて自動更新できるみたいですね。
Apache側の証明書設定
1
2
|
# とりあえず動作確認だけなのでdefault-ssl.confを編集
nano /etc/apache2/sites-available/default-ssl.conf
|
下記箇所を修正します。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
-----変更箇所↓-----
SSLCertificateFile /etc/apache2/ssl/fullchain.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
|
注意点として、apacheの新しいバージョンでは中間証明書とサーバー証明書を結合したものを指定しないといけないみたいですね。
私はここで証明書ファイルをサーバー証明書をしたことで、中間証明書が欠けてしまい、Chromeでは問題なく表示できるが、Firefoxでは動作しないという謎な動作が発生していました。
必ず、fullchainの方の証明書を指定するようにしましょ。
apacheの設定と再起動
まぁこちらもお約束
1
2
3
4
5
6
|
# apacheにおいて、SSLの機能を有効化
sudo a2enmod ssl
# apacheのdefault-sslというサイトを有効化
sudo a2ensite default-ssl
# apacheの再起動
sudo systemctl restart apache2
|
動作確認。
該当のIPへアクセスすると、無事セキュリティのアラートが出ずにApacheデフォルト画面を見ることが出来た。

ウェブサイトの欄が無事にIPで登録されていることがわかる。
認証局もちゃんとLet’s Encryptとなっていることを確認できる。

証明書の有効期限も非常に短く、短期証明書の発行が無事できていそうですね。

おまけ
時はさかのぼること、2025年7月1日
Let’s Encryptより面白そうなプレスリリースが発表された。
それはIPアドレスに対する証明書の発行、ということでした。通常のLet’s Encryptによる証明書はドメインに対して有効であったのに対し、今回の証明書は短期間(6日程度)ではあるものの、IPアドレスに対して発行できるみたいです。
しかしながらこれ、どういったタイミングで使うんでしょうね、、、
Since Let’s Encrypt started issuing certificates in 2015, people have repeatedly requested the ability to get certificates for IP addresses, an option that only a few certificate authorities have offered. Until now, they’ve had to look elsewhere, because we haven’t provided that feature.
Today, we’ve issued our first certificate for an IP address, as we announced we would in January. As with other new certificate features on our engineering roadmap, we’ll now start gradually rolling out this option to more and more of our subscribers.