外部に一切公開していない(インバウンド通信を遮断している)内部サーバーであっても、Let’s EncryptのSSL証明書を取得・運用することは可能です!
通常、sudo certbot --nginx のような方法(HTTPチャレンジ)では、Let’s Encryptのサーバーが外部からあなたのサーバー(80番ポート)にアクセスして所有権を確認するため、内部サーバーではエラーになってしまいます。
しかし、外部からサーバーにアクセスさせずに所有権を証明する「DNSチャレンジ(DNS-01チャレンジ)」という仕組みを利用すれば、内部サーバーでも問題なく証明書を発行できます。
なぜ可能なのか?(DNSチャレンジの仕組み)
DNSチャレンジは、サーバーではなく「ドメインのDNSサーバー」を利用して本人確認を行うシステムです。
- 内部サーバーのCertbotが、Let’s Encryptに対して「証明書をください」とリクエストします。
- Let’s Encryptが「じゃあ、本人確認のために、お前のドメインのDNSにこのランダムな文字列(TXTレコード)を登録して」と要求を返します。
- 内部サーバー(またはあなた自身)が、ドメインのDNS設定に指定されたTXTレコードを追加します。
- Let’s Encryptは、世界中にある公開DNSサーバーを通じてそのTXTレコードを確認し、一致すれば「間違いなくドメインの所有者だ」と認めて証明書を発行します。
この間、Let’s Encryptからあなたの内部サーバーに対して直接アクセスすることは1回もありません。
内部サーバーで取得するための「3つの条件」
この方法を利用するには、以下の条件をクリアしている必要があります。
- インターネット上の「本物の独自ドメイン」であること社内だけで使っている
.localや.internalなどの架空のドメインでは取得できません。必ずお名前.comやAWS(Route 53)などで取得した、世界共通の独自ドメイン(example.comなど)である必要があります。※内部サーバーのIPアドレス(例:192.168.x.x)に対してドメインを紐付ける設定(DNSのAレコード登録)は、社内のローカルDNSサーバー等で行っていれば問題ありません。 - DNSのTXTレコードを編集できることドメインを管理しているDNS管理画面(Cloudflare、AWS Route 53、お名前.comなど)のレコードを操作できる権限が必要です。
- サーバーから「外」への通信(アウトバウンド)ができること外部からサーバーへ入ってくる通信(インバウンド)は不要ですが、サーバーからLet’s EncryptのAPI(443番ポート)へリクエストを送り、証明書をダウンロードするための外向きのインターネット通信は必要です。
具体的な取得コマンドのイメージ
手動でDNSレコードを書き換えて取得する場合、以下のようなコマンドを実行します(Nginxとは連動させず、証明書ファイルだけを単体で取得するモードです)。
sudo certbot certonly --manual --preferred-challenges dns -d yourlocalapp.example.com
画面の指示に従うと、「このTXTレコードを追加してください」と表示されるので、ドメインのDNS管理画面でレコードを追加し、反映されたらEnterを押すことで /etc/letsencrypt/live/ に証明書が発行されます。
あとは、発行された証明書のパスを内部のNginx(またはGunicorn)の設定ファイルに指定すれば、社内環境でも「鍵マーク」のついたHTTPS通信が利用できるようになります。
💡 運用上の注意点:自動更新の壁
Let’s Encryptの有効期限は90日なので、自動更新(certbot renew)が必須になります。しかし上記の --manual(手動)で取得した場合、3ヶ月ごとに手動でDNSを書き換えなければならず、自動更新が機能しません。
これを完全自動化するためには、お使いのDNSサービス(CloudflareやAWS Route 53など)に対応した「Certbot用DNSプラグイン」を導入するのが実務での鉄板構成です。
例えば、DNSをCloudflareで管理している場合:
# プラグインをインストールし、APIキーを設定した上でコマンドを実行
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/cloudflare.ini -d yourlocalapp.example.com
このようにプラグインを挟むと、CertbotがAPI経由でDNSのTXTレコードを「一瞬だけ自動で書き換えて、認証が終わったら自動で消す」という処理を行ってくれるため、外部非公開の社内サーバーであっても、完全自動で永久に無料のSSL化を維持できるようになります。

コメント