クラウド事業部 インフラエンジニアの吉岡です。
「mod_md」というApache2.4.30以降で利用可能なモジュールについて知る機会がありましたので、試しに利用してみることにしました。
目次
「mod_md」とは?
仮想ホスト間でのドメインの管理、ACMEプロトコルを介した証明書のプロビジョニング を行うことができるモジュールです。(現在はstatus: Experimental )
つまり、Lets encryptの証明書取得をApacheのモジュール(実験版)の設定のみで行えるイメージです。
今回は社内用に新しく構築するwebサーバでの証明書設定に利用することにしました。
モジュールの導入
設定する環境
今回利用するOS環境はAmazon Linux 2で、
Apacheのインストールなどの基本設定は実施済みの環境です。
必要なモジュールのインストール
mod_ssl,mod_mdをyum installします。
設定の追加
最低限必要な追加の設定は下記の通りです。
※Apacheの基本的な設定は完了しているものとします。
1----------httpd.conf----------
2ServerAdmin example@example.com
3#MDContactEmailディレクティブを利用して指定しない場合は
4#Let's Encryptの登録用アドレスにこちらが利用されますので、
5#root@localhostのままではエラーが出ます。
6<IfModule md_module>
7 MDBaseServer off
8 MDCertificateProtocol ACME
9 MDCAChallenges http-01 tls-alpn-01
10 MDRenewMode auto
11 MDPrivateKeys RSA 2048
12 MDRenewWindow 33%
13 MDStoreDir md
14
15 #MDBaseServer httpd.confで設定しているドメインもsslを管理する場合はon,virtualhostのみで運用する場合はoffで大丈夫です。
16 #MDCertificateProtocol 現在はACMEのみサポート
17 #MDCAChallenges 認証方式(dns認証も利用可能です)
18 #MDRenewMode auto manual alwaysがあります。
19 #MDRenewWindow 更新タイミング(残り33%=30日,XXdなど日数の指定も可能)
20 #MDStoreDir ${Serverroot}/mdに作成されます。鍵ファイルやログなどが保存されます。
21
22 #テスト用
23 MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
24
25 #MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
26 #本番用(レート制限があるため最初の設定調整の間は上記テスト用で実施)
27 MDCertificateAgreement accepted
28
29</IfModule>
30
31----------httpd.conf----------
32
33----------virtualhost.conf----------
34MDomain XXX.seeds-std.co.jp auto
35#auto に指定されているとserveraliasに設定されているドメインも証明書に含まれます。
36
37#ドメインに個別の設定が必要な場合に上記MDomainと入れ替え
38#<MDomain XXX.seeds-std.co.jp>
39# MDCertificateFile /etc/pki/tls/certs/localhost.crt
40# MDCertificateKeyFile /etc/pki/tls/private/localhost.key
41#</MDomain>
42
43<VirtualHost *:80>
44特に変更点はありません
45</VirtualHost>
46
47<VirtualHost *:443>
48SSL鍵のpathをコメントアウト
49 #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
50 #SSLCertificateFile /etc/pki/tls/certs/localhost.crt
51</VirtualHost>
52----------virtualhost.conf----------
上記の設定後、Apacheの再起動を行いますが、この際、Apacheは2回再起動する必要があります。
mod_mdにより発行、更新された証明書は一度md/stagingディレクトリ内に保存され、次回apacheの再起動時にmd/{$domain}/内に移動され、有効化されます。
今回の場合、1回目の再起動時にmod_mdが有効化され、mod_mdにより証明書の発行が行われます。
この時点では取得された証明書はmd/staging内に保存されており、有効化されていません。証明書発行時のログファイルはjob.jsonというファイルです。
このタイミングでサイトにhttps接続した場合はSSL証明書のエラーが発生します。 (Apacheのダミー証明書を使って起動されています。)
2回目の再起動の際に、md/{$domain}/ディレクトリに鍵ファイルが移動され、証明書が有効な状態になります。
補足
いくつか注意点と、今回の設定について補足を記載します。
・MDCertificateAuthorityでステージングのURLを指定し、Let’s Encrypt証明書を発行した場合は本番用のURLに切り替えて再発行する際に、md/{$domain}/内の鍵ファイルを削除する必要があります。
・Let’s Encryptの証明書を使うため、certbotで証明書を取得する際と同様に、IP制限等には注意が必要です。
virtual.confの「MDomain」ディレクティブ内の、コメントアウトしている部分はドメインに対して個別に設定を行う場合に使用し、今回は既存の証明書を指定する方法を記載しています。
また、httpd.confの「MDRenewMode」がautoの場合、有効期限が残っていれば「MDomain」内で指定した証明書が利用されます。alwaysの場合、有効期限にかかわらずLet’s Encryptの証明書を発行し、利用します。
1#<MDomain XXX.seeds-std.co.jp>
2# MDCertificateFile /etc/pki/tls/certs/localhost.crt
3# MDCertificateKeyFile /etc/pki/tls/private/localhost.key
4#</MDomain>
まとめ
今回利用したモジュールは実験的モジュールですので、個人で運用するサーバや今回の様なケース(社内用)で試すくらいで、本番環境で利用することはおそらくないと思いますが、Let’s Encryptによる証明書の利用がapacheの設定のみで完結し、certbotのインストールや、cronへの設定などが不要になるのは非常に便利だと感じました。