Let's EncryptクライアントAcmeFetch使ってみた

※※後ほど簡易図を追加します※※

今年に入ってからはLet's EncryptのクライアントにすべてAcmeFetchを使っています。

github.com

MRTGでおなじみTobiさん作ということで使っています。
Ver. 0.6.1でnginxなど用の中間証明書一体型の出力にも対応したのでご紹介します。

私の見立てで特徴は以下のような点です。
・シンプル
・証明書の取得、更新自体にはroot権限不要
・cfg設定でSNIも指定可能
・実行時に余計なアップデートが走らない
・実行時にCDをおねだりされない :-P

以下、利用手順を示します。

インストール

wget https://github.com/oetiker/AcmeFetch/releases/download/v0.6.2/acmefetch-0.6.2.tar.gz
tar xvf acmefetch-0.6.2.tar.gz
cd acmefetch-0.6.2
./configure --prefix=/opt/local/acmefetch
make
sudo make install

設定

cd /opt/local/acmefetch/etc
mv acmefetch.cfg.dist acmefetch.cfg
vi acmefetch.cfg

cfgファイルの内容はこのようになります。

{
    "GENERAL": {
        "ACMEstaging": "acme-staging.api.letsencrypt.org",
        "ACMEservice": "acme-v01.api.letsencrypt.org",
        "accountKeyPath": "/etc/ssl/private/letsencryptAccountKey.key"
    },
    "CERTS": [
        {
            "certOutput": "/etc/ssl/certs/testCert.pem",
            "certFormat": "PEM",
            "keyOutput": "/etc/ssl/private/testCert.key",
            "keyFormat": "PEM",
            "chainOutput": "/etc/ssl/certs/testCertChain.pem",
            "chainrmaFot": "PEM",
            "commonName": "hoge.example.com",
            "SITES": {
                "hoge.example.com": {
                    "challengeHandler": "SimpleSSH",
                    "challengeConfig": {
                        "www_root": "/var/www/html/",
                        "ssh_host": "root@127.0.0.1"
                    }
                }
            }
        }
    ]
}

こちらはapache httpdサーバー環境で、AcmeFetchをlocalのroot権限で実行する想定の内容です。
証明書を配置する権限と、http-01のテストファイルを設置する権限が必要なのでそれぞれ書き込み権限を設定してください。
またssh_hostの部分は鍵認証でパスワード無しのログインができるようにauthorized_keysへの登録も必要です。

SITESの部分で証明書を取得するそれぞれのFQDNに関する設定を行います。SNIとして登録するFQDN用の設定はSITES部分を追加して書きます。
www_root以下に .well-known/acme-challenge というディレクトリが作成され、その中にhttp-01のチャレンジID名のファイルが作成されます。

nginx環境の場合は、cfgから chainOutput および chainrmaFot の項目を削除します。
すると、証明書と中間証明書が一体となった形式で certOutput が生成されます。

cfgができたら実行します。

/opt/local/acmefetch/bin/acmefetch --cfg=/opt/local/acmefetch/etc/acmefetch.cfg
(以下は出力例)
/tmp/yRAb7m8bc2.cfgGenerating a 2048 bit RSA private key
................................................+++
...................................................................................................................................+++
writing new private key to '/etc/ssl/private/testCert.key.7302'
-----

更新の時は --force オプションも指定します。

/opt/local/acmefetch/bin/acmefetch --cfg=/opt/local/acmefetch/etc/acmefetch.cfg --force

cronで自動実行する場合は、 && systemctl reload nginx などで読み込み反映も行う必要があります。

MRTG同様(ややパースしにくいですが)簡潔なcfgで、動作も分かりやすく使いやすいです。
開発も継続的に行われているので、Let's Encryptクライアントをお探しの方や、お使いのクライアントに(余計なアップデートが同時に行われるなど)ご不満のある方はお試しになってはいかがでしょうか。