生成本地https证书工具——mkcert
前言
以往的本地开发基本都是直接使用本地 ip 进行访问,最近因为在重建家庭网络在捣鼓 PVE,刚在 PVE 的一个 LXC 容器安装了 Portainer , 一款 Docker 的可视化容器管理工具,结果设置密码的时候提示最少 12 位…这么一来我本地服务习惯用的通用密码就不符合要求了,第一反应就是使用 1password,笔者正在使用的一款密码管理工具来生成密码,但是域名是 ip + 端口的形式,emmm…所以想着利用静态 DNS + 反向代理来使用一个本地域名如 portainer.dev
来访问,但是浏览器默认会加 https 来访问就会出错和提示证书不安全的警告,每次都要自己手打 http://
(对不起我浏览器的收藏功能被我吃掉了),所以就去搜索了一番关于本地 https 证书的相关方案,找到了一个看起来快速简单的方案:mkcert。以此文来简单记录实践的过程。
关于 mkcert
mkcert 是使用 golang 编写的,用于制作本地受信任的开发证书的简单工具,具有跨平台,支持多域名,自动信任CA等特性,可供本地开发快速部署 https 证书。
mkcert 的基本使用
安装
mkcert GitHub 首页的 README 有着详细的安装方式,可以直接在 GitHub Release 页面进行下载,也可以使用不同系统的包管理工具来进行安装,以下为 使用 MacOS - Homebrew 来进行安装
❯ brew install mkcert
等待安装完毕后,直接输入 mkcert
测试是否安装成功
❯ mkcert
Usage of mkcert:
$ mkcert -install
Install the local CA in the system trust store.
$ mkcert example.org
Generate "example.org.pem" and "example.org-key.pem".
$ mkcert example.com myapp.dev localhost 127.0.0.1 ::1
Generate "example.com+4.pem" and "example.com+4-key.pem".
$ mkcert "*.example.it"
Generate "_wildcard.example.it.pem" and "_wildcard.example.it-key.pem".
$ mkcert -uninstall
Uninstall the local CA (but do not delete it).
将 CA 证书安装到系统信任库
输入 mkcert -install
命令
❯ mkcert -install
Created a new local CA 💥
Sudo password:
The local CA is now installed in the system trust store! ⚡️
然后可以在 MacOS 的证书列表中找到上述命令安装的 New local CA

生成本地自签证书
为以下的域名或 IP 签发证书:
- portainer.dev
- 192.168.5.4 (内网 IP)
- localhost
- 127.0.0.1
- ::1(ipv6)
❯ mkcert portainer.dev 192.168.5.4 localhost 127.0.0.1 ::1
Created a new certificate valid for the following names 📜
- "portainer.dev"
- "192.168.5.4"
- "localhost"
- "127.0.0.1"
- "::1"
The certificate is at "./portainer.dev+4.pem" and the key at "./portainer.dev+4-key.pem" ✅
It will expire on 21 January 2025 🗓
查看当前目录下的文件,发现证书已经生成完毕。
❯ ls
portainer.dev+4-key.pem portainer.dev+4.pem
使用自签证书
证书上传
把证书上传到服务器,作为演示这里简单使用 scp
命令来上传到 /root/
目录
❯ scp portainer.dev+4-key.pem portainer.dev+4.pem root@192.168.5.4:/root/
root@192.168.5.4's password:
portainer.dev+4-key.pem 100% 1704 403.5KB/s 00:00
portainer.dev+4.pem 100% 1606 439.7KB/s 00:00
反向代理
我使用的是 Nginx
,登录到服务器,然后创建配置文件并修改
# 创建配置文件,文件名请自行更换
touch /etc/nginx/sites-enabled/portainer.dev
编辑内容并保存,内容仅供参考
server {
server_name portainer.dev;
location / {
proxy_pass http://127.0.0.1:9000/;
}
listen 443 ssl http2;
ssl_certificate /root/certs/portainer.dev+4.pem;
ssl_certificate_key /root/certs/portainer.dev+4-key.pem;
}
server {
if ($host = portainer.dev) {
return 301 https://$host$request_uri;
}
server_name portainer.dev;
listen 80;
return 404;
}
重启 Nginx 后,我们的反向代理就完成啦
nginx -s reload
浏览器访问
因为我已经用路由器设置了静态 DNS portainer.dev
-> 192.168.5.4
, 不需要在本机 Host 进行设置。

成功访问。
配置局域网其他设备
当前使用的 MacOS 已经可以正常访问,但是其他如 Windows,IOS 因为并没有信任 CA,所以此时访问 portainer.dev
会报 https 安全警告,所以我们要发放 CA 证书给其他设备进行配置
列出 CA 证书存放目录
# 查看目录
❯ mkcert -CAROOT
/Users/yc/Library/Application Support/mkcert
# 跳转并列出目录下的文件
❯ cd /Users/yc/Library/Application\ Support/mkcert && ls
rootCA-key.pem rootCA.pem
Windows 证书配置
复制一份 rootCA.pem
并重命名为 rootCA.crt
❯ cp rootCA.pem rootCA.crt
然后把 rootCA.crt
拷贝到 Windows 下并双击安装,注意要把证书保存在 受信任的根证书颁发机构

证书导入之后,浏览器访问一切正常。
IOS 证书配置
官方文档说可以使用 AirDrop、使用邮箱把证书发给自己,或者把证书部署在服务器上进行下载安装,我这边就直接用 AirDrop,简单粗暴。
IOS 设备接收到证书后:
- 安装证书
打开 设置 -> 通用 -> VPN与设备管理 -> 配置描述文件并信任
-
完全信任证书
打开 设置 -> 关于本机 -> 证书信任设置 -> 针对根证书启用完全信任 -> 开启

其他设备设置
就不一一演示了,文档都是很清晰的,可以自行查询 mkcert
小结
整个流程下来,得益于 mkcert 的简单易用,我们已经成功在本地环境部署好 https,访问一切正常,希望这篇文章能对你有所帮助,感谢你的阅读。