
本教程将指导您如何使用 OpenSSL 重新生成所有证书和密钥,并配置 FRP 实现双向证书验证(mTLS)和证书吊销(CRL),以达到最高级别的连接安全。
环境约定:
CA/证书管理环境: Windows PowerShell
FRP 配置: TOML 格式
CA 目录: C:\frp_ssl
步骤 1: 准备工作和目录结构
创建一个用于存放证书和管理 CA 的工作目录,并准备必要的 CA 数据库文件。
PowerShell
# 创建工作目录并进入
New-Item -Path C:\frp_ssl -ItemType Directory -Force
Set-Location C:\frp_ssl
# 创建用于存放新签发证书的目录
New-Item new_certs -ItemType Directory
# 1. 创建证书索引文件(数据库)
New-Item index.txt -ItemType File
# 2. 创建证书序列号文件(从 1000 开始)
Set-Content -Path serial -Value "1000"
# 3. 创建 CRL 编号文件
Set-Content -Path crlnumber -Value "1000"步骤 2: 创建 OpenSSL CA 配置文件 (ca.cnf)
创建 ca.cnf 文件并配置 CA 数据库的路径和策略。所有后续的 openssl ca 操作都将依赖此文件。
PowerShell
[ ca ]
default_ca = my_ca
[ my_ca ]
dir = .
database = ./index.txt
new_certs_dir = ./new_certs
private_key = ./ca.key
certificate = ./ca.crt
serial = ./serial
crlnumber = ./crlnumber
default_days = 3650
default_crl_reason = unspecified
policy = policy_anything
email_in_subject = no
crl_extensions = crl_ext
default_md = sha256
[ crl_ext ]
authorityKeyIdentifier = keyid:always,issuer:always
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional步骤 3: 生成 CA 根证书
生成 CA 私钥 (ca.key) 和 CA 证书 (ca.crt)。
PowerShell
# 1. 生成 CA 私钥
openssl genrsa -aes256 -out ca.key 4096
# 提示:请设置并记住您的 CA 密码!
# 2. 生成 CA 根证书
# CN (Common Name) 建议设置为 My-FRP-CA
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=CN/ST=Internet/L=LAN/O=MyFRPCA/OU=RootCA/CN=My-FRP-CA"步骤 4: 生成服务器证书 (frps)
服务器证书需要包含 Subject Alternative Name (SAN) 来避免客户端出现 certificate relies on legacy Common Name field, use SANs instead 错误。
4.1 创建 SAN 配置文件 (server.ext)
将您的 FRP 服务器域名或 IP 替换到以下内容中。
在PowerShell中运行下面代码
# 请替换为您服务器的真实域名或 IP
$ServerExt = @"
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = your.frps.domain # 您的域名
IP.1 = 192.168.1.100 # 您的内网IP
IP.2 = 1.2.3.4 # 您的公网IP
"@
Set-Content -Path server.ext -Value $ServerExt -Force4.2 生成服务器证书
PowerShell
# 1. 生成服务器私钥
openssl genrsa -out server.key 2048
# 2. 生成服务器 CSR (CN 建议与 SAN 中的 DNS.1 匹配)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Internet/L=LAN/O=FRP/OU=Server/CN=your.frps.domain"
# 3. 用 CA 签发服务器证书,使用 server.ext
openssl ca -config ca.cnf -policy policy_anything -in server.csr -out server.crt -extfile server.ext -days 3650
# 提示:输入 CA 密码,并确认签发 (y)步骤 5: 生成客户端证书 (frpc)
为每个客户端生成独立的证书,以实现区分和单独吊销。这里以 client1 为例。
PowerShell
# 客户端 1 (Client A)
$Client1CN = "frpc-client-A"
# 1. 生成客户端 A 私钥
openssl genrsa -out client1.key 2048
# 2. 生成客户端 A CSR
openssl req -new -key client1.key -out client1.csr -subj "/C=CN/ST=Internet/L=LAN/O=FRP/OU=Client/CN=$Client1CN"
# 3. 用 CA 签发客户端 A 证书
openssl ca -config ca.cnf -policy policy_anything -in client1.csr -out client1.crt -days 3650
# 提示:输入 CA 密码,并确认签发 (y)如果要创建第二个客户端 (Client B),只需重复上述命令,将 client1 替换为 client2,并将 CN 更改为 frpc-client-B。
PowerShell
# 客户端 2 (Client B)
$Client2CN = "frpc-client-B"
# 1. 生成客户端 B 私钥
openssl genrsa -out client2.key 2048
# 2. 生成客户端 B CSR
openssl req -new -key client2.key -out client2.csr -subj "/C=CN/ST=Internet/L=LAN/O=FRP/OU=Client/CN=$Client2CN"
# 3. 用 CA 签发客户端 B 证书
openssl ca -config ca.cnf -policy policy_anything -in client2.csr -out client2.crt -days 3650
# 提示:输入 CA 密码,并确认签发 (y)步骤 6: 配置 FRP 实现 mTLS 和 CRL
6.1 FRP 服务器配置 (frps.toml)
将 crl.pem 路径添加到配置中,并启用 mTLS 强制模式。
Ini, TOML
# frps.toml
bindAddr = "0.0.0.0"
bindPort = 7000
auth.method = "token"
auth.token = "YOUR_STRONG_TOKEN" # 替换为您自己的 Token
# 强制 TLS 双向验证配置
transport.tls.force = true
transport.tls.certFile = "/etc/frp/ssl/server.crt"
transport.tls.keyFile = "/etc/frp/ssl/server.key"
transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
transport.tls.crlFile = "/etc/frp/ssl/crl.pem" # **用于证书吊销列表**
# 其他配置...
# webServer.addr = "0.0.0.0"
# webServer.port = 7500
# ...6.2 FRP 客户端配置 (frpc.toml)
客户端使用其唯一的证书和私钥,并使用 CA 证书进行服务器验证。
Ini, TOML
# frpc-client1.toml
serverAddr = "your.frps.domain" # 使用您配置在 SAN 中的域名或 IP
serverPort = 7000
[auth]
method = "token"
token = "YOUR_STRONG_TOKEN"
# 启用 TLS 双向验证配置
[transport.tls]
enable = true
certFile = "/etc/frp/client1.crt" # 客户端唯一的证书
keyFile = "/etc/frp/client1.key" # 客户端唯一的私钥
trustedCaFile = "/etc/frp/ca.crt" # CA 根证书 (与服务器共享)
# 代理配置...
[[proxies]]
name = "ssh-client1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22 #本地的端口
remotePort = 6022 #映射到服务器的端口
transport.useEncryption = true #传输加密
transport.useCompression = true #传输压缩步骤 7: 证书吊销操作
当客户端 A(client1.crt)的证书私钥泄露或该客户端不再被信任时,执行以下步骤:
7.1 吊销证书
使用 CA 配置文件和私钥将证书标记为吊销:
PowerShell
# 确保您在 C:\frp_ssl 目录
openssl ca -config ca.cnf -keyfile ca.key -cert ca.crt -revoke .\client1.crt
# 提示:输入 CA 密码。
# 证书状态在 index.txt 中被标记为 'R' (Revoked)7.2 生成新的 CRL 文件
每次吊销证书后,必须生成新的 CRL 文件,供 FRP 服务器使用:
PowerShell
# 生成最新的 CRL 文件
openssl ca -config ca.cnf -keyfile ca.key -cert ca.crt -gencrl -out crl.pem7.3 部署和重启
将新生成的 crl.pem 文件部署到 FRP 服务器的 /etc/frp/ssl/ 路径下,并重启 FRP 服务器 (frps)。
一旦 frps 重新启动并加载了新的 CRL,带有 client1.crt 的客户端将无法再连接到服务器。