生成本地https证书工具——mkcert

2022-10-20
3分钟阅读时长

前言

以往的本地开发基本都是直接使用本地 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

image-20221021002515930

生成本地自签证书

为以下的域名或 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 进行设置。

image-20221021113259014

成功访问。

配置局域网其他设备

当前使用的 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 下并双击安装,注意要把证书保存在 受信任的根证书颁发机构

07E143D750A99B115EED7EECF6F91251

证书导入之后,浏览器访问一切正常。

IOS 证书配置

官方文档说可以使用 AirDrop、使用邮箱把证书发给自己,或者把证书部署在服务器上进行下载安装,我这边就直接用 AirDrop,简单粗暴。

IOS 设备接收到证书后:

  • 安装证书

​ 打开 设置 -> 通用 -> VPN与设备管理 -> 配置描述文件并信任

  • 完全信任证书

    打开 设置 -> 关于本机 -> 证书信任设置 -> 针对根证书启用完全信任 -> 开启

image-20221021125445853

其他设备设置

就不一一演示了,文档都是很清晰的,可以自行查询 mkcert

小结

整个流程下来,得益于 mkcert 的简单易用,我们已经成功在本地环境部署好 https,访问一切正常,希望这篇文章能对你有所帮助,感谢你的阅读。

参考内容

下一页 Hugo Blog 搭建