本地 https 环境解决方案
Yzenakiki
2022年11月14日 15:59

本文记录如何使用 mkcert 与 nginx 快速搭建本地 https 环境,并且没有浏览器警告

TL;DR

代码块
Shell
自动换行
复制代码
choco install mkcert

mkcert -install

mkcert localhost 127.0.0.1
复制成功


前言

以前本地开发搭建 https 环境时,使用的是自签证书,由于浏览器不信任自签证书,经常需要在警告页面点击继续访问,有些麻烦:

有时甚至没有继续访问的按钮,就需要到  里删除相关域名,更麻烦了,而且过段时间后还需要重复操作:

为了不这么麻烦,需要我们将自签证书使用的根证书添加到系统的可信 CA 证书中,这样就不会出现警告了。当然了达到这个效果需要执行一堆  命令,确实繁琐,好在已经有了封装了这些的小工具 —— mkcert 。


mkcert 介绍

mkcert 是一个使用 go 语言编写的生成本地自签证书的小程序,具有跨平台、使用简单、支持多域名、自动信任 CA 等一系列方便的特性可供本地开发时快速创建 https 环境使用。


mkcert 安装

Windows

  • 使用 Chocolatey 或 Scoop

代码块
Shell
自动换行
复制代码
choco install mkcert
# 或者
scoop bucket add extras scoop install mkcert
复制成功
  • 或者直接下载编译好的文件访问 GitHub Releases 下载(https://github.com/FiloSottile/mkcert/releases)然后可以重命名文件为 mkcert.exe ,所在路径放到环境变量 Path 里,方便直接以 mkcert 命令运行如果运行时有问题的话,切换为以管理员运行

macOS / Linux

使用 Homebrew / Homebrew on Linux

代码块
Shell
自动换行
复制代码
brew install mkcert
brew install nss # 如果使用 Firefox
复制成功


信任 CA 证书

⚠ Warning mkcert 自动生成的  文件提供了拦截来自本机安全请求的完整能力。不要分享这个文件。

将 mkcert 使用的根证书加入本地可信 CA 中,以后由该 CA 签发的证书在本地都是可信的

代码块
Shell
自动换行
复制代码
mkcert -install
复制成功

可能不支持火狐浏览器

然后可以在 Windows 的可信 CA 列表找到该证书:


安装 nginx

去官网 下载nginx或使用包管理器安装,具体步骤不再赘述


生成证书

代码块
Shell
自动换行
复制代码
mkcert localhost 127.0.0.1
# 或者使用域名配合 hosts
mkcert *.example.com
复制成功

会在当前目录生成证书文件和私钥文件,然后就可以用在 nginx 上了


使用证书

修改 nginx 配置如下

代码块
Nginx
自动换行
复制代码
server {    
  listen 443 ssl;    
  # 修改为所需域名或者 localhost    
  server_name *.example.com;    
  index index.html index.htm index.php default.html default.htm default.php;    
  root html;    
  # 修改为生成文件目录    
  ssl_certificate "cert/_wildcard.example.com.pem";    
  # 修改为生成文件目录
  ssl_certificate_key "cert/_wildcard.example.com-key.pem";    
  ssl_session_cache shared:SSL:1m; 
  ssl_session_timeout 5m;    
  ssl_ciphers HIGH:!aNULL:!MD5; 
  ssl_prefer_server_ciphers on;    
  
  # 此处为个人需求,代理请求到 80 端口    
  location / {        
    proxy_pass http://127.0.0.1;        
    proxy_set_header Host $proxy_host;        
    proxy_set_header X-Real-IP $remote_addr;        
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        
    proxy_set_header Via "nginx";    
  } 
}
复制成功


检查是否生效

运行 nginx 后访问,没有警告页面

之后如果证书过期的话再重新执行一遍命令即可


mkcert 其他选项

代码块
Shell
自动换行
复制代码
-cert-file FILE, -key-file FILE, -p12-file FILE  自定义输出路径/文件名。 
-client  生成用于客户端身份验证的证书。 
-ecdsa  使用 ECDSA 密钥生成证书。 
-pkcs12  生成 PKCS12 格式的证书。Java 程序通常不支持 PEM 格式的证书,但是支持 PKCS12 格式的证书。 
-csr CSR  根据提供的 CSR 生成证书。与除 -install 和 -cert-file 之外的所有其他选项冲突。
复制成功

注意:需要将这些选项放在域名之前

例子:

代码块
Shell
自动换行
复制代码
mkcert -key-file key.pem -cert-file cert.pem example.com *.example.com
复制成功


局域网内使用

参照 https://blog.dteam.top/posts/2019-04/本地https快速解决方案mkcert.html#局域网内使用 


Reference

https://github.com/FiloSottile/mkcert

https://www.jianshu.com/p/7cb5c2cffaaa

Also posted at https://www.nanoka.top/posts/d845bf65/ fin.