無料の Let's Encrypt 証明書
certbot を使って VPS で HTTPS 証明書を発行し自動更新する方法を、ポート 80 がすでに使用中の場合も含めて説明します。
更新日 2026年8月23日
ブラウザに「保護されていない通信」と表示されず、フォームや決済が正しく機能するには証明書が必要です。Let's Encrypt は 90 日間有効な証明書を無料で発行し、自動更新も行います。
準備
次の 3 点を確認してください。確認できていないと発行に失敗します。
dig +short example.ru # should return your machine's address
ss -tulpn | grep -E ':80|:443'
- ドメインの A レコードが、コントロールパネルの
/hosting/vds/m/<id>にある「概要」タブに表示されたアドレスを指していること。 - ポート 80 が外部から到達可能であること。Let's Encrypt はドメインの所有権確認にこのポートを使用します。
- Web サーバーが起動していること。Nginx または Apache のいずれかです。
Caddy を使用している場合は、何もする必要はありません。Caddy が証明書を自動で発行します。
発行
apt install -y certbot python3-certbot-nginx # Debian, Ubuntu
dnf install -y certbot python3-certbot-nginx # AlmaLinux, CentOS Stream
certbot --nginx -d example.ru -d www.example.ru
Apache の場合も同じ手順で、python3-certbot-apache と --apache フラグを使用します。Certbot は証明書の設定ブロックと HTTP から HTTPS へのリダイレクトを設定ファイルに自動で追加します。
結果を確認します。
certbot certificates
curl -I https://example.ru
自動更新
パッケージをインストールするとシステムタイマーも設定され、更新も処理されます。タイマーが有効であることを確認し、テスト更新を実行してください。
systemctl list-timers | grep certbot
certbot renew --dry-run
ドライランは必須です。これにより、2 か月後に更新が失敗する状況を事前に検出できます。たとえば、サイトの設定ファイル名を変更して certbot が確認ファイルの配置場所を認識できなくなった場合などです。
ポート 80 が使用中の場合
ポート 80 でアプリケーションが動作していて、そこに Web サーバーを配置できない場合は、専用のモードを使用します。
certbot certonly --standalone --preferred-challenges http -d example.ru
Certbot は確認の間だけ独自の一時サーバーを起動します。そのためにはアプリケーションを停止する必要がありますが、--pre-hook と --post-hook で自動化できます。
発行後、証明書は /etc/letsencrypt/live/example.ru/ に配置されます。ファイルは fullchain.pem と privkey.pem です。
よくあるエラー
| 症状 | 原因 |
|---|---|
Timeout during connect | ポート 80 がファイアウォールでブロックされているか、ドメインが別のマシンを指しています |
too many certificates already issued | ドメインの週次制限に達しています。待つか、--staging でデバッグしてください |
| 発行後もサイトが古い証明書を返す | Web サーバーを再読み込みしていません。systemctl reload nginx を実行してください |
| 証明書の有効期限が切れている | タイマーが無効になっています。systemctl enable --now certbot.timer を確認してください |
/etc/letsencryptディレクトリはあなたのデータの一部です。マシンの自動バックアップは存在しないため、Web サーバーの設定ファイルとあわせてバックアップに含めてください。