openssl 生成自签名证书,使用https访问localhost

参考资料

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

目录

  • [一. 前置知识](#一. 前置知识)
    • [1.1 流程简介](#1.1 流程简介)
    • [1.2 各种证书文件](#1.2 各种证书文件)
  • [二. 自定义CA机构](#二. 自定义CA机构)
    • [2.1 生成 CA 私钥](#2.1 生成 CA 私钥)
    • [2.2 生成 CA 的 CSR](#2.2 生成 CA 的 CSR)
    • [2.3 生成 CA 根证书](#2.3 生成 CA 根证书)
  • [三. 服务器(localhost)](#三. 服务器(localhost))
    • [3.1 生成 localhost 私钥 → 本地服务器的私钥](#3.1 生成 localhost 私钥 → 本地服务器的私钥)
    • [3.2 创建 localhost 的 SAN 配置](#3.2 创建 localhost 的 SAN 配置)
    • [3.3 生成 localhost 的 CSR](#3.3 生成 localhost 的 CSR)
    • [3.4 使用自定义 CA 给 localhost 签发证书](#3.4 使用自定义 CA 给 localhost 签发证书)
  • [四. 让 Windows 信任自定义CA](#四. 让 Windows 信任自定义CA)
    • [4.1 安装`localCA.crt`证书](#4.1 安装localCA.crt证书)
    • [4.2 查看`localCA.crt`证书导入情况](#4.2 查看localCA.crt证书导入情况)
  • [五. Caddy](#五. Caddy)
    • [5.1 安装](#5.1 安装)
    • [5.2 配置](#5.2 配置)
    • [5.3 运行](#5.3 运行)
  • [六. 浏览器查看效果](#六. 浏览器查看效果)
    • [6.1 自定义的自签名证书](#6.1 自定义的自签名证书)
    • [6.2 caddy生成的证书](#6.2 caddy生成的证书)

一. 前置知识

1.1 流程简介

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

1.2 各种证书文件

bash 复制代码
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 私钥

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

2.2 生成 CA 的 CSR

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

  • 申请者的信息,例如 CN
  • 申请者的公钥
  • 其他证书请求信息
  • 使用对应私钥生成的数字签名
bash 复制代码
localCA.key
    ↓
包含私钥 + 对应公钥
    ↓
生成 CSR
    ↓
localCA.csr
    ├── 公钥
    ├── Subject 信息
    │    ├── C=CN
    │    ├── ST=广东
    │    ├── L=广州
    │    ├── O=Example Inc
    │    └── CN=Example Local CA
    └── 私钥产生的签名
  • 得到localCA.csr文件
bash 复制代码
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文件
bash 复制代码
openssl x509 -req -in localCA.csr -signkey localCA.key -out localCA.crt -days 3650 -sha256

三. 服务器(localhost)

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

bash 复制代码
openssl genrsa -out localhost.key 2048

3.2 创建 localhost 的 SAN 配置

  • 创建一个localhost.cnf文件
  • 其中alt_names的内容:告诉浏览器,证书可以用于 localhost、127.0.0.1 和 ::1
bash 复制代码
[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

bash 复制代码
openssl req -new -key localhost.key -out localhost.csr -config localhost.cnf

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

bash 复制代码
                localCA
           ┌────────────────┐
           │ localCA.key    │
           │ localCA.crt    │
           └───────┬────────┘
                   │
                   │ 签发
                   ▼
           ┌────────────────┐
           │ localhost      │
           │                │
           │ localhost.key  │
           │ localhost.crt  │
           └────────────────┘
bash 复制代码
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 安装

powershell 复制代码
# 安装
scoop install caddy
# 查看版本
caddy version

5.2 配置

  • 新建Caddyfile文件,然后添加如下配置内容
    • caddy默认会自动生成本地 CA,自动签发 localhost 证书,自动导入系统信任
    • 此处为了学习自签名证书,因此不使用caddy自动签发的证书
  • 服务器的web程序运行在9002端口
    • 此处使用反向代理
    • 将localhost/test/*的所有请求都反向代理到服务器内部的127.0.0.1:9002/test/*中
bash 复制代码
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自动添加的证书也可以在证书管理器中找到
相关推荐
2501_916007475 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
Lsetea5 天前
证书没到期却报certificate has expired:OpenSSL定位中间证书与系统时间
运维·https·ssl证书·openssl·证书链
2501_916008895 天前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
SDWAN_Cheap6 天前
HTTPS到底加密了什么?
https·数据加密
2501_916008896 天前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
Lsetea6 天前
Nginx报No required SSL certificate was sent:mTLS客户端证书排查
运维·nginx·https·ssl·openssl
ZeroNews内网穿透7 天前
内网部署 Halo 建站,用 ZeroNews 免费内网穿透安全发布到公网(无公网 IP 也能 HTTPS 访问)
docker·https·内网穿透·nas·反向代理·halo·zeronews
szephyr7 天前
HTTPS 证书申请与自动续期:acme.sh + Let‘s Encrypt 完整记录
nginx·https·acme.sh·证书续期
Lsetea8 天前
部署证书后提示“证书名称与输入不匹配”:Safari 报错的三层排查
nginx·https·safari·ssl证书·openssl
其实防守也摸鱼8 天前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl