做本地开发的时候,最烦的一件事就是浏览器那个红色警告页。你明明在写自己的项目,浏览器偏要跳出来说“您的连接不是私密连接”,尤其是碰到需要对接第三方登录回调、支付回调、或者 Service Worker 这类必须 HTTPS 的场景,真的是被卡得死死的。我以前也试过用 openssl 自己签证书,再手动导入系统信任区,结果 Chrome 和 Firefox 各自有各自的证书库,Windows 一套、macOS 一套、Android 又是一套,折腾半天最后还是放弃。
后来换了 mkcert,整个流程才算是真正顺了。这个工具说白了就干一件事:帮你在本地快速生成本机信任的 HTTPS 开发证书,一条命令装好根证书,再一条命令签出域名证书,浏览器、移动端、后端服务全部认账,开发环境瞬间干净。
这篇文章就围绕 mkcert 的命令文档和实际用法展开,带你搞清楚它每条命令是干嘛的、什么时候用、有哪些坑要避开,顺便把常见场景的配置过程也一并讲清楚。适合刚开始接触 HTTPS 开发环境的前端、后端、客户端工程师,也适合被证书问题折磨过的每一位开发者。
1. 为什么本地开发也需要一张“真”证书
很多人的第一反应是:本地开发要什么 HTTPS?接口全部走 localhost,又没有真实域名,签证书纯属自己给自己找事。这个想法在纯页面开发阶段确实没什么问题,但一旦项目复杂度上来,就会发现完全不是这么回事。
1.1 HTTPS 不是生产环境专属
先说最常见的一个场景:前端项目跑在 http://localhost:3000,后端接口走 http://localhost:8080,看起来一切正常。但如果你需要接入微信登录、支付宝支付、地图 SDK、音视频通话这类第三方服务,对方的回调地址必须要求 HTTPS,而且很多服务商根本不允许填写 http://localhost 这种地址,你只能填一个指向本机的域名,比如 dev.example.com。浏览器一访问,发现证书对不上,直接把你拦在门外。
另一个典型场景是 PWA(Progressive Web App)。Service Worker 是 PWA 的核心能力,但浏览器出于安全考虑,只在 HTTPS 环境下才允许注册 Service Worker。localhost 是个例外,可如果你需要在一台局域网服务器上做演示,或者用真机通过 IP 访问你的开发机,Service Worker 同样会被禁用。想完整地调试推送通知、离线缓存、后台同步这些能力,没有一张可靠的本地证书根本做不到。
还有一类是原生开发场景。Android 应用在调试时如果需要访问开发机上的 HTTPS 接口,或者 iOS 的 ATS(App Transport Security)限制下要访问自签名证书的服务,都会遇到证书信任问题。localhost 这种本机地址在移动端压根不存在,你要么部署到测试服务器,要么就得有一张能被设备信任的证书。
1.2 自签名证书为什么总是差一步
既然 HTTPS 能解决问题,那我自己用 openssl 生成一张自签名证书不就行了吗?技术上当然可以,但实际用起来每一步都在踩坑。
openssl 签证书的命令写法本身就很劝退,要先生成私钥,再生成 CSR,再写一个 SAN(Subject Alternative Name)配置文件,最后还要指定有效期。就算你把这些命令都背下来了,生成出来的证书装进系统之后,浏览器仍然会报“该证书并非来自安全证书颁发机构”或者 NET::ERR_CERT_AUTHORITY_INVALID。原因很简单:浏览器只信任那些已经在系统受信任列表里的根证书,你自己生成的证书没有经过任何受信任的 CA 签名,浏览器自然不认。
有同学会说,那我把它导进系统信任区不就行了。问题就出在这:Chrome 用的是操作系统证书库,Firefox 用自己的证书库,Android 和 Windows 的导入方式还不一样。你辛辛苦苦把这些全部配好,发现证书有效期只有一年,到期之后要重新走一遍整个流程。要是你换了台电脑,或者同事也想在本地跑同一个项目,所有步骤还得再来一遍。
这里真正缺的核心环节,就是“受信任的根证书”。你缺的不是一张域名证书,而是一个让操作系统和浏览器都认账的根证书体系。openssl 没有帮你解决这件事,mkcert 解决的恰恰就是这件事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. mkcert 的核心机制:本地 CA 与证书信任链
mkcert 这个工具本身不复杂,但你理解了它的工作原理之后再去看命令,就会发现每条命令都非常有针对性。这里先把机制讲清楚,后面再逐条拆命令。
2.1 它到底在本地做了什么
mkcert 做的第一件事,是在你机器上生成一个本地根证书(Root CA),这个根证书包含一对密钥:私钥留在本机,证书文件可以导出。用一句话概括就是:它让你的电脑自己变成了一个证书颁发机构。
然后你要做的,就是把这个根证书导入操作系统的受信任根证书列表。这一步做完之后,你的电脑就会无条件信任由这个根证书签发出来的所有子证书。紧接着 mkcert 再帮你签发具体的域名证书,浏览器校验时发现这张证书的签发者是你已经信任的那个根证书,整个信任链就通了,证书直接变成绿色状态。
这么说可能还是抽象,我举个生活化的例子。自签名证书就像你在小区门口随手捡了一个印章,然后给自己开了一张“居民证”,小区保安当然不认。mkcert 的做法是,你先去派出所把你自己的印章备案了,以后再拿这个印章开出来的任何证明,保安一看备案记录,直接就放行。mkcert 生成的根证书就是那个“备案记录”,而它签出的域名证书就是“居民证”。
2.2 install 命令:信任链的核心操作
mkcert 最重要的命令,其实只有两条。第一条是 mkcert -install。
bash复制mkcert -install
这条命令会自动完成两件事:
- 在本地生成根证书和私钥,存放在用户目录下的
~/.local/share/mkcert(Linux/macOS)或者%USERPROFILE%\AppData\Local\mkcert(Windows)里。 - 把证书导入当前操作系统的信任区,并自动更新证书存储。
执行完之后,你可以用 mkcert -CAROOT 查看根证书的具体存放路径。这个路径后续排错经常会用到,建议记一下。
bash复制mkcert -CAROOT
# 输出示例:/home/yourname/.local/share/mkcert
你会看到这个目录下有两个文件:rootCA.pem 和 rootCA-key.pem。前者是根证书,可以随便分发;后者是根证书的私钥,绝对不能泄露。谁拿到这个私钥,就意味着谁能以你本地 CA 的名义签发证书。
2.3 信任链到底是怎么校验的
这里顺便把证书信任机制说透一点,因为后面排查问题会非常有用。
浏览器在访问一个 HTTPS 站点时,会经历以下校验流程:
- 拿到服务器返回的证书,解析出签发者名称。
- 在系统的受信任根证书列表中查找这个签发者。
- 如果找到了,就用根证书里的公钥去验签域名的证书。
- 验证通过后,再检查证书里的域名和你访问的地址是否匹配,以及证书是否在有效期内。
mkcert 帮你搞定的是前三步,第 4 步需要你在签发证书时指定正确的域名。很多同学说 mkcert 签了证书但还是报错,大概率就是第 4 步出了问题,后面我会专门展开讲。
另外注意一点,mkcert -install 装的是根证书,但如果你在 Linux 环境下的浏览器(尤其是 Firefox)里访问,有可能出现仍然提示不受信任的情况。这是因为 Firefox 默认不读取系统证书库,而是使用自己的 cert9.db。mkcert 官方文档说明了对 Firefox 的特殊处理,但不同发行版和版本的行为差异挺大,后面会在排错部分单独说。
3. 高频命令逐条拆解:看懂 help 就够用了
mkcert 的命令并不多,官方 help 输出大概是下面这个样子:
bash复制Usage:
mkcert [flags]
mkcert [command]
Available Commands:
-client generate a certificate for client authentication
-ecdsa generate an ECDSA key instead of RSA
-pkcs12 generate a .p12 file instead of a .pem file
-csr generate a certificate signed by the local CA based on a CSR
-CAROOT print the CA root directory
-install install the local CA in the system trust store
-uninstall uninstall the local CA from the system trust store
-help help for mkcert
这里我把最常用的命令和参数整理成一张表,方便你查阅。
| 命令/参数 | 作用 | 典型场景 |
|---|---|---|
mkcert -install |
安装本地 CA 到系统信任区 | 首次使用,或换新设备 |
mkcert -uninstall |
从系统信任区卸载本地 CA | 不再需要使用本地证书,或准备彻底清理 |
mkcert example.com |
为指定域名生成证书 | 最常见的用法,一个或多个域名都行 |
mkcert -cert-file cert.pem -key-file key.pem |
指定证书和私钥输出文件名 | nginx、Node.js 等服务器需要指定文件路径 |
mkcert -pkcs12 |
生成 .p12 格式证书 |
Java 环境、Windows 服务需要 PKCS#12 格式 |
mkcert -ecdsa |
使用 ECDSA 密钥算法生成证书 | 对性能敏感或特定客户端要求 |
mkcert -client |
生成客户端认证证书 | 需要做 mTLS 双向认证的调试场景 |
mkcert -days 365 |
指定证书有效期天数 | 自定义有效期,默认 825 天 |
mkcert -csr |
基于已有 CSR 签发证书 | 已有证书请求,只需要本地 CA 签名的情况 |
3.1 最常用的证书生成命令
实际上平时用的最多的就是这条:
bash复制mkcert example.com "*.example.com" localhost 127.0.0.1 ::1
这条命令会为 example.com、*.example.com(通配符子域名)、localhost、127.0.0.1、IPv6 回环地址 ::1 同时生成一张证书。命令执行成功后,当前目录下会多出两个文件:
example.com+3.pemexample.com+3-key.pem
注意文件名的规则:域名和 IP 会按照 +N 的方式拼在证书名后面,N 就是除了第一个域名之外额外添加的地址数量。如果你对文件名有严格要求,就改用后面要说的 -cert-file 参数。
3.2 指定输出文件名的场景
默认生成的文件名虽然不会出错,但可读性确实不太行。在配置 nginx 或者 Node.js 服务时,通常需要你明确指定证书文件路径,这时候就用:
bash复制mkcert -cert-file /etc/ssl/dev-cert.pem -key-file /etc/ssl/dev-key.pem localhost 127.0.0.1
这组命令适用于任何需要“指定路径加载证书”的服务器软件。有些同学问为什么不直接在生成之后再 mv 文件,当然也可以,但 -cert-file 参数一次到位,省得后面手滑搞混证书和私钥的对应关系。
3.3 PKCS#12 格式与 Java 环境
如果你是 Java 开发,或者用的服务端框架只认 .jks / .p12 格式的证书,那就要用到 -pkcs12 参数:
bash复制mkcert -pkcs12 -cert-file keystore.p12 localhost 127.0.0.1
生成的 .p12 文件可以直接用 keytool 导入 JKS,也可以作为 Spring Boot 的 HTTPS 证书直接使用。需要注意,.p12 文件默认有一个密码保护,mkcert 的默认导出密码是 changeit。如果你打算把它用于生产环境,记得一定要改掉,并且不要把密码写死在代码里。
3.4 有效期参数:825 天的秘密
mkcert 默认签发的证书有效期是 825 天,差不多两年多一点。这是专门考虑过的设计:Apple 的 ATS 政策规定,2019 年之后签发的 TLS 证书有效期不能超过 825 天,否则 iOS 和 macOS 会直接拒绝信任。mkcert 默认值恰好卡在这个上限,目的就是让你的证书在苹果生态里也能正常工作。
如果你有特殊需求,可以用 -days 参数自行指定:
bash复制mkcert -days 30 localhost
30 天的 short-lived 证书比较适合临时调试环境,到期后强制轮换,反而更有安全意识。
3.5 ECDSA 与 RSA:选哪个
默认情况下 mkcert 生成的是 RSA 2048 位密钥,兼容性最好。如果你用 -ecdsa 参数,就会改用 ECDSA P-256 曲线密钥,特点是更小的密钥体积、更快的握手速度,但兼容性上偶尔会有老设备不支持的情况。
我的建议是:日常本地开发默认 RSA 就够了,不用折腾;如果是在做一些性能对比测试,或者你想模拟现代 HTTPS 的真实情况,可以生成 ECDSA 做对照。这不是一个必须决策的问题,别为了这点差异浪费太多时间。
3.6 客户端证书与 mTLS 调试
-client 这个参数用的人比较少,但一旦用到就会觉得它特别好使。它生成的证书是用于客户端身份认证的,在一个需要双向 TLS(mTLS)的调试场景里,比如你要连一个开启了客户端证书校验的网关或数据库,这个参数可以直接帮你造出测试用的客户端证书:
bash复制mkcert -client -pkcs12 -cert-file client.p12 localhost
生成的客户端证书 + 私钥文件,可以导入 Postman、curl、Java KeyStore,或者各种需要身份认证的测试工具里。省去了自己找 openssl 模板的麻烦。
3.7 从 CSR 签发:团队协作的高级玩法
现在假设你在一家公司,后端同学已经自己生成了私钥和 CSR 文件,但需要一个本地 CA 来签名。这种情况下你不需要问他拿私钥,只需要让他把 CSR 文件传给你,然后你执行:
bash复制mkcert -csr server.csr
mkcert 就会基于这个 CSR 签发一张受本地 CA 信任的证书。这种方式的好处是私钥全程不离开原持有者,安全边界清晰,适合团队协作时最小化私钥扩散。如果你的团队还没统一证书方案,可以先从 mkcert 的标准流程开始,等规模大了再过渡到这种模式。
4. 真实场景里的完整配置过程
命令拆完了,但不落到具体配置场景里,等于白看。这里选四个我经常用到、也最有代表性的场景,把完整步骤写出来。
4.1 本地 nginx 配 HTTPS 站点
nginx 是本地调试最常用的 Web 服务器之一。场景是:你本地跑了一个 dev.example.com 站点,想让浏览器通过 HTTPS 访问。
第一步,先在 hosts 文件里把域名指到本机:
bash复制# /etc/hosts 或 C:\Windows\System32\drivers\etc\hosts
127.0.0.1 dev.example.com
第二步,用 mkcert 签证书:
bash复制mkcert -cert-file /usr/local/etc/nginx/ssl/dev-cert.pem -key-file /usr/local/etc/nginx/ssl/dev-key.pem dev.example.com
第三步,nginx 配置:
nginx复制server {
listen 443 ssl;
server_name dev.example.com;
ssl_certificate /usr/local/etc/nginx/ssl/dev-cert.pem;
ssl_certificate_key /usr/local/etc/nginx/ssl/dev-key.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
需要特别提醒的坑:证书和私钥路径要写绝对路径,不然 nginx 启动时经常报找不到文件。另外,dev.example.com 一定要和 hosts 里配的域名完全一致,浏览器校验的就是证书 SAN 和 URL 域名是否匹配。
如果你的 nginx 机器和 mkcert 生成证书的机器不是同一台,得把 rootCA.pem 拷贝到目标服务器并导入信任区。这个后面单独讲。
4.2 Node.js 本地服务加载证书
Node.js 的 HTTPS 模块加载证书非常简单。假设你用的是 Express:
js复制const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello HTTPS');
});
const options = {
key: fs.readFileSync('./dev-key.pem'),
cert: fs.readFileSync('./dev.pem')
};
https.createServer(options, app).listen(3443, () => {
console.log('HTTPS server running at https://localhost:3443');
});
启动后浏览器访问 https://localhost:3443,证书状态是绿色的,控制台没有混合内容警告。这里有个小提示:Node.js 开发调试时,如果你用 http://localhost:3443 访问,服务会直接拒绝连接;如果访问 https://localhost:3443 报证书错误,先确认是不是首次启动后忘了刷新页面。
4.3 Spring Boot 的 HTTPS 配置
Java 生态的场景和上一节不同,因为它更常用 .p12 文件。过程分两步。
第一步,生成 PKCS#12 格式证书:
bash复制mkcert -pkcs12 -cert-file keystore.p12 localhost 127.0.0.1
第二步,在 application.yml 里配置:
yaml复制server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-type: PKCS12
key-store-password: changeit
然后启动 Spring Boot 应用,访问 https://localhost:8443。注意 .p12 的默认密码是 changeit,如果改过密码,上面的配置也要同步改。
4.4 移动端真机调试
如果你要把证书装到手机上,流程会稍微长一点。
Android 需要两步:
- 把
rootCA.pem传到手机,通过“设置 -> 安全 -> 加密与凭据 -> 安装证书”进行安装。 - 在应用的
network_security_config.xml里信任用户证书(默认情况下 Android 7.0 以上的应用不信任用户 CA,除非目标 SDK 版本和配置允许)。
xml复制<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>
别忘了在 AndroidManifest.xml 里引用这个配置:
xml复制<application android:networkSecurityConfig="@xml/network_security_config" ... />
iOS 则需要两步:
- 用 Safari 打开
http://<你的IP>/rootCA.pem下载证书。 - 到“设置 -> 通用 -> 关于本机 -> 证书信任设置”里把根证书开关打开。
如果签名和安装之后仍然不受信任,大概率是第二步没开完全信任开关。这个开关藏得比较深,很多人在这里卡了很久,实际上只要打开就通了。
4.5 抓包工具 Charles / mitmproxy 的证书配合
这个场景很多测试同学会关心。Charles 和 mitmproxy 在抓 HTTPS 包时都有自己的根证书,和 mkcert 其实没有直接关系。但如果你希望终端里的 Node.js 进程、Java 进程能正常访问经过代理抓包的 HTTPS 接口,就需要让这些进程也信任对应抓包工具的根证书。
实操经验是:抓包工具生成自己的根证书后,mkcert -install 不会自动装它,你要分别安装。如果只是浏览器抓包,浏览器装的抓包工具证书就够了;如果是后端接口联调,还得把抓包工具的 CA 证书导入 JDK 的 cacerts,这一步经常被忽略。
bash复制keytool -import -alias charles -file charles-ca.pem -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
5. 排错实录:我踩过的那些 mkcert 相关的坑
工具本身不复杂,但真正折磨人的往往是“证书生成了却仍然报错”的情况。下面整理几个我遇到的、也是社区里问得最多的问题。
5.1 浏览器仍然提示“该证书并非来自安全证书颁发机构”
场景:已经执行过 mkcert -install,浏览器打开本地站点仍然报 NET::ERR_CERT_AUTHORITY_INVALID。
排查步骤按照这个顺序来:
- 确认本机是否真的安装了根证书:
mkcert -CAROOT看看目录是否存在,再打开系统证书管理工具,搜索mkcert。 - 确认你访问的地址和证书里包含的域名是否一致。这一点很常见:你签的是
localhost,但访问却用了127.0.0.1。虽然两者都指向本机,但证书校验是按域名进行的,不一致就会失败。 - 如果你用的是 Firefox,需要额外确认
mkcert -install是否成功导入了 Firefox 的证书库。有的 Linux 发行版下 Firefox 使用独立证书库,mkcert 可能没有权限写入,或者 Firefox 版本较新之后行为有变化。解决办法是手动打开 Firefox 设置 -> 隐私与安全 -> 证书 -> 查看证书 -> 证书颁发机构,导入rootCA.pem并勾选信任。 - 确认系统时间是否正确。证书校验会检查当前时间是否在证书有效期内,时间偏差超过一定范围,即使证书正常也会被判定为无效。
5.2 签了通配符证书却还是报错
很多同学在本地联调时会签 *.example.com,然后访问 a.example.com 正常,但访问 a.b.example.com 却报错。原因在于通配符只匹配一级,*.example.com 能覆盖 a.example.com,但不能覆盖 a.b.example.com。这个和 mkcert 无关,是 TLS 通配符的通用规则。需要覆盖多级子域名,就把它们全部列在生成命令里。
bash复制mkcert "*.example.com" "*.a.example.com" "*.b.example.com" localhost 127.0.0.1
5.3 使用 -pkcs12 时密码不正确
生成 .p12 后,导入 keytool 或者 Java 服务时提示密码错误。第一反应是检查你是不是用默认 changeit。如果你改过密码,或者是从某个教程里复制来的命令,可能密码不是默认值。可以用 keytool 查看:
bash复制keytool -list -v -keystore keystore.p12 -storetype PKCS12
会提示输入密码,默认是 changeit。如果还是不对,那就重新生成一个并立即测试,不要用旧文件反复猜测。
5.4 换了电脑后证书失效
mkcert 的根证书、私钥和域名证书都存在本机。如果你换了台电脑,新机器上执行 mkcert -install 会生成一套全新的根证书,之前签发的证书在新机器上不受信任。解决办法有两个:
- 在新机器上重新执行一次
mkcert -install,然后重新签域名证书。 - 把旧机器的
rootCA.pem和rootCA-key.pem拷贝到新机器,覆盖默认目录下的文件,再执行mkcert -install。这样新机器会信任同一套根证书,所有旧证书仍然有效。
第二种方式适合团队内多人共用同一套证书体系的情况。我曾经在一个团队里见过大家各自用自己的 mkcert 根证书,结果互相访问对方机器上的服务时全是证书报错。后来统一拷贝了一份根证书到所有人的机器上,问题才彻底消失。这里需要提醒的是:拷贝的根证书私钥要当作敏感信息管理,只在受信任的网络和同事间共享,不要放到公开仓库里。
5.5 mkcert 证书能不能用于生产环境
明确结论:不能。mkcert 生成的根证书只存在于你本地,不会被任何浏览器或操作系统默认信任。公网用户访问你的站点时,浏览器里没有你的根证书,自然无法验证证书有效。
生产环境必须使用受信任的 CA 签发的证书,比如 Let’s Encrypt、阿里云免费 SSL、腾讯云免费 SSL 等等。mkcert 解决的是“本地开发环境与生产环境一致性”的问题,也就是说,你本地用 mkcert 模拟 HTTPS,部署到生产时换成正式证书,两边行为一致。这个定位要搞明白。
5.6 证书有效期到了之后要做什么
mkcert 的默认证书有效期是 825 天,所以平时很少遇到过期问题。但如果用了 -days 自定义了短有效期,到期后需要重新生成证书,并替换服务器上的证书文件。这里有一个容易忽略的点:同一个域名重新签发后,文件名可能不一样(例如包含过期时间戳),nginx 等服务器需要同步更新配置里的路径。
根证书没有过期时间,它是 CA 自己的有效期,通常很长。但如果你使用 macOS 并把系统升级到了大版本,偶尔会出现系统证书信任列表的 trust settings 被重置的情况,重新执行一次 mkcert -install 就能恢复。
6. 我的日常用法与自动化补充
最后分享一下踩平了坑之后,我现在是怎么在日常开发里用 mkcert 的。
6.1 一条命令搞定常见本地域名
我习惯在项目的 scripts/dev-cert.sh 里放一段脚本,比如:
bash复制#!/usr/bin/env bash
mkcert -install
mkcert \
-cert-file certs/local-cert.pem \
-key-file certs/local-key.pem \
localhost \
127.0.0.1 \
"*.test" \
"*.local" \
dev.example.com
以后每次 clone 新仓库,第一件事就是跑一下这个脚本,HTTPS 环境直接就位。脚本里 "*.test" 和 "*.local" 这种通配域名非常适合本地用,不冲突也不用改 hosts 就能解析到 127.0.0.1(需要配合 dnsmasq 或者浏览器特殊的 DNS 解析规则,不过一般本地项目用 localhost 就够了)。
6.2 关于名字和文件存放的小建议
证书文件本身是文本格式,不含敏感密钥的证书可以随便提交到代码仓库;但私钥文件不行,它等同于你域名证书的钥匙,泄露后别人可以冒充你的 HTTPS 服务。在我的项目里,.gitignore 一定会忽略 *-key.pem、*.p12,只保留证书文件和生成脚本。这样同事拉代码后跑一下脚本就能获得自己本机的私钥,安全边界也清晰。
6.3 我处理“证书信任机制”的心法
如果你接触过的项目多了,会发现很多证书问题的本质都不是“命令不会用”,而是“信任链没搞通”。mkcert 的价值恰恰是把信任链中“根证书信任”这个最难的部分自动化了,剩下的域名匹配、有效期校验、格式转换就是常规操作。
我在实际使用中还有一个体会:尽量让本地环境和使用工具尽量贴近生产环境,这样就不会出现“本地好好的,一到测试环境就崩”的情况。比如本地用 nginx 做 HTTPS 反代,测试环境也保持同样的 nginx 配置,只是证书换成正式 CA 签发的。mkcert 正好可以让本地和生产的证书类型、协议版本保持一致,减少环境差异带来的隐性 bug。
6.4 说给新手的最后一句话
如果你正在被浏览器那句“您的连接不是私密连接”折磨,不要继续手写 openssl 命令折磨自己了。先把 mkcert 装好,mkcert -install 敲一次,再按需要签一张证书,把密钥路径填到你的服务器配置里。整个过程熟练之后不会超过五分钟。等你在本地把 HTTPS 弄顺了,再回头去看 openssl、证书机制、TLS 握手这些东西,会发现思路清晰得多。
工具是用来解放生产力的,不是用来制造焦虑的。mkcert 这个工具确实做到了这一点。
