<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TLS &#8211; 编程技术记录</title>
	<atom:link href="https://blog.z6z8.cn/tag/tls/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.z6z8.cn</link>
	<description>世界你好!</description>
	<lastBuildDate>Wed, 10 Dec 2025 02:31:25 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>TLS证书签发流程</title>
		<link>https://blog.z6z8.cn/2025/12/10/tls%e8%af%81%e4%b9%a6%e7%ad%be%e5%8f%91%e6%b5%81%e7%a8%8b/</link>
					<comments>https://blog.z6z8.cn/2025/12/10/tls%e8%af%81%e4%b9%a6%e7%ad%be%e5%8f%91%e6%b5%81%e7%a8%8b/#respond</comments>
		
		<dc:creator><![CDATA[holdsky]]></dc:creator>
		<pubDate>Wed, 10 Dec 2025 02:26:48 +0000</pubDate>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[TLS]]></category>
		<category><![CDATA[证书]]></category>
		<guid isPermaLink="false">https://blog.z6z8.cn/?p=1524</guid>

					<description><![CDATA[签发类型 根据签发机构类型，TLS证书签发可以划分为两种： 公信CA（Certificate Authorit [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>签发类型</h1>
<p>根据签发机构类型，TLS证书签发可以划分为两种：</p>
<ul>
<li><strong>公信CA（Certificate Authority）签发的证书</strong>（如DigiCert、Let’s Encrypt、Sectigo等）</li>
<li><strong>企业内部私有CA签发的证书</strong>。</li>
</ul>
<p>公信CA签发与企业内部私有CA签发，两者的区别是公信力不同。一般情况下，互联网环境不应信任企业内部私有CA签发的证书。</p>
<p>下面主要详细说明最常见的<strong>公信CA签发域名验证（DV）、组织验证（OV）、扩展验证（EV）证书的过程</strong>，以及全网最流行的免费证书Let’s Encrypt为例的自动化流程。</p>
<h1>公信CA签发证书的通用流程（DV/OV/EV）</h1>
<ol>
<li>
<p><strong>生成CSR（Certificate Signing Request，证书签名请求）</strong>  </p>
<ul>
<li>在你的服务器上首先生成一对密钥：私钥（private key）和公钥（public key）。  </li>
<li>使用私钥生成CSR文件，CSR里包含了：
<ul>
<li>域名（Common Name 或 SAN 列表）  </li>
<li>组织信息（OV/EV证书需要）  </li>
<li>公钥  </li>
<li>国家、省份、城市、公司名称等（OV/EV需要）  </li>
</ul>
</li>
<li>常用命令（OpenSSL）：
<pre><code class="language-bash">openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr</code></pre>
</li>
</ul>
</li>
<li>
<p><strong>选择CA并提交申请</strong>  </p>
<ul>
<li>登录CA官网（或通过ACME协议自动化），选择证书类型（DV/OV/EV）、有效期。  </li>
<li>上传CSR（或者有些CA让你直接在网页填写信息后帮你生成）。</li>
</ul>
</li>
<li>
<p><strong>域名控制权验证（DCV，Domain Control Validation）</strong><br />
这是所有公信证书都必须完成的步骤，证明你确实控制这个域名。常见三种方式：</p>
<ul>
<li><strong>HTTP验证</strong>（最常见）：CA给你一段随机token，你需要在域名下 <code>.well-known/acme-challenge/</code> 路径放一个特定文件<br />
示例：<a href="http://yourdomain.com/.well-known/acme-challenge/xxxxxx">http://yourdomain.com/.well-known/acme-challenge/xxxxxx</a></li>
<li><strong>DNS验证</strong>：CA给你一段TXT记录，你需要在域名DNS管理面板添加 _acme-challenge.yourdomain.com TXT &quot;xxxxxx&quot;</li>
<li><strong>Email验证</strong>（较少用）：给域名whois邮箱或管理员邮箱（如admin@、webmaster@）发邮件，点链接确认</li>
</ul>
<p>DV证书只做这一步；OV/EV还要额外验证组织合法性。</p>
</li>
<li>
<p><strong>（OV/EV专属）组织信息验证</strong>  </p>
<ul>
<li>核实公司工商注册信息（通过第三方数据库如Dun &amp; Bradstreet）  </li>
<li>核实营业执照、法人身份  </li>
<li>电话回访确认申请人身份和授权  </li>
<li>验证域名管理权归属公司（whois + 额外证明文件）</li>
</ul>
</li>
<li>
<p><strong>CA签发证书</strong>  </p>
<ul>
<li>CA用自己的中间证书或根证书的私钥，对你的公钥+域名+有效期等信息进行签名，生成证书文件（.crt 或 .pem）  </li>
<li>同时会下发CA链证书（中间证书 bundle,参考下面附录）</li>
</ul>
</li>
<li>
<p><strong>下载并安装证书</strong>  </p>
<ul>
<li>你把证书、公钥、私钥安装到Web服务器（Nginx/Apache/IIS等）  </li>
<li>重启服务，以使证书生效</li>
</ul>
</li>
</ol>
<h2>最常见的自动化签发：Let’s Encrypt（ACME协议）</h2>
<p>Let’s Encrypt是目前全球使用量最大的免费CA，90天有效期，完全自动化。</p>
<p>常用客户端：Certbot、acme.sh、win-acme、lego 等。以acme.sh为例的全自动流程：</p>
<pre><code class="language-bash"># 1. 安装acme.sh
curl https://get.acme.sh | sh

# 2. 切换到Let’s Encrypt（默认就是）
acme.sh --set-default-ca --server letsencrypt

# 3. 签发证书（两种主流验证方式任选其一）

# 方法A：HTTP验证（需要80端口开放）
acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html

# 方法B：DNS验证（推荐，停机也可续期）
acme.sh --issue -d example.com --dns dns_cf   # 以Cloudflare为例，会自动调用API添加TXT记录

# 4. 安装证书到Nginx/Apache
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.key \
--fullchain-file /etc/nginx/ssl/example.cer \
--reloadcmd &quot;nginx -s reload&quot;</code></pre>
<p>整个过程几秒到几十秒完成，无需人工干预，每60天自动续期。</p>
<h1>证书签发后链路示意</h1>
<pre><code>用户浏览器 ←HTTPS→ 你的服务器（证书+私钥）
           ↑
        验证链：
你的证书 → CA中间证书 → 根证书（已预装在操作系统/浏览器中）</code></pre>
<h1>总结对比表</h1>
<table>
<thead>
<tr>
<th>类型</th>
<th>验证内容</th>
<th>签发时间</th>
<th>有效期</th>
<th>价格</th>
<th>典型用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>DV证书</td>
<td>仅域名控制权</td>
<td>几秒~几分钟</td>
<td>90天~1年</td>
<td>免费~几百元</td>
<td>普通网站、博客</td>
</tr>
<tr>
<td>OV证书</td>
<td>域名+组织合法性</td>
<td>1~5个工作日</td>
<td>1~2年</td>
<td>几百~几千元</td>
<td>企业官网、电商</td>
</tr>
<tr>
<td>EV证书</td>
<td>域名+严格组织验证</td>
<td>5~10个工作日</td>
<td>1~2年</td>
<td>千元以上</td>
<td>银行、金融、大型电商</td>
</tr>
<tr>
<td>Let’s Encrypt</td>
<td>域名控制权（DV）</td>
<td>几秒~1分钟</td>
<td>90天</td>
<td>完全免费</td>
<td>绝大多数互联网网站</td>
</tr>
</tbody>
</table>
<h1>附录：CA链证书</h1>
<p>简单来说：<strong>CA链证书就是“中间证书”</strong>，它是连接你的网站证书和浏览器信任的根证书之间的“桥梁”。如果没有正确安装链证书，用户访问你的HTTPS网站时就会报错（最常见的是“NET::ERR_CERT_AUTHORITY_INVALID”或“证书不受信任”）。</p>
<h2>为什么需要链证书？（信任链原理）</h2>
<p>为什么公信CA（包括Let’s Encrypt、DigiCert、GlobalSign等）<strong>坚决不直接用根证书私钥（Root Private Key）去签发终端用户证书</strong>？原因非常明确，一共就这几条，但每一条都是致命的：</p>
<table>
<thead>
<tr>
<th>理由</th>
<th>如果直接用根私钥签发终端证书，后果会怎样？</th>
<th>真实案例（已经发生过）</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. 根私钥一旦泄露，整个生态瞬间崩塌</td>
<td>攻击者可以随意给自己或任何人签发<strong>看起来100%合法</strong>的证书，伪造全球任意网站（银行、Google、苹果等），MITM攻击无法被发现。全球数亿网站同时不安全。</td>
<td>2011年 DigiNotar（荷兰CA）根私钥被伊朗黑客盗取 → 伪造了Google、Yahoo、WordPress等500+证书 → 整个CA直接破产，被所有浏览器永久拉黑。<br />2015年 Symantec不当签发测试证书 → 根信任被Chrome逐步移除。</td>
</tr>
<tr>
<td>2. 根私钥必须永久离线，日常无法使用</td>
<td>根私钥通常保存在<strong>物理保险柜 + HSM硬件安全模块 + 多方仪式</strong>中，启动一次需要多位高管同时到场、插多把实体钥匙。根本不可能每天拿来签发几十万张证书。</td>
<td>Let’s Encrypt的根ISRG Root X1从2015年生成后，私钥就再也没有在联网设备上出现过。</td>
</tr>
<tr>
<td>3. 根证书撤销几乎不可能</td>
<td>如果根被污染，唯一办法是让所有浏览器和操作系统<strong>永久移除这个根</strong>，代价极其高昂（用户需要升级系统/浏览器）。而中间证书被污染，只需要撤销那一个中间证书就行，影响面小1000倍。</td>
<td>2024年有人发现某个小CA的中间证书被滥用，浏览器只撤销了那张中间证书，用户几乎无感知。</td>
</tr>
<tr>
<td>4. 可以灵活撤销和轮换</td>
<td>中间证书可以1~5年更换一次（Let’s Encrypt中间证书就换过好几次），根证书却要用20~30年。出了问题只换中间就行，不影响根的长期信任。</td>
<td>DigiCert、GlobalSign每年都会轮换若干中间证书，就是为了降低风险。</td>
</tr>
<tr>
<td>5. 符合国际标准和浏览器强制要求</td>
<td>Baseline Requirements（CA/Browser Forum规定）和所有主流浏览器（Chrome、Firefox、Safari、Edge）<strong>明确禁止</strong>根私钥直接签发终端实体证书，违反者直接除根。</td>
<td>任何被发现直接用根签终端证书的CA，会在几天内被所有浏览器除根（等于商业死亡）。</td>
</tr>
</tbody>
</table>
<p>所以现代公信CA为了安全，<strong>绝不直接用根证书私钥去签发终端用户证书</strong>，而是采用分层结构：</p>
<pre><code>根证书（Root CA）
    └── 中间证书1（Intermediate CA）   ← CA用根私钥签发
            └── 中间证书2（Intermediate CA）   ← 用中间1签发
                    └── 你的网站证书（Leaf Certificate） ← 用中间2签发</code></pre>
<ul>
<li>根证书：预装在操作系统和浏览器里（DigiCert、GlobalSign、Let’s Encrypt的根叫ISRG Root X1等），数量很少，私钥离线保存在保险柜里，几乎永不使用。</li>
<li>中间证书：CA用根私钥签发的证书，中间证书的私钥才真正用来签发你的网站证书。</li>
<li>你的网站证书（叶子证书）：只包含你的域名和公钥。</li>
</ul>
<p>浏览器验证证书时会沿着这条链一层层往上验证，直到找到自己信任的根证书为止。</p>
<h2>实际拿到的证书文件通常有这几种</h2>
<ol>
<li>
<p><strong>你的网站证书</strong>（也叫leaf证书、end-entity证书）<br />
文件名通常是：<code>yourdomain.crt</code>、<code>yourdomain.pem</code>、<code>certificate.crt</code></p>
</li>
<li>
<p><strong>链证书 / 中间证书（最重要的就是这个）</strong><br />
可能有1~3个中间证书串在一起，常见文件名：</p>
<ul>
<li><code>chain.crt</code>、<code>ca-bundle.crt</code>、<code>intermediate.crt</code>、<code>fullchain.pem</code></li>
</ul>
</li>
<li>
<p><strong>根证书</strong>（一般不需要你提供）<br />
浏览器自己有，不需要放在服务器上。</p>
</li>
</ol>
<h2>如何撤销中间证书</h2>
<p>中间证书（Intermediate CA）一旦被发现有安全问题、被滥用、私钥泄露、CA违规等，必须立即撤销。  </p>
<h3>谁有权力、谁来执行撤销？</h3>
<table>
<thead>
<tr>
<th>角色</th>
<th>职责</th>
</tr>
</thead>
<tbody>
<tr>
<td>发行该中间证书的根CA</td>
<td>决定是否撤销、生成CRL或OCSP</td>
</tr>
<tr>
<td>浏览器/操作系统厂商</td>
<td>Chrome、Firefox、Microsoft、Apple、Mozilla 决定是否接受并强制执行</td>
</tr>
<tr>
<td>CA/Browser Forum</td>
<td>制定最晚撤销期限（通常5~7天）</td>
</tr>
</tbody>
</table>
<h3>实际撤销的技术方式（都必须同时做）</h3>
<ol>
<li>
<p><strong>CRL（Certificate Revocation List，证书吊销列表）</strong>  </p>
<ul>
<li>根CA或上一级中间CA用自己的私钥签名一个列表，里面列出被撤销的证书序列号  </li>
<li>文件通常放在 <a href="http://crl.exampleca.com/xxx.crl">http://crl.exampleca.com/xxx.crl</a>  </li>
<li>缺点：体积大，浏览器很少真正下载检查（基本被淘汰）</li>
</ul>
</li>
<li>
<p><strong>OCSP（Online Certificate Status Protocol，在线证书状态协议）</strong>  </p>
<ul>
<li>实时查询：浏览器问 OCSP Responder：“序列号为12345的证书还好吗？”  </li>
<li>回应：Good / Revoked / Unknown  </li>
<li>现在是主流，所有正规CA都必须提供OCSP服务</li>
</ul>
</li>
<li>
<p><strong>OCSP Must-Staple（强制 stapling）</strong>  </p>
<ul>
<li>证书签发时就加上一个扩展，要求服务器必须在TLS握手中附带OCSP响应  </li>
<li>Let’s Encrypt、DigiCert 等主流CA默认都开启  </li>
<li>一旦中间证书被撤销，所有使用该中间证书签发的网站都会立刻变红锁（几小时内）</li>
</ul>
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.z6z8.cn/2025/12/10/tls%e8%af%81%e4%b9%a6%e7%ad%be%e5%8f%91%e6%b5%81%e7%a8%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TLS 1.3前向安全的通俗解释</title>
		<link>https://blog.z6z8.cn/2025/11/26/tls-1-3%e5%89%8d%e5%90%91%e5%ae%89%e5%85%a8%e7%9a%84%e9%80%9a%e4%bf%97%e8%a7%a3%e9%87%8a/</link>
					<comments>https://blog.z6z8.cn/2025/11/26/tls-1-3%e5%89%8d%e5%90%91%e5%ae%89%e5%85%a8%e7%9a%84%e9%80%9a%e4%bf%97%e8%a7%a3%e9%87%8a/#respond</comments>
		
		<dc:creator><![CDATA[holdsky]]></dc:creator>
		<pubDate>Wed, 26 Nov 2025 10:12:02 +0000</pubDate>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[TLS]]></category>
		<guid isPermaLink="false">https://blog.z6z8.cn/?p=1509</guid>

					<description><![CDATA[前向安全 前向安全（Forward Secrecy，简称 PFS）是 TLS（以及其他加密协议）中一个非常重要 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>前向安全</h1>
<p>前向安全（Forward Secrecy，简称 PFS）是 TLS（以及其他加密协议）中一个非常重要的安全属性，简单来说：<br />
“即使攻击者将来拿到了服务器的长期私钥（即证书私钥），也无法解密之前已经完成的所有 TLS 会话”<br />
这就是前向安全的核心意义：过去的通信记录永远是安全的，即使私钥彻底泄露。</p>
<p>前向安全在TLS 1.3中强制开启的，安全性由<strong>椭圆曲线离散对数问题（ECDLP）</strong>保障</p>
<h1>ECDH（椭圆曲线 Diffie-Hellman）最核心的数学原理</h1>
<p>一句话就能说清楚：<strong>“乘法可以随便做，除法几乎做不出来”</strong>  </p>
<p>我们用最常用、最直观的曲线 <strong>X25519 / Curve25519</strong> 来解释（TLS 1.3 里 90% 以上用的就是它）。</p>
<h4>1. 公共参数（全世界都一样）</h4>
<ul>
<li>选定一个安全的椭圆曲线：y² = x³ + 486662x² + x（模 2²⁵⁵-19）</li>
<li>选定一个基点（base point）G，一个固定的点，坐标是已知的：<br />
G = (9, 447…)（具体数字不重要，只要大家用同一个就行）</li>
</ul>
<h4>2. 双方各自生成临时私钥（就是随机数）</h4>
<ul>
<li>爱丽丝（Alice，客户端）随机选一个 256 bit 的整数作为私钥：<br />
a = 随机数（比如 3f1a…c2，绝对保密！）</li>
<li>鲍勃（Bob，服务器）也随机选一个 256 bit 的整数：<br />
b = 随机数（比如 7d2b…e9，绝对保密！）</li>
</ul>
<h4>3. 计算并公开“公钥”（其实就是把私钥乘以基点 G）</h4>
<ul>
<li>爱丽丝算出自己的临时公钥：<br />
A = a × G</li>
<li>鲍勃算出自己的临时公钥：<br />
B = b × G</li>
</ul>
<p>这一步叫<strong>标量乘法</strong>（scalar multiplication），很快就能算。</p>
<h4>4. 双方互换公钥（在网络上明文发送，没关系！）</h4>
<p>爱丽丝把 A 发给鲍勃<br />
鲍勃把 B 发给爱丽丝</p>
<h4>5. 双方各自再做一次标量乘法，得到共享秘密 Z</h4>
<ul>
<li>爱丽丝算：Z = a × B  </li>
<li>鲍勃算：  Z = b × A</li>
</ul>
<p>奇迹发生了：<br />
a × B = a × (b × G) = (a × b) × G<br />
b × A = b × (a × G) = (b × a) × G  </p>
<p>因为乘法交换律，a×b = b×a，所以两个 Z <strong>完全相等</strong>！</p>
<p>这就是共享秘密 Z（32 字节），<strong>网络上从来没有传输过 Z</strong>，攻击者只看到 A 和 B。</p>
<h4>6. 为什么攻击者算不出 Z？（数学陷阱）</h4>
<p>攻击者看到：</p>
<ul>
<li>G（公开）</li>
<li>A = a × G（公开）</li>
<li>B = b × G（公开）</li>
</ul>
<p>他想求 Z = a × b × G<br />
→ 必须先从 A 求出 a，或者从 B 求出 b<br />
→ 这就是<strong>椭圆曲线离散对数问题（ECDLP）</strong></p>
<p>目前人类最好的算法要花大约 2¹²⁸ 次运算才能破解 X25519（相当于 300 亿亿亿年），完全不可能。</p>
<p>这就是“乘法容易，除法几乎做不出来”的本质。</p>
<h4>超级简化的数字比喻（虽然现实不是素数乘法，但帮助理解）</h4>
<p>把椭圆曲线上的“点加”想象成普通乘法：</p>
<ul>
<li>G = 5（基点）</li>
<li>爱丽丝私钥 a = 7</li>
<li>鲍勃私钥 b = 13</li>
</ul>
<p>爱丽丝发：A = 5⁷ = 78125<br />
鲍勃发：B = 5¹³ = 1220703125  </p>
<p>爱丽丝算：78125¹³ = 4038967834731580443708050254247865495926816947758197784423828125<br />
鲍勃算：1220703125⁷ = 4038967834731580443708050254247865495926816947758197784423828125  </p>
<p>攻击者看到 78125 和 1220703125，想求出 7 或 13 ，也不容易。<br />
椭圆曲线只是把“指数”换成了“点加”，但数学难度被做得更高。</p>
<h4>总结：ECDH 全过程一句话</h4>
<ol>
<li>大家约定一个起点 G  </li>
<li>各自用自己的私钥（随机数）把 G “乘”很多次得到公钥，公开交换  </li>
<li>再把对方的公钥乘上自己的私钥，得到同一个共享秘密 Z  </li>
<li>因为离散对数难题，谁也反推不出对方的私钥 → Z 永远安全</li>
</ol>
<p>这就是 TLS 1.3 里每一次握手都能实现完美前向安全的数学根基。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.z6z8.cn/2025/11/26/tls-1-3%e5%89%8d%e5%90%91%e5%ae%89%e5%85%a8%e7%9a%84%e9%80%9a%e4%bf%97%e8%a7%a3%e9%87%8a/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
