FRP TLS 安全传输的配置指南
涵盖 默认加密、单向认证、双向认证(mTLS) 三种模式,以及证书生成方法。
一、TLS 默认行为(v0.50.0+)
从 v0.50.0 开始,frp 默认启用 TLS 加密:
- frpc 默认开启 TLS 加密,但不校验 frps 证书
- frps 若未配置证书,则使用随机生成的自签名证书加密流量
注意:启用 TLS 后,除 xtcp 外,可以不用再设置
useEncryption重复加密。
二、TLS 配置项对照表
| 配置项 | 作用域 | 类型 | 说明 |
|---|---|---|---|
transport.tls.force | frps | bool | 强制只接受 TLS 连接的客户端。若 trustedCaFile 有效,会自动开启 |
transport.tls.certFile | 双端 | string | TLS 证书文件路径 |
transport.tls.keyFile | 双端 | string | TLS 私钥文件路径 |
transport.tls.trustedCaFile | 双端 | string | 受信任的 CA 证书文件路径,用于验证对方身份 |
transport.tls.enable | frpc | bool | 客户端显式启用 TLS(v0.50.0+ 默认 true) |
三、三种 TLS 模式配置
3.1 模式一:默认 TLS 加密(不验证身份)
无需额外配置,frp 默认使用随机证书加密通信。适用于信任网络环境。
1# frps.toml - 无需额外 TLS 配置 2bindPort = 7000 3 4# frpc.toml - 无需额外 TLS 配置 5serverAddr = "x.x.x.x" 6serverPort = 7000
3.2 模式二:frpc 单向校验 frps 身份
frpc 验证 frps 的服务器证书,防止中间人攻击。
1# ========== frps.toml ========== 2bindPort = 7000 3 4# frps 提供 TLS 证书 5transport.tls.certFile = "/etc/frp/ssl/server.crt" 6transport.tls.keyFile = "/etc/frp/ssl/server.key" 7 8# ========== frpc.toml ========== 9serverAddr = "x.x.x.x" 10serverPort = 7000 11 12# frpc 通过 CA 验证 frps 证书 13transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
原理:frpc 使用
ca.crt验证 frps 的server.crt是否由可信 CA 签发,且服务器域名/IP 需在证书的 SAN 中。
3.3 模式三:双向 TLS 认证(mTLS)⭐ 推荐
frpc 和 frps 互相验证对方身份,安全性最高,适合生产环境。
1# ========== frps.toml ========== 2bindPort = 7000 3 4# 强制 TLS + 服务端证书 5transport.tls.force = true 6transport.tls.certFile = "/etc/frp/ssl/server.crt" 7transport.tls.keyFile = "/etc/frp/ssl/server.key" 8 9# 验证客户端证书 10transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt" 11 12# ========== frpc.toml ========== 13serverAddr = "x.x.x.x" 14serverPort = 7000 15 16# 客户端证书 17transport.tls.certFile = "/etc/frp/ssl/client.crt" 18transport.tls.keyFile = "/etc/frp/ssl/client.key" 19 20# 验证服务端证书 21transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
关键点:理论上 frpc 和 frps 的 CA 证书可以不同,只要能验证对方身份即可。但实际部署建议使用同一 CA 签发。
四、证书生成完整脚本(OpenSSL)
4.1 创建 OpenSSL 配置文件
1cat > my-openssl.cnf << 'EOF' 2[ ca ] 3default_ca = CA_default 4 5[ CA_default ] 6x509_extensions = usr_cert 7 8[ req ] 9default_bits = 2048 10default_md = sha256 11default_keyfile = privkey.pem 12distinguished_name = req_distinguished_name 13attributes = req_attributes 14x509_extensions = v3_ca 15string_mask = utf8only 16 17[ req_distinguished_name ] 18 19[ req_attributes ] 20 21[ usr_cert ] 22basicConstraints = CA:FALSE 23nsComment = "OpenSSL Generated Certificate" 24subjectKeyIdentifier = hash 25authorityKeyIdentifier = keyid,issuer 26 27[ v3_ca ] 28subjectKe
评论 0
加载评论中...
