環境
-
QTS SSL証明書: v2.2.73 (build 20260310, 最終更新 2026-07-09 — 最新)
-
ドメイン: カスタムDDNS(
*.myqnapcloud.com) -
NginxがHome Assistantのフロントに配置
バグ
Let’s Encryptの更新後、毎回 QcloudSSLCertificate の letsencrypt_agent_cli バイナリが 期限切れのDST Root CA X3証明書(2021年9月30日失効)を /etc/stunnel/uca.pem に追記してしまいます。これにより、リーフ証明書とチェーン自体は正常であっても、Alexa Smart HomeやAWS Lambda、 curl(-kなし)などの厳密なTLS検証を行うクライアントでは正常に接続できなくなります。
原因
acme-tinyのステップは正しく YR1 中間CAのみを取得します:
cert/chain → YR1のみ(正常)
ですが letsencrypt_agent_cli は intermediate.pem(uca.pemにコピー)として、
cert/intermediate.pem → YR1 + DST Root CA X3(2021年失効)(問題!)
このDST証明書がバイナリ内部で証明書アセンブリ処理の際にハードコーディングされています。cert/chain(acme-tinyの生出力)は汚染されていません——破損はコンパイル済みバイナリ内部で発生しています。
これは2026年5月27日にLetsEncryptがCA階層構造を変更したために発生したと考えられます(出典1)
検証方法
# cert/chain — クリーン
openssl x509 -noout -subject -dates -in /mnt/ext/opt/QcloudSSLCertificate/cert/chain
# subject=C=US, O=Let’s Encrypt, CN=YR1 | notAfter=Sep 2 23:59:59 2028 GMT (正常)
# cert/intermediate.pem — 破損
awk ‘…’ /mnt/ext/opt/QcloudSSLCertificate/cert/intermediate.pem | openssl x509 -noout -subject -dates
# 証明書1: YR1 notAfter=2028年9月2日(正常)
# 証明書2: DST Root CA X3 notAfter=2021年9月30日(問題)
影響
ブラウザは追加証明書を無視し正常に検証できます。しかし、厳格なチェーン検証を行うクライアント(Alexa Smart Homeスキル、AWS Lambda、標準curlなど)は SSL: unable to get local issuer certificate エラーとなり失敗します。
暫定対応(修正まで)
クリーンなファイルから失効証明書を除去しクロス署名版ISRG Root YRを追加するnginx.pemを日次で再生成するcronスクリプト:
0 4 * * * /share/CACHEDEV1_DATA/build_nginx_pem.sh
必要な修正
letsencrypt_agent_cli からDST Root CA X3のハードコーディングを削除してください。バイナリは cert/chain 内の証明書のみを使って intermediate.pem/uca.pem を構築するべきです。
他のOSS解決例: