明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

IP制限をかけた VirtualHost に Let's Encrypt の SSL証明書を設定する

Let's Encrypt の SSL証明書を使用するには、サーバ側の DocumentRoot に Let's Encrypt のサーバからのリクエストを許可する必要があります。
Let's Encrypt が証明書を発行する処理の中で、DocumentRoot 直下に.well-knownというディレクトリが作られ、リモートでアクセスすることで対象ドメインが実行サーバに向いていることを確認するのです。

このときIP制限その他のアクセス制限をかけている場合、Let's Encrypt のサーバのアクセスも遮断してしまうため、証明書の発行(自動更新も)が失敗してしまいます。
今回は、この回避方法について記述します。
といっても、難しいことはありません。

<Directory>ディレクティブで .well-known のみを開放すればよい

ApacheのVirtualHost設定でIP制限をかける場合を想定します。

vi /etc/httpd/conf.d/virtualhost.conf

# 以下のような感じで

# Apache 2.4未満
<VirtualHost *:80>
    ServerName example.jp
    DocumentRoot /home/example/htdocs

    <Directory "/home/example/htdocs">
        order deny,Allow
        deny from all
        allow from xxx.xxx.xxx.xxx
    </Directory>

    <Directory "/home/example/htdocs/.well-known/acme-challenge">
        order allow,deny
        allow from all
    </Directory>
</VirtualHost>

# Apache 2.4以降
<VirtualHost *:80>
    ServerName example.jp
    DocumentRoot /home/example/htdocs

    <Directory "/home/example/htdocs">
        Require ip xxx.xxx.xxx.xxx
    </Directory>

    <Directory "/home/example/htdocs/.well-known/acme-challenge">
        Require all granted
    </Directory>
</VirtualHost>

あとはApacheの再起動(graceful)をすればOKです。