mkcert 是一个用于生成本地自签名 SSL 证书的开源工具,项目基于 Golang 开发,可跨平台使用,支持多域名以及自动信任 CA。

准备工作

局域网内访问 Web 服务的场景,因此开始前需要:

  • 服务器:用于提供 Web 服务,安装 nginx 并开启 SSL,系统为 CentOS7。
  • 客户端:一台 Windows 电脑,或者一台 手机,用于测试访问,与服务器处于同一局域网。

CentOS7

# 下载安装
wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
chmod +x mkcert
mv mkcert /usr/local/bin/
mkcert -version

# 生成多域名自签名证书
mkcert 192.168.163.128 localhost 127.0.0.1 ::1
mkcert www.app.dev app.dev 192.168.163.128 localhost 127.0.0.1 ::1
mv www.app.dev+5* /mnt/hgfs/d/www/Administrator/system/Administrator/192.168.163.128.home_win/etc/nginx/certs/

Windows/Android

# 1. 下载安装
d:/www/cert/mkcert.exe
# 2. 生成证书文件
# 执行后会生成 localhost+3-key.pem、localhost+3.pem 文件,前者是私钥,后者是证书
# 重启后打开 https://localhost,浏览器访问到了页面,但连接是不安全的。Chrome 地址栏开始红色的小三角警告后有不安全的提示。
./mkcert.exe localhost 192.168.163.128 127.0.0.1 ::1
# 3. 生成根证书,将 mkcert 的认证机构安装到服务器
./mkcert.exe -install
# 加入 -cert-file 和 -key-file 参数,将文件直接生成到对应的目录
./mkcert -cert-file /etc/nginx/certs/server.crt -key-file /etc/nginx/certs/server.key 192.168.163.128 127.0.0.1 ::1 localhost
# 4. 查看根证书位置
# centos /root/.local/share/mkcert
# windows c:/Users/Administrator/AppData/Local/mkcert
# 目录有两个文件:rootCA-key.pem 和 rootCA.pem。将 rootCA.pem 复制到 PC 上,并将其后缀改为 .crt。双击 rootCA.crt,根据提示安装证书。
# 5. 安装根证书
# 解决浏览器提示“服务器证书不受信任”
# 5.1 电脑安装
# http://192.168.0.114:9001/rootCA.crt
# 双击 rootCA.crt,安装证书...  -->  存储位置,选择当前用户  -->  证书存储,选择将所有的证书都放入下列存储,浏览   -->  受信任的根证书颁发机构,确定,下一页  -->  完成
./mkcert.exe -CAROOT
# 重启后打开 https://localhost,地址栏红色三角警告变成前黑色小锁图标,点击显示连接是安全的。
# 5.2 安卓(remik60)导入 CA 证书
# 安卓没有导入证书,Bitwarden 登入错误提示:Exception message: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
# 5.2.1 电脑传递步骤 4 的证书 rootCA.crt
# 5.2.2 设置 --> 安全 --> 更多安全设置 --> 更多安全设置 --> 加密与凭证 --> 安装证书 --> CA证书,然后选择“仍然安装”
# 或直接 设置,搜索证书,选择“安装证书” --> CA证书,然后选择“仍然安装”

Windows 导入证书

Android 导入证书

Nginx 配置

# file: d:/laragon/etc/nginx/sites-enabled/00-default.conf
server {
    listen 443 ssl;
    server_name localhost;
    root   d:/www/;
    index index.html index.htm index.php;

    # mkcert
    ssl on;
    ssl_certificate "d:/www/cert/localhost+3.pem";
    ssl_certificate_key "d:/www/cert/localhost+3-key.pem";
    # ssl_certificate /etc/nginx/certs/server.crt;
    # ssl_certificate_key /etc/nginx/certs/server.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        try_files $uri $uri/ =404;
        autoindex on;
    }    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass php_upstream;      
        #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}