---
title: "生成DNS印章-保障DNS服务器安全"
slug: "dns-stamp"
date: "2025-06-04 12:00"
updated: "2026-10-07T18:22:32+08:00"
category: "笔记"
description: "什么是 DNS印章？ DNS印章编码所有连接到安全 DNS服务器所需的参数线。把邮票想象成二维码，但用于 DNS配置。打开 https://dnscrypt.info/stamps 例如： https://223.5.5.5/dns-queryProtocol：DNS-over-HTTPS (DoH) IP Addre…"
url: https://blog.dayuai.com/dns-stamp
---
## 什么是 DNS印章？
DNS印章编码所有连接到安全 DNS服务器所需的参数线。把邮票想象成二维码，但用于 DNS配置。<br><strong>打开 </strong><a target="_blank" rel="noopener noreferrer nofollow" href="https://dnscrypt.info/stamps"><strong>https://dnscrypt.info/stamps</strong></a> 例如： <a target="_blank" rel="noopener noreferrer nofollow" href="https://223.5.5.5/dns-query"><mark>https://223.5.5.5/dns-query</mark></a></p><pre class="tiptap-codeblock"><code>Protocol：DNS-over-HTTPS (DoH)
IP Address：223.5.5.5
Host name (vhost+SNI)：dns.alidns.com
Hashes：= 固定证书链TBS哈希(Base64)值(获取方法如下)
Path：/dns-query
DNSSEC：勾选 = 声明"该服务器做 DNSSEC校验"（如官方不支持则客户端可能因校验失败而拒绝解析）
No filter：勾选 = 声明" 223.5.5.5 不做广告/恶意域名拦截,属实"
No logs：勾选 = 声明"官方不记录用户查询日志" (注意这只是服务方自声明,无法技术验证)</code></pre><p><strong>固定证书链TBS哈希(Base64)值获取方法</strong>(纯 PowerShell整段粘贴运行)</p><pre class="tiptap-codeblock"><code>function Get-TbsHash([byte[]]$der) {
    $b1 = $der[1]; $hdr = 2
    if ($b1 -band 0x80) {
        $n = $b1 -band 0x7F; $len = 0
        for ($i = 1; $i -le $n; $i++) { $len = $len * 256 -bor $der[1 + $i] }
        $hdr = 2 + $n
    }
    $tbs = New-Object byte[] $len
    [Array]::Copy($der, $hdr, $tbs, 0, $len)
    [Convert]::ToBase64String([Security.Cryptography.SHA256]::Create().ComputeHash($tbs))
}
$tcp = [Net.Sockets.TcpClient]::new('223.5.5.5', 443)
$ssl = [Net.Security.SslStream]::new($tcp.GetStream(), $false, { $true })
$ssl.AuthenticateAsClient('dns.alidns.com')
$leaf = [Security.Cryptography.X509Certificates.X509Certificate2]::new($ssl.RemoteCertificate)
$chain = [Security.Cryptography.X509Certificates.X509Chain]::new()
$chain.ChainPolicy.RevocationMode = 'NoCheck'
$null = $chain.Build($leaf)
$i = 0
foreach ($el in $chain.ChainElements) {
    $c = $el.Certificate
    "[$i] $($c.Subject)"
    "    TBS-SHA256(B64): $(Get-TbsHash $c.RawData)"
    $i++
}
$ssl.Dispose(); $tcp.Dispose()</code></pre><p><strong>输出内容</strong></p><pre class="tiptap-codeblock"><code>[0] CN=*.alidns.com, O=阿里巴巴（中国）网络技术有限公司, L=杭州市, S=浙江省, C=CN   
    TBS-SHA256(B64): kMYvIGb3/VnUdEkN6rwFwbAlFRU/q4fFYT3Xx49N60c=    ← 叶子
[1] CN=GlobalSign ECC OV SSL CA 2018, O=GlobalSign nv-sa, C=BE
    TBS-SHA256(B64): pFkaef4zAhHH8UocKNRLPONbxQDPXIlXiEpmNZew6MU=     ← 中间 CA
[2] CN=GlobalSign, O=GlobalSign, OU=GlobalSign ECC Root CA - R5
    TBS-SHA256(B64): jM7HL/+a7Dm6Daks4JlCbc1kZulncVZMnGdGGv8MzxI=   根证书(一般不用pin)</code></pre><p><strong>输出结果：</strong>把 [1] 的 Base64 串填进 DNS Stamp calculator 的 Hashes 栏即可。也可以把 [0] 和 [1] 两个都填(英文逗号分隔)规范支持多哈希,客户端命中任意一个即通过。</p><pre class="tiptap-codeblock"><code>sdns://AgYAAAAAAAAACTIyMy41LjUuNYAADmRucy5hbGlkbnMuY29tCi9kbnMtcXVlcnk</code></pre><p><strong>最后的务实建议</strong><br>pin 中间 CA 而非叶子：你的直觉是对的，中间 CA（GlobalSign）的更换频率远低于叶子的年度续期。但 GlobalSign 哪天换中间 CA（如升级为新的 CA 证书）时，stamp 一样会失效，需重新生成。<br>对个人日常使用，留空 Hashes 是完全够安全的选择：标准 CA 校验 + TLS 1.3 已经覆盖了绝大多数威胁场景。证书固定主要是对抗“CA 体系被攻破”这类小概率高影响事件，代价是维护负担。</p>
