Apache の ACMEモジュールで Let's Encrypt 証明書を取得してみた

Linux
Linux
スポンサーリンク

ACME は、SSL/TLSサーバー証明書の発行や管理などを自動で行うための仕組みです。Apache httpd ではこの ACME をサポートする mod_md(Managed Domain)というモジュールの開発が進められていて、将来 Apache httpd 2.4.x の安定版へのリリースが計画されています。そこで今回は一足先に、Apache の ACMEモジュール mod_md を使った Let's Encrypt 証明書の取得を試してみました。

 
参考資料:ACME Support in Apache HTTP Server Project - Let's Encrypt

(2018年3月25日追記)mod_md が Apache httpd 2.4.33 の安定版にリリースされました。

下準備

サーバーOSは、CentOS 7.4 (1708) です。下準備として開発ツールや Apache httpd が依存するライブラリなどをインストールしておきます。

開発ツールとライブラリのインストール

yum -y groupinstall base
yum -y groupinstall development
 
yum -y install pcre-devel
yum -y install expat-devel
yum -y install jansson-devel
yum -y install openssl-devel

APR のインストール

cd /usr/local/src/
wget http://ftp.riken.jp/net/apache//apr/apr-1.6.3.tar.gz
tar xvzf apr-1.6.3.tar.gz
cd apr-1.6.3/
./configure
make
make install

APR-util のインストール

cd /usr/local/src/
wget http://ftp.riken.jp/net/apache//apr/apr-util-1.6.1.tar.gz
tar xvzf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --with-apr=/usr/local/apr
make
make install

curl の最新版をインストール(mod_md のコンパイルにバージョン7.5以上が必要です)

cd /usr/local/src/
wget https://curl.haxx.se/download/curl-7.56.1.tar.gz
tar xvzf curl-7.56.1.tar.gz
cd curl-7.56.1/
./configure
make
make install

/usr/local/lib 以下に 最新版 curl のライブラリがインストールされますので、ライブラリのパスに追加しておきます

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

下準備は以上です。

Apache 2.5(開発版)のインストール

Apache httpd 開発版のバージョン 2.5 をインストールします。新しい機能やモジュールはこの開発版バージョンで開発テストされた後に安定版にリリースされます。(当然ですがこの開発版を本番環境で使ってはいけません)

参考資料:Apache Development Notes - The Apache HTTP Server Project

開発用リポジトリから Apache httpd 2.5 のソースをダウンロードします。

cd /usr/local/src/
svn checkout http://svn.apache.org/repos/asf/httpd/httpd/trunk httpd-2.5

configure ファイルを生成します。

cd httpd-2.5/
./buildconf --with-apr=/usr/local/apr/bin/apr-1-config

ACMEモジュールの mod_md と mod_ssl を有効にしてコンパイル&インストールします。

./configure \
--with-apr=/usr/local/apr \
--with-curl=/usr/local/lib \
--enable-md \
--enable-ssl \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all
 
make
make install

以上で Apache httpd の開発版 が /usr/local/apache2/ にインストールされました。

ACME モジュール mod_md 関連の設定

SSL/TLSの動作に必要なモジュールと ACME モジュール mod_md を有効にします。
vim /usr/local/apache2/conf/httpd.conf

#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
 ↓
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

#LoadModule watchdog_module modules/mod_watchdog.so
 ↓
LoadModule watchdog_module modules/mod_watchdog.so

#LoadModule ssl_module modules/mod_ssl.so
 ↓
LoadModule ssl_module modules/mod_ssl.so

#LoadModule md_module modules/mod_md.so
 ↓
LoadModule md_module modules/mod_md.so

SSL/TLSの設定ファイルを読み込むように変更します。

#Include conf/extra/httpd-ssl.conf
 ↓
Include conf/extra/httpd-ssl.conf

管理対象ドメインの設定

続いて SSL/TLSの設定ファイル に Let's Encrypt の証明書を取得するための設定をします。

VirtualHost ブロックの上あたりに、次の4行を追加します。
vim /usr/local/apache2/conf/extra/httpd-ssl.conf

ManagedDomain mdtest.apar.jp
MDCertificateAuthority https://acme-v01.api.letsencrypt.org/directory
MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf
MDRenewWindow 33%
 
<VirtualHost _default_:443>

ManagedDomain
 ACMEで管理するドメインを指定します。複数のバーチャルホストがある場合はスペースで区切って対象ドメインを指定します。また「auto」を指定するとすべてのバーチャルホストのドメインが管理対象になります。

MDCertificateAuthority
 認証局のACMEサービスを提供するURLを指定します。初期値は Let's Encrypt の「https://acme-v01.api.letsencrypt.org/directory」が指定されています。(初期値でよければ指定しなくてもかまいません)

MDCertificateAgreement
 MDCertificateAuthority で指定した認証局の利用規約文書のURLを指定します。

MDRenewWindow
 証明書をいつ更新するかを指定します。「21d」と指定した場合は証明書有効期限の「21日前」、「10%」と指定した場合は証明書有効期間が残り10%になったタイミングで(有効期間が90日の場合は期限の9日前)更新されます。初期値は「33%」です。(初期値でよければ指定しなくてもかまいません)

参考資料:mod_md - Apache HTTP Server Version 2.5

 
続いて、ServerName を ManagedDomain で指定したドメインに変更し、認証局に登録するメールアドレスを ServerAdmin で指定します。

<VirtualHost _default_:443>
 
ServerName www.example.com:443
 ↓
ServerName mdtest.apar.jp:443

ServerAdmin you@example.com
 ↓
ServerAdmin hostmaster@apar.jp

ACMEモジュールを使う場合は、証明書と秘密鍵の指定が不要になりますのでコメントアウトしておきます。

SSLCertificateFile "conf/server.crt"
 ↓
#SSLCertificateFile "conf/server.crt"
 
SSLCertificateKeyFile "conf/server.key"
 ↓
#SSLCertificateKeyFile "conf/server.key"

証明書の取得と確認

ACME の設定は以上です、Apache を起動もしくは再起動すると証明書の取得が行われます。

/usr/local/apache2/bin/apachectl start

Apacheのログに「The Managed Domain <ドメイン名> has been setup 〜」のログが表示されていれば、証明書の取得完了です。
tail /usr/local/apache2/logs/error_log

[Fri Oct 28 04:43:04.684524 2017] [ssl:warn] [pid 30963:tid 139870843725632] AH10085: Init: mdtest.apar.jp:443 will respond with '503 Service Unavailable' for now. This host is part of a Managed Domain, but no SSL certificate is available (yet).
[Fri Oct 28 04:43:04.685824 2017] [mpm_event:notice] [pid 30963:tid 139870843725632] AH00489: Apache/2.5.0-dev (Unix) OpenSSL/1.0.2k-fips configured -- resuming normal operations
[Fri Oct 28 04:43:04.685854 2017] [core:notice] [pid 30963:tid 139870843725632] AH00094: Command line: '/usr/local/apache2/bin/httpd'
[Fri Oct 28 04:43:13.232617 2017] [md:notice] [pid 30965:tid 139870724921088] AH10059: The Managed Domain mdtest.apar.jp has been setup and changes will be activated on next (graceful) server restart.

Apache を再起動して取得した証明書を有効にします。(「MDNotifyCmd」ディレクティブでコマンドを指定すればこの再起動も自動化できそうです)

/usr/local/apache2/bin/apachectl graceful

WEBブラウザで https://<管理対象ドメイン>/ にアクセスすると Let's Encrypt が発行した証明書が有効になっていることが確認できます。
WEBブラウザで証明書を表示

証明書と秘密鍵は「/usr/local/apache2/md/domains/<ドメイン名>/」以下に保存されます。保存場所は「MDStoreDir」ディレクティブで変更することもできます。

ls -l /usr/local/apache2/md/domains/mdtest.apar.jp/
 
-rw-------. 1 root root 681 Oct 28 04:51 md.json
-rw-------. 1 root root 1704 Oct 28 04:51 privkey.pem
-rw-------. 1 root root 3440 Oct 28 04:51 pubcert.pem

おわりに

Let's Encrypt がコマンド一発で証明書が取得できるも衝撃的でしたが、下のACMEモジュールのデモ動画を見た時は正直「手品か!」と思いました。早く Apache 2.4 へ mod_md がリリースされるといいですね!

コメント

  1. ktykogm より:

    参考にさせていただいています。
    ありがとうございます。

    ちょっとしたことなんですが、誤字を見つけましたので一応連絡させていただきました。

    APRが、ARP になっているところが2箇所ほどあります。
    よろしくお願いします。

タイトルとURLをコピーしました