OpenWRT の acme で Lets Encrypt を使った httpサーバーの SSL化 (間違い)

投稿者: | 2023年11月3日

うちのは nginx をリバースプロキシにしてマルチドメイン運用をしている。 だから、/etc/acme/以下にいくつもcerファイルやkeyファイルがある。

nginxを使いながらacmeを使えるはずなんだけど、うまく設定できていない。

面倒なので? 更新期限近いので nginx止めてstandalone mode で更新しちゃった。

nginx 止めずにやったら、# /usr/lib/acme/acme.sh –issue –standalone -d hogehoge.ddns.jp
[Sun Jul 16 22:45:02 JST 2023] Using CA: https://acme.zerossl.com/v2/DV90
[Sun Jul 16 22:45:02 JST 2023] Standalone mode.
[Sun Jul 16 22:45:02 JST 2023] tcp       0     0 0.0.0.0:80             0.0.0.0:*               LISTEN     26581/nginx.conf -g
tcp       0     0 :::80                   :::*                   LISTEN     26581/nginx.conf -g
[Sun Jul 16 22:45:02 JST 2023] tcp port 80 is already used by
80                  
[Sun Jul 16 22:45:02 JST 2023] Please stop it first
[Sun Jul 16 22:45:02 JST 2023] _on_before_issue.

まず 80番ポート使ってるやつ止めろと言われた。

nginx止めて、再度やったら、# /usr/lib/acme/acme.sh –issue –standalone -d hogehoge.ddns.jp
[Sun Jul 16 22:45:35 JST 2023] Using CA: https://acme.zerossl.com/v2/DV90
[Sun Jul 16 22:45:35 JST 2023] Standalone mode.
[Sun Jul 16 22:45:35 JST 2023] Create account key ok.
[Sun Jul 16 22:45:36 JST 2023] No EAB credentials found for ZeroSSL, let’s get one
[Sun Jul 16 22:45:36 JST 2023] acme.sh is using ZeroSSL as default CA now.
[Sun Jul 16 22:45:36 JST 2023] Please update your account with an email address first.
[Sun Jul 16 22:45:36 JST 2023] acme.sh –register-account -m my@example.com
[Sun Jul 16 22:45:36 JST 2023] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
[Sun Jul 16 22:45:36 JST 2023] Please add ‘–debug’ or ‘–log’ to check more details.
[Sun Jul 16 22:45:36 JST 2023] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

と、メールアドレスを登録してからや!と言われた。# /usr/lib/acme/acme.sh –register-account -m oreore@gmail.com
[Sun Jul 16 22:47:13 JST 2023] No EAB credentials found for ZeroSSL, let’s get one
[Sun Jul 16 22:47:15 JST 2023] Registering account: https://acme.zerossl.com/v2/DV90
[Sun Jul 16 22:47:17 JST 2023] Registered
[Sun Jul 16 22:47:17 JST 2023] ACCOUNT_THUMBPRINT=’DJcZFHNCUfqQ4RSARYbf6ZD4lbMq7B1JSdcgdGMofwM’

となった。多分これでいいのかな?

んじゃ!ってことで更新かけてみる。# /usr/lib/acme/acme.sh –issue –standalone -d hogehoge.ddns.jp
[Sun Jul 16 22:47:25 JST 2023] Using CA: https://acme.zerossl.com/v2/DV90
[Sun Jul 16 22:47:25 JST 2023] Standalone mode.
[Sun Jul 16 22:47:25 JST 2023] Creating domain key
[Sun Jul 16 22:47:25 JST 2023] The domain key is here: /root/.acme.sh/hogehoge.ddns.jp_ecc/hogehoge.ddns.jp.key
[Sun Jul 16 22:47:25 JST 2023] Single domain=’hogehoge.ddns.jp’
[Sun Jul 16 22:47:25 JST 2023] Getting domain auth token for each domain
[Sun Jul 16 22:47:29 JST 2023] Getting webroot for domain=’hogehoge.ddns.jp’
[Sun Jul 16 22:47:29 JST 2023] Verifying: hogehoge.ddns.jp
[Sun Jul 16 22:47:29 JST 2023] Standalone mode server
[Sun Jul 16 22:47:31 JST 2023] Processing, The CA is processing your order, please just wait. (1/30)
[Sun Jul 16 22:47:35 JST 2023] Success
[Sun Jul 16 22:47:35 JST 2023] Verify finished, start to sign.
[Sun Jul 16 22:47:35 JST 2023] Lets finalize the order.
[Sun Jul 16 22:47:35 JST 2023] Le_OrderFinalize=’https://acme.zerossl.com/v2/DV90/order/1lrSEkm0u4TbJ5VFRVhiZQ/finalize’
[Sun Jul 16 22:47:37 JST 2023] Order status is processing, lets sleep and retry.
[Sun Jul 16 22:47:37 JST 2023] Retry after: 15
[Sun Jul 16 22:47:53 JST 2023] Polling order status: https://acme.zerossl.com/v2/DV90/order/1lrSEkm0u4TbJ5VFRVhiZQ
[Sun Jul 16 22:47:54 JST 2023] Downloading cert.
[Sun Jul 16 22:47:54 JST 2023] Le_LinkCert=’https://acme.zerossl.com/v2/DV90/cert/obImtuta6slmLzkr_CPh1w’
[Sun Jul 16 22:47:55 JST 2023] Cert success.
—–BEGIN CERTIFICATE—–
MIID/TCCA4SgAwI………………………………………….
……………………………………………………….
snip
……………………………………………………….
—–END CERTIFICATE—–

[Sun Jul 16 22:47:55 JST 2023] Your cert is in: /root/.acme.sh/hogehoge.ddns.jp_ecc/hogehoge.ddns.jp.cer
[Sun Jul 16 22:47:55 JST 2023] Your cert key is in: /root/.acme.sh/hogehoge.ddns.jp_ecc/hogehoge.ddns.jp.key
[Sun Jul 16 22:47:55 JST 2023] The intermediate CA cert is in: /root/.acme.sh/essa21.ddns.jp_ecc/ca.cer
[Sun Jul 16 22:47:55 JST 2023] And the full chain certs is there: /root/.acme.sh/essa21.ddns.jp_ecc/fullchain.cer

nginx を再起動してOKかな?

おっとっと!

証明書は上記の通り /root/.acme.sh ディレクトリ以下に「サイト名_ecc」ディレクトリとして作成された。

ここじゃないよ! openwrtのacmeは/etc/acme/にファイルが置かれるんだよ!

ってことで、やっぱりstandaloneではなく、基本運用のnginxの下での更新を試みることにした。 OpenWRTの Luci webconfig の acme.sh パネルから設定を試みるが一向に更新できない。なんでだ?と思い、ssh接続しながらconfigをいじる → 変更されない。。。んで、

[ ] enable debug logging

にチェックを入れてlogをみると以前の設定のままで更新を試みてerrがいっぱい出ていた。

Certificate config

のサイトを[Edit]ボタンを押して修正しても webroot の変更とか反映されていない… に気がついた。

sshでログインしていろいろ手作業でnginxの設定とacmeの設定が合うようconfファイルを修正した。そんでもって/etc/init.d/acme restart

して system log をみてみると、daemon.info acme: Running ACME for hogehoge.ddns.jp
daemon.err run-acme[15217]: acme: Running ACME for hogehoge.ddns.jp
daemon.info acme: Found previous cert config. Issuing renew.
daemon.err run-acme[15217]: acme: Found previous cert config. Issuing renew.
daemon.debug acme: Running acme.sh as ‘/usr/lib/acme/acme.sh –home /etc/acme –renew -d hogehoge.ddns.jp –debug’
daemon.err run-acme[15217]: acme: Running acme.sh as ‘/usr/lib/acme/acme.sh –home /etc/acme –renew -d hogehoge.ddns.jp –debug’
daemon.err run-acme[15217]: Lets find script dir.
daemon.err run-acme[15217]: _SCRIPT_=’/usr/lib/acme/acme.sh’
….
snip
….
daemon.info run-acme[15217]: Renew: ‘hogehoge.ddns.jp’
daemon.err run-acme[15217]: Le_API=’https://acme-v02.api.letsencrypt.org/directory’
daemon.info run-acme[15217]: Renew to Le_API=https://acme-v02.api.letsencrypt.org/directory
daemon.err run-acme[15217]: Using config home:/etc/acme
daemon.err run-acme[15217]: ACME_DIRECTORY=’https://acme-v02.api.letsencrypt.org/directory’
daemon.info run-acme[15217]: Skip, Next renewal time is: Wed Sep 6 15:00:24 UTC 2023
daemon.info run-acme[15217]: Add ‘–force’ to force to renew.
daemon.info acme: Running post checks (cleanup).
daemon.err run-acme[15217]: acme: Running post checks (cleanup).
daemon.info nginx_init: using /etc/nginx/nginx.conf (the test is ok)

なんかうまく言ったみたいなんだけど、期限内なので、更新skip みたいに言われた。強制更新なら --force を使えって言ってる。じゃあ使ってみよう。/usr/lib/acme/acme.sh –home /etc/acme –renew –force -d hogehoge.ddns.jp –debug

–force をつけて実行したら、うまいこと更新できました。パチパチ!

まちがいはここだ!

上記logをよく眺めてみると、”Using CA: https://acme.zerossl.com/v2/DV90” ってでてる。今どきの acme はletsencryptではなくzerosslを使うように組まれているとのこと。Lets encrypt を使うなら default-ca を letsencrypt に指定しなければならない。具体的には、
/usr/lib/acme/acme.sh --set-default-ca --server letsencrypt --home /etc/acme -d hogehoge.ddns.jp
を実行するとここ書いてあった。

まとめ

【目的】

OpenWRT上でnginxを走らせてLAN内のwebサーバーをリバースプロキシさせているときのSSL証明書はOpenWRTのacme.shモジュールで自動更新させたい!

【方法】

  1. nginxの設定で (web)root ディレクトリと/etc/acme/hogehoge.ddns.site/hogehoge.ddns.site.conf の Le_Webroot が一致していることを確認
  2. nginxのwebrootに .well-known/acme-challenge という空ディレクトリを作っておく
  3. /usr/lib/acme/acme.sh --home /etc/acme --renew -d hogehoge.ddns.site --debug を実行する。
  4. debug log をみて、更新模様を確認する。

でLetsEncryptのサイト証明書が更新できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です