Apacheのモジュール「mod_md」を使ってみました | SEEDS Creators' Blog | 株式会社シーズ

Apacheのモジュール「mod_md」を使ってみました

クラウド事業部 インフラエンジニアの吉岡です。

「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の基本的な設定は完了しているものとします。

----------httpd.conf----------
ServerAdmin example@example.com
#MDContactEmailディレクティブを利用して指定しない場合は
#Let's Encryptの登録用アドレスにこちらが利用されますので、
#root@localhostのままではエラーが出ます。
<IfModule md_module>
    MDBaseServer            off
    MDCertificateProtocol   ACME 
    MDCAChallenges          http-01 tls-alpn-01 
    MDRenewMode             auto 
    MDPrivateKeys           RSA 2048
    MDRenewWindow           33% 
    MDStoreDir              md 

    #MDBaseServer httpd.confで設定しているドメインもsslを管理する場合はon,virtualhostのみで運用する場合はoffで大丈夫です。
    #MDCertificateProtocol 現在はACMEのみサポート
    #MDCAChallenges 認証方式(dns認証も利用可能です)
    #MDRenewMode auto manual alwaysがあります。
    #MDRenewWindow 更新タイミング(残り33%=30日,XXdなど日数の指定も可能)
    #MDStoreDir ${Serverroot}/mdに作成されます。鍵ファイルやログなどが保存されます。

    #テスト用
    MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory 

    #MDCertificateAuthority  https://acme-v02.api.letsencrypt.org/directory 
    #本番用(レート制限があるため最初の設定調整の間は上記テスト用で実施)
    MDCertificateAgreement  accepted

</IfModule>

----------httpd.conf----------

----------virtualhost.conf----------
MDomain XXX.seeds-std.co.jp auto
#auto に指定されているとserveraliasに設定されているドメインも証明書に含まれます。

#ドメインに個別の設定が必要な場合に上記MDomainと入れ替え
#<MDomain XXX.seeds-std.co.jp>
#  MDCertificateFile /etc/pki/tls/certs/localhost.crt
#  MDCertificateKeyFile /etc/pki/tls/private/localhost.key
#</MDomain>

<VirtualHost *:80>
特に変更点はありません
</VirtualHost>

<VirtualHost *:443>
SSL鍵のpathをコメントアウト
        #SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
        #SSLCertificateFile /etc/pki/tls/certs/localhost.crt
</VirtualHost>
----------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の証明書を発行し、利用します。

#<MDomain XXX.seeds-std.co.jp>
#  MDCertificateFile /etc/pki/tls/certs/localhost.crt
#  MDCertificateKeyFile /etc/pki/tls/private/localhost.key
#</MDomain>

まとめ

 今回利用したモジュールは実験的モジュールですので、個人で運用するサーバや今回の様なケース(社内用)で試すくらいで、本番環境で利用することはおそらくないと思いますが、Let’s Encryptによる証明書の利用がapacheの設定のみで完結し、certbotのインストールや、cronへの設定などが不要になるのは非常に便利だと感じました。