专注于高性能网络应用开发,核心技术包括PHP、Java、GO、NodeJS等后端语言,VUE、UNI、APP等前端开发,服务器运维、数据库、实时通信、AI等领域拥有丰富经验

macOS下使用mkcert创建本地HTTPS证书完全指南

在Web开发过程中,我们经常需要在本地环境中测试HTTPS功能。传统的自签名证书会导致浏览器显示不安全警告,影响开发体验和测试结果。而公共证书服务(如Let's Encrypt)不适合本地开发使用,因为它们需要公网域名验证。此外,手动配置和管理证书也是一个复杂且容易出错的过程。

mkcert的出现解决了这些问题,它是一个简单的工具,用于创建本地可信的SSL证书,能够被所有主流浏览器信任,为开发者提供了一个便捷的本地HTTPS环境搭建方案。

解决方案

1. mkcert简介

mkcert是由Mozilla开发的一个开源工具,用于创建本地开发环境中的可信SSL证书。它有以下特点:

  • 自动创建并安装本地CA(证书颁发机构)
  • 生成的证书被所有主流浏览器信任
  • 支持多个域名和IP地址
  • 支持跨平台使用(macOS、Linux、Windows)

2. 安装mkcert

在macOS上,我们可以通过Homebrew来安装mkcert:

# 安装Homebrew(如果尚未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装mkcert
brew install mkcert

# 安装nss(如果需要支持Firefox)
brew install nss

3. 创建并安装本地CA

mkcert需要一个本地CA来签发证书,首次使用时需要创建并安装这个CA:

# 创建并安装本地CA到系统信任存储
mkcert -install

执行此命令后,mkcert会生成一个本地CA并将其安装到系统的信任存储中。这意味着系统上所有浏览器都会信任由这个CA签发的证书。

4. 生成本地SSL证书

为单个域名生成证书

# 为localhost生成证书
mkcert localhost

# 输出类似于:
# Created a new certificate valid for the following names 📜
# - "localhost"
# The certificate is at "./localhost.pem" and the key at "./localhost-key.pem"

为多个域名生成证书

# 为多个域名生成证书
mkcert localhost myapp.dev "*.myapp.dev" 127.0.0.1 ::1

指定证书输出目录

# 在指定目录生成证书
mkcert -cert-file ./my-cert.pem -key-file ./my-key.pem localhost myapp.dev

5. 在Web服务器中配置证书

Nginx配置示例

server {
    listen 443 ssl;
    server_name localhost myapp.dev;

    # 指定证书路径
    ssl_certificate /path/to/localhost.pem;
    ssl_certificate_key /path/to/localhost-key.pem;

    # SSL配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root   /path/to/your/project;
        index  index.html index.htm;
    }
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name localhost myapp.dev;
    return 301 https://$host$request_uri;
}

Apache配置示例

<VirtualHost *:443>
    ServerName localhost
    ServerAlias myapp.dev
    DocumentRoot "/path/to/your/project"

    # 启用SSL
    SSLEngine on
    SSLCertificateFile "/path/to/localhost.pem"
    SSLCertificateKeyFile "/path/to/localhost-key.pem"

    # SSL协议和加密套件配置
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
</VirtualHost>

# HTTP重定向到HTTPS
<VirtualHost *:80>
    ServerName localhost
    ServerAlias myapp.dev
    Redirect permanent / https://localhost/
</VirtualHost>

Node.js中使用

const https = require('https');
const fs = require('fs');
const path = require('path');

// 证书路径
const certPath = path.join(__dirname, 'localhost.pem');
const keyPath = path.join(__dirname, 'localhost-key.pem');

// 创建HTTPS服务器
const options = {
    key: fs.readFileSync(keyPath),
    cert: fs.readFileSync(certPath)
};

const server = https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello HTTPS World!');
});

server.listen(443, () => {
    console.log('HTTPS server running on port 443');
});

6. 在Docker环境中使用mkcert证书

在Docker容器中使用mkcert生成的证书,需要将证书文件挂载到容器中:

FROM nginx:alpine

# 创建证书目录
RUN mkdir -p /etc/nginx/certs

# 复制证书文件(在构建时)
# COPY ./localhost.pem /etc/nginx/certs/
# COPY ./localhost-key.pem /etc/nginx/certs/

# 或者使用卷挂载(在运行时)
# docker run -v ./localhost.pem:/etc/nginx/certs/localhost.pem \
#            -v ./localhost-key.pem:/etc/nginx/certs/localhost-key.pem \
#            -p 443:443 nginx

难点讲解

1. 多域名和通配符证书

mkcert支持为多个域名和通配符域名生成证书:

# 为多个域名生成证书
mkcert example.com "*.example.org" myapp.dev localhost 127.0.0.1

# 注意:通配符域名只能放在一级子域名上,如*.example.com是有效的
# 但*.*.example.com是无效的

注意事项

  • 通配符证书仅对一级子域名有效
  • IP地址可以直接添加到证书中
  • 域名列表中的第一个域名将成为证书的Common Name (CN)

2. 证书信任问题排查

如果浏览器仍然显示证书不可信,可以尝试以下步骤:

# 检查CA是否正确安装
mkcert -CAROOT

# 这会显示CA证书的存储路径,可以检查证书是否存在

# 重新安装CA
mkcert -install

# 清除浏览器缓存和SSL状态
# 在Chrome中访问:chrome://settings/clearBrowserData
# 在Firefox中访问:about:preferences#privacy

常见问题

  • Firefox可能需要单独配置信任,可以使用certutil命令
  • 某些旧版浏览器可能不支持mkcert生成的证书
  • 系统更新后可能需要重新安装CA

3. 证书更新和续期

mkcert生成的证书默认有效期为825天(约2.25年),CA证书有效期为10年。如果需要更新证书:

# 重新生成证书(使用相同的域名)
mkcert localhost myapp.dev

# 这会覆盖之前的证书文件

最佳实践

  • 将证书生成命令保存到脚本中,便于重新生成
  • 将证书文件加入版本控制系统(但私钥应该被忽略)
  • 定期检查证书有效期,提前更新

4. 在团队环境中共享证书

在团队开发环境中,可以共享CA证书,确保所有成员都能信任相同的证书:

# 查看CA证书位置
mkcert -CAROOT

# 共享以下文件给团队成员:
# - rootCA.pem (CA证书)
# - rootCA-key.pem (CA私钥,谨慎分享)

# 团队成员收到CA文件后,将其放到自己的CAROOT目录
# 然后运行:
mkcert -install

安全提示

  • CA私钥具有签发证书的能力,应该谨慎分享
  • 考虑为团队创建专用的CA,而不是使用个人CA
  • 定期轮换团队CA证书,提高安全性

总结

mkcert为macOS用户提供了一个简单、高效的本地HTTPS环境搭建方案。通过本文的介绍,你应该已经掌握了如何在macOS上安装、使用和部署mkcert生成的证书。使用mkcert可以大大简化本地开发环境中的HTTPS配置,提高开发效率,同时确保开发环境与生产环境在安全性方面保持一致。

记住,mkcert生成的证书仅适用于本地开发,不应该在生产环境中使用。在生产环境中,应该使用来自受信任证书颁发机构(如Let's Encrypt、DigiCert等)的证书。

相关文章