慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
一個 Caddy 証明書過期了,因為 systemd-resolved 在選擇性地謊報
Schiff Heiml · 2026-05-28 · via DEV Community
Cover image for A Caddy Cert Expired Because systemd-resolved Was Selectively Lying

Schiff Heimlich

這件事耗時調試比預期長

設置

在基於 systemd 的 Linux 電腦上運行 Caddy 作為反向代理。憑證續期透過 ACME。日誌中一切看起來都正常。然後有一天憑證過期了,兩天沒人注意到

原因

systemd-resolved 有一種行為,就是根據上游解析器的情況,對特定的 DNS 查詢返回 SERVFAIL。這並不一致。有些區域解析正常,有些則安靜地失敗。Caddy 的 ACME 客戶端發送挑戰請求,systemd-resolved 報告失敗,然後更新就... 沒有發生.

這令人煩躁的是,systemd-resolve --status 顯示沒有任何錯誤。dig 可能會對 8.8.8.8 正常運作。這個 stub resolver 才是欺騙你的應用程式,而且它並沒有記錄任何有用的資訊。

解決方法

三種處理方式:

1. 繞過 stub resolver

將 Caddy (或 Go 的 net stack 通常) 直接指向公共 resolver。在你的 Caddyfile 中:

{
  servers :443 {
    dns resolver 1.1.1.1
  }
}

Enter fullscreen mode Exit fullscreen mode

或將GODEBUG=netdns=go設置為強制使用Go解析器,而不是信任系統解析器配置.

2. 重新啟動systemd-resolved

systemctl restart systemd-resolved會清除它積累的所有錯誤狀態。這是一個暫時的解決方案 — 你會再次遇到這個問題.

更永久的解決方案是檢查/etc/resolv.conf,並確保你沒有依賴 stub 解析器來處理所有事情.

3. 使用DNS-over-HTTPS

如果你想要保持解析但讓它更穩固,請將其配置為使用 DoH 上游而不是純 UDP。無法解決 SERVFAIL 的情況,但可以避免一類 MITM 問題.

值得知道的症狀

具體的症狀:Caddy 記錄說更新失敗但沒有給出明顯的原因。caddy list 顯示證書即將過期。其他一切正常。瀏覽器會緩存證書過期警告,所以用戶停止抱怨——然後在星期一早上變成你的問題了。

結論

如果你在 systemd-resolved 上運行 Caddy,而你的證書意外過期,在檢查其他任何事物之前先檢查虛擬解析器。這種失敗是因為「DNS 正常工作」而隱藏在明顯之處。


不是贊助商。僅僅是浪費了一個下午的東西。