CentOS 8
Sponsored Link

Apache httpd : mod_md の設定
2020/07/14
 
[mod_md] をインストールして、Let's Encrypt から取得する SSL/TLS 証明書の 取得/更新 を自動化します。
設定をしたい対象のバーチャルホストごとに設定可能です。
なお、[mod_md] を設定するバーチャルホストは、こちらの SSL/TLS の手動設定は不要です。
また、Let's Encrypt から手動で取得する際と同様、設定をしたい対象のサイトは、インターネット側からアクセス可能である必要があります。
[1] [mod_md] をインストールします。
[root@www ~]#
dnf -y install mod_md
# インストール後 [mod_http2] モジュールは有効化される

[root@www ~]#
cat /etc/httpd/conf.modules.d/01-md.conf

LoadModule md_module modules/mod_md.so
[2] [mod_md] の設定です。
[root@www ~]#
vi /etc/httpd/conf.d/acme.conf
# 新規作成

MDBaseServer              on
MDCertificateProtocol     ACME
MDCAChallenges            http-01
MDDriveMode               auto
MDPrivateKeys             RSA 2048
MDRenewWindow             33%
MDStoreDir                md
MDCertificateAuthority    https://acme-v02.api.letsencrypt.org/directory
MDCertificateAgreement    https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf

<Location "/md-status">
    SetHandler md-status
    Require ip 127.0.0.1 10.0.0.0/24
</Location>

# [MDRenewWindow]
# 証明書を更新するタイミングを指定する
# 指定しない場合のデフォルトは [33%]
# Let's Encrypt の有効期限 = 90日
# 90日 * 33% ≒ 30日 ⇒ 残り30日で更新される
# 日数で指定する場合の記号は [d]
# 30日 ⇒ [30d]

# [MDStoreDir]
# 証明書等の各種データの保存ディレクトリ
# 指定しない場合のデフォルトは [md]
# [ServerRoot] からの相対パス

# [md-status]
# MD の状態をモニタリングする
[3] SELinux を有効にしている場合は、ポリシーの変更が必要です。
[root@www ~]#
setsebool -P httpd_can_network_connect on
[root@www ~]#
vi httpd-md.te
# 以下の内容で新規作成

module httpd-md 1.0;

require {
        type httpd_config_t;
        type httpd_t;
        class dir { add_name create remove_name rename reparent rmdir setattr };
        class file { create rename setattr unlink write };
}

#============= httpd_t ==============
allow httpd_t httpd_config_t:dir { add_name create remove_name rename reparent rmdir setattr };
allow httpd_t httpd_config_t:file { create rename setattr unlink write };

[root@www ~]#
checkmodule -m -M -o httpd-md.mod httpd-md.te

[root@www ~]#
semodule_package --outfile httpd-md.pp --module httpd-md.mod

[root@www ~]#
semodule -i httpd-md.pp

[4] 対象のバーチャルホストごとに設定します。
各 [ServerAdmin] には Let's Encrypt からの各種通知を受け取ることが可能な、有効なメールアドレスを指定する必要があります。
# 例として [www.srv.world] サイトに設定

[root@www ~]#
vi /etc/httpd/conf.d/www.srv.world.conf
MDomain www.srv.world
MDCertificateAgreement accepted
DirectoryIndex index.html
ServerAdmin root@www.srv.world

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.srv.world
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    DocumentRoot /var/www/html
    ServerName www.srv.world
</VirtualHost>

# 例として [dlp.srv.world] サイトに設定

[root@www ~]#
vi /etc/httpd/conf.d/dlp.srv.world.conf
MDomain dlp.srv.world
MDCertificateAgreement accepted
DirectoryIndex index.html
ServerAdmin root@dlp.srv.world

<VirtualHost *:80>
    DocumentRoot /var/www/dlp.srv.world
    ServerName dlp.srv.world
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    DocumentRoot /var/www/dlp.srv.world
    ServerName dlp.srv.world
</VirtualHost>

[root@www ~]#
systemctl restart httpd
# 初回起動時は各設定のチェックが実行され

# [MDStoreDir] に設定したディレクトリ内に起動のためのダミー証明書が作成される

[root@www ~]#
ll /etc/httpd/md/domains/dlp.srv.world

total 12
-rw-------. 1 root root 1115 Jul 13 19:33 fallback-cert.pem
-rw-------. 1 root root 1704 Jul 13 19:33 fallback-privkey.pem
-rw-------. 1 root root  471 Jul 13 19:33 md.json

# 再度、再起動する

[root@www ~]#
systemctl restart httpd
# 問題なければ正規の証明書が取得される

[root@www ~]#
ll /etc/httpd/md/domains/dlp.srv.world

total 16
-rw-------. 1 root root 3899 Jul 13 19:34 job.json
-rw-------. 1 root root  516 Jul 13 19:34 md.json
-rw-------. 1 root root 1704 Jul 13 19:34 privkey.pem
-rw-------. 1 root root 3554 Jul 13 19:34 pubcert.pem
[5] 有効期限等々、証明書の確認は [openssl] コマンドで実施可能です。
または、[2] で設定した [md-status] にアクセスすることでも確認できます。
[root@www ~]#
openssl s_client -connect www.srv.world:443 | openssl x509 -noout -startdate -enddate

depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.srv.world
verify return:1
notBefore=Jul 14 06:34:02 2020 GMT
notAfter=Oct 12 06:34:02 2020 GMT

[root@www ~]#
openssl s_client -connect dlp.srv.world:443 | openssl x509 -noout -startdate -enddate

depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = dlp.srv.world
verify return:1
notBefore=Jul 14 06:33:49 2020 GMT
notAfter=Oct 12 06:33:49 2020 GMT
関連コンテンツ