<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nginx on siteTitle</title><link>https://blog.yuime.moe/tags/nginx/</link><description>Recent content in Nginx on siteTitle</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://blog.yuime.moe/tags/nginx/index.xml" rel="self" type="application/rss+xml"/><item><title>基于私有证书链和 mTLS 的私人信任体系</title><link>https://blog.yuime.moe/posts/private-ca-mtls/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0800</pubDate><guid>https://blog.yuime.moe/posts/private-ca-mtls/</guid><description>&lt;p&gt;传输层安全（Transport Layer Security, TLS）基本是现代互联网的基石了，像 HTTPS 的全称就是 HTTP over TLS。TLS 中的信任体系基于 x509 证书链，通常情况下，仅服务端发送证书，并由客户端进行验证。而 mTLS (Mutual TLS) 则是客户端和服务器端都发送证书，并进行双向验证，基于 mTLS 可以实现对客户端的身份认证，并实现现代密码学级的安全性。&lt;/p&gt;
&lt;p&gt;然而大部分公开服务都没有使用 mTLS，而是使用传统的用户名 + MFA，在这一模型中，用户名用于身份识别，而 MFA 用于验证用户的身份。mTLS 本身也可以作为 MFA 的认证手段之一，但由于其配置复杂极少用于公开服务中，同时由于应用场景少未受到广泛支持。&lt;/p&gt;
&lt;p&gt;私有服务的安全模型相对于公开服务的一大优势就是允许系统的隔离性，邮箱、短信验证码等依赖于外部服务，这会破坏系统的私有性，而 TOTP 虽然可以做到隔离，但实际应用中通常基于第三方 APP。对于私有服务乃至个人服务，我自身作为唯一用户，完全无需考虑用户的认知负担，mTLS 反而成为最合适的认证方式之一。基于私有 CA 建立的客户端证书链则是严格限制了系统的边界，更高的私有性本身也就意味着更高的安全性。&lt;/p&gt;
&lt;h2 id="证书链构建"&gt;证书链构建&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;想法是好的，但到工程落地还是有一定的距离，在这套系统设计的过程中也包括了很多试错，因此大部分流程直接基于 openssl cli。&lt;/em&gt;&lt;/p&gt;




&lt;style&gt;
 :root {
 --warning-color: #de3636;
 }

 .notice {
 margin-block: 1em 1em;
 border-left-width: 0.4rem;
 border-left-style: solid;
 }

 .notice-title {
 font-weight: 700;
 margin-bottom: 0.5em;
 }

 .notice {
 padding: 1em 1.5em;
 }

 .notice-body p:first-child {
 margin-block-start: 0;
 }

 .notice-body p:last-child {
 margin-block-end: 0;
 }

 .notice-body code {
 color: var(--text-color)
 }

 .notice-icon {
 width: 1em;
 height: 1em;
 margin-right: 0.4em;
 }

 
 .notice.tip {
 border-left-color: #79cf79;
 background-color: #79cf791f;
 }

 .notice-title.tip {
 color: #79cf79;
 }

 
 .notice.note {
 border-left-color: #58acf0;
 background-color: #58acf01f;
 }

 .notice-title.note {
 color: #58acf0;
 }

 
 .notice.warning {
 border-left-color: #de3636;
 background-color: #de36361f;
 }
 
 .notice-title.warning {
 color: #de3636;
 }

 
&lt;/style&gt;

&lt;div class="notice tip"&gt;
 &lt;div class="notice-title tip"&gt;
 提示
 &lt;/div&gt;
 &lt;div class="notice-body tip"&gt;
 虽然在一些内网服务等无公共域名的场景中也需要服务端证书的构建，但本文主要讨论客户端证书的问题。
 &lt;/div&gt;
&lt;/div&gt;






&lt;div class="notice tip"&gt;
 &lt;div class="notice-title tip"&gt;
 提示
 &lt;/div&gt;
 &lt;div class="notice-body tip"&gt;
 对于一部分常用算法，openssl 给出了别名，但本文会尽量避免使用以提高通用性，有需要建议以帮助信息和文档为准。
 &lt;/div&gt;
&lt;/div&gt;


&lt;h3 id="确定签名算法"&gt;确定签名算法&lt;/h3&gt;
&lt;p&gt;这一步本身还是很重要的，但通常会被忽略，在网上找到的大部分教程也是基于 RSA 算法。不得不说 RSA 算法确实经典，但其性能和安全性已经落后了，基本上直接 pass。比较主流的方案是基于椭圆曲线算法，如 ECDSA 和 Ed25519，或是拥抱未来使用更先进的 SLH-DSA 和 MLDSA 等 PQC 算法（已受 openssl 支持）。&lt;/p&gt;</description></item><item><title>关于最近的站点迁移</title><link>https://blog.yuime.moe/posts/site-migration/</link><pubDate>Fri, 29 May 2026 00:00:00 +0800</pubDate><guid>https://blog.yuime.moe/posts/site-migration/</guid><description>&lt;p&gt;前两天把本站从 GitHub Pages 迁移到了个人服务器上，顺便修了一波 bug 并进行勘误。要说最根本的动机还是 GitHub Action 构建流程耗时太长，每次都要重新建立构建环境，Hugo 快速构建的优势完全没有发挥出来，同时 GitHub Pages 也不能像 Nginx 那样进行更深层次的定制（突然想起来之前摸过的 i18n for 404，好像可以再重新加回来了，&lt;del&gt;虽然本站大部分内容都没有被翻译&lt;/del&gt;）。&lt;/p&gt;
&lt;p&gt;大部分技术框架都没有变，只是前端服务从 GitHub Pages 迁移到了 Nginx，服务器上用 Nginx 跑了些私有服务的反向代理，就顺便把本站也搬过来了。个人服务的私有性基于 mTLS + 私有 CA，这两天应该会单独写一篇讲一下。&lt;/p&gt;
&lt;h2 id="关于站点配置"&gt;关于站点配置&lt;/h2&gt;
&lt;p&gt;迁移后需要解决两个问题：一是证书配置，二是自动化构建部署流程。个人服务一开始打算用私有证书，之前在进行内网服务开发的时候给 *.internal 域名签过一套（私有域名本身也不可能拿到公共 CA 签名），直接把脚本搬过去就可以用。但考虑到域名下可能存在公开服务，最后就选择了 Let&amp;rsquo;s Encrypt + certbot 的方案。&lt;/p&gt;
&lt;h3 id="配置服务端证书"&gt;配置服务端证书&lt;/h3&gt;
&lt;p&gt;首先需要确保域名已解析到服务器 IP，由于修改记录可能需要等待一段时间生效（主要是等待 DNS 间同步），建议这一步在环境准备前进行，在等待生效的过程中再去配置环境。&lt;/p&gt;
&lt;p&gt;我的服务器环境是 Ubuntu 24.04.4 LTS，配置过程以此为例，其他发行版可能存在细微差异。&lt;/p&gt;
&lt;p&gt;安装 certbot 和 nginx 插件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install certbot python3-certbot-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装证书前先完成 Nginx http 配置，安装证书时插件会自动配置 https。&lt;/p&gt;




&lt;style&gt;
 :root {
 --warning-color: #de3636;
 }

 .notice {
 margin-block: 1em 1em;
 border-left-width: 0.4rem;
 border-left-style: solid;
 }

 .notice-title {
 font-weight: 700;
 margin-bottom: 0.5em;
 }

 .notice {
 padding: 1em 1.5em;
 }

 .notice-body p:first-child {
 margin-block-start: 0;
 }

 .notice-body p:last-child {
 margin-block-end: 0;
 }

 .notice-body code {
 color: var(--text-color)
 }

 .notice-icon {
 width: 1em;
 height: 1em;
 margin-right: 0.4em;
 }

 
 .notice.tip {
 border-left-color: #79cf79;
 background-color: #79cf791f;
 }

 .notice-title.tip {
 color: #79cf79;
 }

 
 .notice.note {
 border-left-color: #58acf0;
 background-color: #58acf01f;
 }

 .notice-title.note {
 color: #58acf0;
 }

 
 .notice.warning {
 border-left-color: #de3636;
 background-color: #de36361f;
 }
 
 .notice-title.warning {
 color: #de3636;
 }

 
&lt;/style&gt;

&lt;div class="notice note"&gt;
 &lt;div class="notice-title note"&gt;
 注意
 &lt;/div&gt;
 &lt;div class="notice-body note"&gt;
 插件仅会修改 sites-available 下的配置，不会处理 conf.d 下的内容。
 &lt;/div&gt;
&lt;/div&gt;


&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;server {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;listen 80;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;server_name blog.yuime.moe;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;index index.html index.htm;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;location / {&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;alias /var/www/blog/;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;autoindex on;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行 certbot 安装证书：&lt;/p&gt;</description></item></channel></rss>