1 背景
在本地配置了虚拟域名并为其配置了ssl证书,但仍显示“Not Secure”:

2 方案
这种方式可在本机和局域网内彻底消除警告,使用 mkcert 生成本地信任的证书(零警告,最方便)。
步骤(Windows / macOS / Linux 笔记本都适用):
下载 mkcert
https://github.com/FiloSottile/mkcert/releases
选对应系统的最新版本(windows → .exe,mac → darwin,linux → linux-amd64)安装 mkcert 的根证书(只需做一次)
把下载的文件重命名为mkcert,然后双击执行或命令行运行:# Windows (cmd 或 PowerShell) mkcert.exe -install # macOS / Linux chmod +x mkcert ./mkcert -install这步会把 mkcert 自己的根 CA 加入到系统和浏览器的信任列表。
mkcert 的根 CA 文件通常位于:
# MacOS ~/Library/Application Support/mkcert/rootCA.pem # Linux ~/.local/share/mkcert/rootCA.pem为 IP 或域名生成证书(支持 192.168.0.190 + localhost)
mkcert 192.168.0.190 localhost 127.0.0.1 ::1会生成两个文件:
- 192.168.0.190+localhost+127.0.0.1.pem ← 证书
- 192.168.0.190+localhost+127.0.0.1-key.pem ← 私钥
也可以
更推荐的替代做法(大多数本地开发场景下更省事)
4.1. 为
多个不同的域名分别生成证书mkcert openclaw.einscat.local localhost 127.0.0.1 ::1 mkcert mylaptop.local localhost 127.0.0.1 ::1 mkcert mylaptop2.local localhost 127.0.0.1 ::1 mkcert project1.dev localhost 127.0.0.1 ::1 mkcert api.backend.local localhost 127.0.0.1 ::1为“每个域名单独生成一张证书”的优缺点:
优点:
- 每个项目/域名有自己独立的证书文件,管理清晰(想删掉某个项目的证书就直接删对应文件)。
- 证书文件小,包含的 SAN(Subject Alternative Names)少,理论上解析/验证稍快(实际差别微乎其微)。
- 适合项目之间完全隔离、或未来可能把证书挪到不同服务器的情况。
缺点:
- 如果你有 10 个项目,就要生成 10 对证书文件,文件夹会变乱。
- 如果以后加新域名,必须再跑一次 mkcert 命令。
- 所有证书都共用同一个 mkcert 根 CA(这点没问题,根只安装一次)。
每次执行都会生成一对独立的证书文件(.pem 和 -key.pem),文件名会根据你输入的第一个域名来命名(加上后续的 +N 后缀表示额外名称数量)。
4.2. 一次性把所有常用域名写进同一张证书(推荐,如果你项目不多或域名可预知)
mkcert \ mylaptop.local mylaptop2.local \ project1.dev project2.dev api.backend.local admin.test \ localhost 127.0.0.1 ::1- 生成的文件:
mylaptop.local+7.pem和mylaptop.local+7-key.pem(第一个域名决定文件名)。 - 这张证书同时对上面所有域名有效。
- 以后加新域名 → 重新生成一次(1 分钟),替换旧文件即可。
- 反向代理(如 Caddy/Nginx)里统一用这一对 pem 文件,所有域名都走同一个证书。
4.3. 用通配符(wildcard)一张证书搞定一类域名(如果你的域名有规律,比如都用 .local 结尾)
mkcert "*.local" "localhost" "127.0.0.1" "::1" mkcert "openclaw.einscat.local" "localhost" "127.0.0.1" "::1"- 生成:
_wildcard.local.pem和_wildcard.local-key.pem - 有效域名:任何 xxx.local(如 mylaptop.local、api.local、frontend.local 等),但不支持二级以上通配(比如不能同时通配 *.sub.local)。
- 适合大量同级子域名项目,这是目前本地开发最干净的做法之一。
注意:mkcert 不支持
*.local.*这种多级通配(证书规范限制),最多一级 wildcard。实际选择建议(根据你的场景)
你的项目数量/域名模式 推荐方式 生成命令示例 文件数量 维护频率 2–5 个,完全不相关的域名 每个域名单独一张证书 如你写的,分别 mkcert 多 中 5–15 个,域名可列出来 一张证书包含所有域名 mkcert domain1 domain2 domain3 … localhost … 1 对 低 很多项目,都以 .local / .test 结尾 通配符一张证书 mkcert “*.local” localhost 127.0.0.1 ::1 1 对 极低 极多且动态(随时加新子域名) 通配符 + Caddy/Nginx 反代 同上 + hosts 或本地 DNS 1 对 最低 如何在本地代码中使用生成的证书?在服务端配置使用这两个文件开启 HTTPS(端口一般改成 443 或保持 18789),生成 .pem 文件只是第一步,需要让你的 Web 服务(如 Nginx, Node.js 或 Vite)去读取这两个文件。
示例(根据你用的后端不同):
Node.js (https.createServer)
const https = require('https'); const fs = require('fs'); https.createServer({ key: fs.readFileSync('192.168.0.190+localhost+127.0.0.1-key.pem'), cert: fs.readFileSync('192.168.0.190+localhost+127.0.0.1.pem') }, app).listen(18789);Vite (前端开发)
// 在 vite.config.js 中配置: import { defineConfig } from 'vite'; import fs from 'fs'; export default defineConfig({ server: { https: { key: fs.readFileSync('./openclaw.einscat.local+3-key.pem'), cert: fs.readFileSync('./openclaw.einscat.local+3.pem'), }, host: 'openclaw.einscat.local', // 确保域名匹配 }, });Nginx
server { listen 18789 ssl; server_name 192.168.0.190; ssl_certificate /path/to/192.168.0.190+localhost+127.0.0.1.pem; ssl_certificate_key /path/to/192.168.0.190+localhost+127.0.0.1-key.pem; location / { ... } }Python Flask / FastAPI 等也类似配置 ssl_context
访问:
https://192.168.0.190:18789
→ 本笔记本和同一局域网内其他设备(手机、平板)都不会有警告。
优点:零警告、最简单、支持 IP
缺点:只在本机和信任过 mkcert 根的设备有效(公司/家人其他电脑要先跑一次 mkcert -install 或手动导入根证书)
- 预览
