<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Certificates · XB 现场笔记</title><link>https://www.xbcatm.com/zh/tags/certificates/</link><description>基于 HTTP、DNS、TLS、Caddy、SSH、发布与恢复的可复现运维现场笔记。</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://www.xbcatm.com/zh/tags/certificates/index.xml" rel="self" type="application/rss+xml"/><item><title>证书链是一条应当能打印出来的路径</title><link>https://www.xbcatm.com/zh/notes/certificate-chain/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/zh/notes/certificate-chain/</guid><description>把服务器发送的证书列表、客户端信任锚与请求主机名作为 TLS 验证的不同部分分别检查。</description><content:encoded>&lt;p&gt;TLS 客户端必须构建通向既有信任锚的有效证书路径，并验证请求的主机名。打印证书有助于诊断，但单靠打印不能证明这两点。&lt;/p&gt;
&lt;h2 id="叶证书不是全部"&gt;叶证书不是全部&lt;/h2&gt;
&lt;p&gt;端点首先出示&lt;em&gt;叶证书&lt;/em&gt;。其中包含公钥、有效期，以及用于主机名检查的主体备用名称。公共 CA 的部署通常还应发送构建路径所需的中间证书。缺少中间证书时，没有缓存它、也无法另行取得它的客户端可能失败。&lt;/p&gt;
&lt;p&gt;通常不必发送自签名根证书：信任来自客户端配置的信任锚，而不是服务器把某张证书放进列表。主体名称包含“Root”的交叉签名证书，在所选路径中也可能充当中间证书。因此，证书数量本身不能判断完整性或信任。&lt;/p&gt;
&lt;h2 id="阅读边缘实际发送的列表"&gt;阅读边缘实际发送的列表&lt;/h2&gt;
&lt;p&gt;OpenSSL 文档把 &lt;code&gt;s_client -showcerts&lt;/code&gt; 定义为服务器发送的证书列表，而不是已经验证的链。本笔记先前版本记录过以下站点快照：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certificate 0: CN=www.xbcatm.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; issuer : C=US, O=Let&amp;#39;s Encrypt, CN=YE1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notAfter : Nov 19 08:37:12 2026 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certificate 1: CN=YE1 (intermediate)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; issuer : C=US, O=ISRG, CN=Root YE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certificate 2/3: Root YE / ISRG Root … (CA certificates)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原记录统计了四个证书块。这里没有保留原始握手日志，本轮审阅也未重现在线握手；这些值应视为历史报告，而不是当前边缘证据。Let&amp;rsquo;s Encrypt 的证书链文档确实列出 YE1 与 Root YE 的交叉签名路径，因此仅凭这些名称不能判定链无效。具体在哪张证书处终止信任，取决于客户端信任库与路径构建。&lt;/p&gt;
&lt;h2 id="把签发授权单独看待"&gt;把签发授权单独看待&lt;/h2&gt;
&lt;p&gt;中间 CA 使根密钥可以保持离线，并将签发操作分离。吊销中间证书可能令依赖它的叶证书路径失效，甚至需要替换证书；并不会自动保全每张叶证书。&lt;/p&gt;
&lt;p&gt;CAA 在签发时授权 CA 文档规定的签发者域标识。它不固定某张中间证书，不改变浏览器信任，也不能证明已有证书符合历史 CAA 策略。&lt;code&gt;dns-caa-records&lt;/code&gt; 笔记讨论的是这项独立的策略检查。&lt;/p&gt;
&lt;h2 id="数量用于盘点验证用于信任"&gt;数量用于盘点，验证用于信任&lt;/h2&gt;
&lt;p&gt;原记录使用的盘点命令如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ echo | openssl s_client -connect www.xbcatm.com:443 -servername www.xbcatm.com -showcerts 2&amp;gt;/dev/null | grep &amp;#39;BEGIN CERT&amp;#39; | wc -l
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它产生只读网络流量，但隐藏诊断信息，且即使前面的命令失败，最后的计数仍可能成功。不要把 &lt;code&gt;4&lt;/code&gt; 或其他固定数量设为健康阈值。只有叶证书时，应检查预期签发路径，而不是认定所有单证书链都无效。&lt;/p&gt;
&lt;p&gt;实际验证时，应使用 OpenSSL 的 &lt;code&gt;-verify_hostname&lt;/code&gt; 与 &lt;code&gt;-verify_return_error&lt;/code&gt; 选项，要求检查主机名并在验证错误时失败，保留诊断信息，同时记录信任库与客户端版本。还要测试实际支持的客户端；一套 OpenSSL 信任库不能证明所有浏览器都兼容。&lt;/p&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc8446.html"&gt;RFC 8446 — TLS 1.3&lt;/a&gt;，第 4.4.2 节的证书列表顺序与可省略信任锚，已核验 2026-10-15。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc5280.html"&gt;RFC 5280 — X.509 PKI&lt;/a&gt;，第 6 节的信任锚输入与路径验证，已核验 2026-10-15。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://letsencrypt.org/docs/faq/"&gt;Let&amp;rsquo;s Encrypt FAQ&lt;/a&gt;，证书兼容性概览，已核验 2026-10-15。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://letsencrypt.org/certificates/"&gt;Let&amp;rsquo;s Encrypt: Chains of Trust&lt;/a&gt;，YE1 与 Root YE 的交叉签名路径，已核验 2026-10-15。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openssl.org/3.0/man1/openssl-s_client/"&gt;OpenSSL &lt;code&gt;s_client&lt;/code&gt;&lt;/a&gt;，呈现列表与验证选项，已核验 2026-10-15。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc8659.html"&gt;RFC 8659 — CAA&lt;/a&gt;，签发授权与客户端信任的区别，已核验 2026-10-15。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>