Logo
活死人の行知路

解决本地配置https域名警告问题


📅 | 📝 346 字
#macos #linux #ssl

1 背景

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

2 方案

这种方式可在本机和局域网内彻底消除警告,使用 mkcert 生成本地信任的证书(零警告,最方便)。

步骤(Windows / macOS / Linux 笔记本都适用):

  1. 下载 mkcert
    https://github.com/FiloSottile/mkcert/releases
    选对应系统的最新版本(windows → .exe,mac → darwin,linux → linux-amd64)

  2. 安装 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
    
  3. 为 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. 更推荐的替代做法(大多数本地开发场景下更省事)

    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.pemmylaptop.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 ::11 对极低
    极多且动态(随时加新子域名)通配符 + Caddy/Nginx 反代同上 + hosts 或本地 DNS1 对最低
  5. 如何在本地代码中使用生成的证书?在服务端配置使用这两个文件开启 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

  6. 访问:https://192.168.0.190:18789
    → 本笔记本和同一局域网内其他设备(手机、平板)都不会有警告。

优点:零警告、最简单、支持 IP
缺点:只在本机和信任过 mkcert 根的设备有效(公司/家人其他电脑要先跑一次 mkcert -install 或手动导入根证书)

  1. 预览 Not Secure