certbot certonlyコマンドで証明書取得(standaloneプラグイン)

本来のWebサーバを停止し、certbotに含まれるstandaloneサーバ(一時的なWebサーバ)で認証し、証明書の取得だけを行う方法。Webサーバへの証明書の指定は別途手動で行う。

本来のWebサーバを稼働させたまま証明書取得したいなら、他のプラグインで。


    certbot certonlyコマンド実行

    当サイトではcertbotコマンドはcertbot-autoスクリプトのこと。

    # 代表のドメイン
    main=example.test
    # サブドメイン
    # 複数なら,区切りで
    sub=sub1.$main,sub2.$main
    subsub=subsub.sub1.$main
    
    # 全ドメイン(一番目のドメインが一般名称(CN)として記載)
    domains=$main,$sub,$subsub
    
    # 登録するメールアドレス
    email=hostmaster@$domain
    
    certbot-auto certonly --standalone --non-interactive --agree-tos \
      --keep --expand --email $email --no-eff-email --domains $domains \
      --pre-hook 'systemctl stop httpd' --post-hook 'systemctl start httpd'
    

    コマンドオプション

    本来のWebサーバを事前に手動で停止しておいてもいいが、ここでは--pre-hook--post-hookを利用して停止と再起動を自動化している。この方法の利点は、/etc/letsencrypt/renewal/ドメイン.confに記録が残り、証明書更新のcertbot-auto renewコマンドの際にも、同様の処理が自動でなされること。

    完全に初回なら--keep--expandは付けても無関係だが、取得直後の2回目や追加ドメインがある場合などで使う。付けないと、該当した場合にユーザ入力でどうするか聞かれるか、エラー終了(--non-interactive)。


    証明書取得に成功した場合のログ

    certbotのログの詳細は、/var/log/letsencrypt/にローテーションされて残るが、標準出力では下記のようになる。

    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator standalone, Installer None
    Running pre-hook command: systemctl stop httpd
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for 1番目ドメイン
    http-01 challenge for 他ドメイン1
    http-01 challenge for 他ドメイン2
    Waiting for verification...
    Cleaning up challenges
    Running post-hook command: systemctl start httpd
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/certbot-test.open-code.club/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/certbot-test.open-code.club/privkey.pem
       Your cert will expire on 2019-01-16. To obtain a new or tweaked
       version of this certificate in the future, simply run certbot-auto
       again. To non-interactively renew *all* of your certificates, run
       "certbot-auto renew"
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
    

    成功するとマーク部分のようにCongratulations!と出る。有効期限の表示もあり、90日間と決まっている。


    取得にかかる時間

    ログ詳細をみると、取得にかかる時間は数ドメインで10-20秒くらいの模様。以前、数十ドメインでも1分以内だった。このくらいのサーバ停止が許容できないなら、--webrootなどのプラグインへ。

    # --pre-hookと--post-hookの間の時間を調べる
    grep 'Running' /var/log/letsencrypt/letsencrypt.log
    2018-10-19 11:54:11,998:INFO:certbot.hooks:Running pre-hook command: systemctl stop httpd
    2018-10-19 11:54:27,500:INFO:certbot.hooks:Running post-hook command: systemctl start httpd
    

    直後に同じコマンド実行した場合のログ

    --keepを付けているので、更新期限が十分にあって再取得は行われない。

    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator standalone, Installer None
    Cert not yet due for renewal
    Keeping the existing certificate
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Certificate not yet due for renewal; no action taken.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    

    直後にドメインを追加して再取得した場合のログ(--expand)

    追加ドメインがあって、--expandを付ける場合。

    初回取得のログと違うのは、追加ドメイン名と、Obtaining a new certificateが下記に変わるところ。

    Renewing an existing certificate

    直後に同じドメインで強制更新した場合のログ(--force-renewal)

    これは上記の--expandと同様のログだった。

    不必要な完全重複取得は週に5回までと回数制限があるので、テスト時から--keepは付けておいた方がいいかも。


    直後に同じドメインで新規取得した場合のログ(--duplicate)

    既存の証明書があるのに別個の新規取得を行う--duplicateを使うときは注意。証明書の名前やパスが「1番目ドメイン名-0001」のようになって、管理しずらい。

    ログは初回取得と同様にObtaining a new certificateとなる。


    エラーの場合のログ

    下記はhttpdサーバを止めずに(--pre-hookも使わず)、実行した場合のエラーログ。

    Problem binding to port 80: Could not bind to IPv4 or IPv6.

    ログは数年前と違ったし、今後も変わるかもしれないから、詳細は/var/log/letsencrypt/を見た方がいい。