参考资料

  1. 【OpenSSL】localhost を https 化する 自己証明書の作成方法


一. 前置知识

1.1 流程简介

  • 自己创建一个根证书(CA)
  • 用这个 CA 签发一个 localhost 证书
  • 把 CA 证书导入系统信任列表
  • Web 服务器(Caddy、Nginx、Apache等)使用签发的 localhost 证书

在这里插入图片描述

1.2 各种证书文件

C:\localhost-cert\
│
├── localCA.key          ← CA私钥
├── localCA.csr          ← CSR
├── localCA.crt          ← CA证书
│
├── localhost.key        ← localhost私钥
├── localhost.csr        ← CSR
├── localhost.cnf        ← SAN配置
└── localhost.crt        ← localhost服务器证书


CA = 公证处
localCA.key = 公证处的印章
localCA.crt = 公证处的营业执照/身份证明

localhost = 公司
localhost.key = 公司的私章
localhost.crt = 公司的身份证明

公证处证明:这个 localhost 证书是真的。

二. 自定义CA机构

CA机构(Certificate Authority,即证书颁发机构)是负责发放和管理数字证书的受信任第三方权威机构。核心职责身份验证:

  • 验证网站、企业、个人或设备的真实身份。
  • 签发证书:为通过验证的实体签署并颁发数字证书(包含公开密钥及身份信息)。
  • 证书管理:负责证书的更新、状态查询以及吊销(通过吊销列表 CRL 或在线证书状态协议 OCSP)。

2.1 生成 CA 私钥

  • 相当于私人证书颁发机构的印章
  • 可以使用这个印章给服务器签发证书
openssl genrsa -out localCA.key 4096

2.2 生成 CA 的 CSR

🔷CSR 就是一份请给我签发证书的申请书,它包含公钥和申请信息,但不包含私钥:

  • 申请者的信息,例如 CN
  • 申请者的公钥
  • 其他证书请求信息
  • 使用对应私钥生成的数字签名
localCA.key
    ↓
包含私钥 + 对应公钥
    ↓
生成 CSR
    ↓
localCA.csr
    ├── 公钥
    ├── Subject 信息
    │    ├── C=CN
    │    ├── ST=广东
    │    ├── L=广州
    │    ├── O=Example Inc
    │    └── CN=Example Local CA
    └── 私钥产生的签名
  • 得到localCA.csr文件
openssl req -batch -new -key localCA.key -out localCA.csr -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=Example Inc/OU=Development/CN=Example Local CA"

2.3 生成 CA 根证书

  • 得到localCA.crt文件
openssl x509 -req -in localCA.csr -signkey localCA.key -out localCA.crt -days 3650 -sha256

三. 服务器(localhost)

3.1 生成 localhost 私钥 → 本地服务器的私钥

openssl genrsa -out localhost.key 2048

3.2 创建 localhost 的 SAN 配置

  • 创建一个localhost.cnf文件
  • 其中alt_names的内容:告诉浏览器,证书可以用于 localhost、127.0.0.1 和 ::1
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
C = CN
ST = Guangdong
L = Guangzhou
O = Example Inc
OU = Development
CN = localhost

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 127.0.0.1
IP.2 = ::1

3.3 生成 localhost 的 CSR

openssl req -new -key localhost.key -out localhost.csr -config localhost.cnf

3.4 使用自定义 CA 给 localhost 签发证书

                localCA
           ┌────────────────┐
           │ localCA.key    │
           │ localCA.crt    │
           └───────┬────────┘
                   │
                   │ 签发
                   ▼
           ┌────────────────┐
           │ localhost      │
           │                │
           │ localhost.key  │
           │ localhost.crt  │
           └────────────────┘
openssl x509 -req `
  -in localhost.csr `
  -CA localCA.crt `
  -CAkey localCA.key `
  -CAcreateserial `
  -out localhost.crt `
  -days 825 `
  -sha256 `
  -extfile localhost.cnf `
  -extensions req_ext
  • 显示自签名证书发行成功

在这里插入图片描述

  • 确认自签名证书的内容

在这里插入图片描述


四. 让 Windows 信任自定义CA

自定义CA不会被Windows信任,需要手动设置,告诉Windows自定义的 CA 是可信的。

4.1 安装localCA.crt证书

  • 将localCA.crt证书添加到受信任的根证书颁发机构中

在这里插入图片描述

4.2 查看localCA.crt证书导入情况

  • Win + R 配合 certmgr.msc 打开证书管理器
  • 可以找到添加的自定义CA证书

在这里插入图片描述


五. Caddy

5.1 安装

# 安装
scoop install caddy
# 查看版本
caddy version

5.2 配置

  • 新建Caddyfile文件,然后添加如下配置内容
    • caddy默认会自动生成本地 CA,自动签发 localhost 证书,自动导入系统信任
    • 此处为了学习自签名证书,因此不使用caddy自动签发的证书
  • 服务器的web程序运行在9002端口
    • 此处使用反向代理
    • 将localhost/test/*的所有请求都反向代理到服务器内部的127.0.0.1:9002/test/*中
localhost {

	# 不使用Caddy自动生成的证书, 使用自己生成的证书
	# 如果去掉下面这行配置的话, caddy就会使用使用自己签发的证书
	tls D:\localhost-cert\localhost.crt D:\localhost-cert\localhost.key
	
	# 指定要被代理的路径
	handle /test/* {
		# 反向代理
		reverse_proxy 127.0.0.1:9002
	}
}
  • caddy fmt --overwrite .\Caddyfile:格式化配置文件
  • caddy validate --config Caddyfile:校验配置文件

在这里插入图片描述

5.3 运行

  • caddy run --config Caddyfile

在这里插入图片描述


六. 浏览器查看效果

6.1 自定义的自签名证书

  • 可以看到,已经是使用https访问localhost的状态了

在这里插入图片描述

6.2 caddy生成的证书

  • 在配置文件中去掉使用自定义的签名证书之后,启动caddy的时候,会自动进行证书申请与配置

在这里插入图片描述

  • caddy启动成功之后,打开浏览器查看证书,可以看到Caddy的字样

在这里插入图片描述

  • caddy自动添加的证书也可以在证书管理器中找到

在这里插入图片描述

更多推荐