こんにちは。株式会社リンクネット、ソリューション事業部の石原です。
2026年1月15日、Let's EncryptがIPアドレス向けの無料TLS証明書の一般提供開始したとのリリースが出ました。
いつもLet's Encryptの証明書発行・更新に利用しているCertbotも2026年2月4日にリリースされたバージョン5.3.0でIPアドレス証明書の発行に対応したので、早速使ってみました。
今回はAzure上に新規作成したUbuntu 24.04で確認してみます。NginxとCertbotはインストール済みで、ポート80と443は開放しています。
$ nginx -v
nginx version: nginx/1.24.0 (Ubuntu)
$ certbot --version
certbot 5.3.0普段はwebrootプラグインを利用して証明書の発行と自動更新を行なっていますが、現在IPアドレス証明書の発行に対応しているのはstandaloneとmanualプラグインのみです。standaloneプラグインの場合、更新時には利用するポート番号を指定することが出来ないようだったのでmanualプラグインとフックスクリプトの組み合わせで発行と自動更新が出来ることを目標とします。
フックスクリプトを設置するディレクトリと、auth hookが一時的にトークンを保存するためのディレクトリを作成しておきます。
$ sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
$ sudo mkdir -p /etc/letsencrypt/auth-hooks以下2つのフックスクリプトを設置します。
#!/bin/bash
echo $CERTBOT_VALIDATION > /var/www/letsencrypt/.well-known/acme-challenge/$CERTBOT_TOKEN#!/bin/bash
rm -f /var/www/letsencrypt/.well-known/acme-challenge/$CERTBOT_TOKENNginxを設定して、認証局がトークンにアクセスできるようにしておきます。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
server_tokens off;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
location / {
try_files $uri $uri/ =404;
}
}IPアドレスを指定して証明書をリクエストします。
$ sudo certbot certonly --manual \
--manual-auth-hook /etc/letsencrypt/auth-hooks/authenticator.sh \
--manual-cleanup-hook /etc/letsencrypt/auth-hooks/cleanup.sh \
--ip-address {IPアドレス} --preferred-profile shortlivedメールアドレスの入力(スキップ可)と利用規約への同意後、証明書が発行されました。
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/{IPアドレス}/fullchain.pem
Key is saved at: /etc/letsencrypt/live/{IPアドレス}/privkey.pem
This certificate expires on 2026-02-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.上記の秘密鍵と証明書を利用するようにNginxの設定を行います。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
server_tokens off;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /etc/letsencrypt/live/{IPアドレス}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{IPアドレス}/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'HIGH !aNULL !eNULL !SSLv2 !SSLv3 !TLSv1';
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ =404;
}
}Nginxの設定変更を反映してブラウザでアクセスすると問題なくIPアドレス指定でhttps接続ができました。