frp内网穿透自定义 TLS 协议加密
admin
2023-08-14 21:20:39
0

自定义 TLS 协议加密

use_encryption 和 STCP 等功能能有效防止流量内容在通信过程中被盗取,但是无法判断对方的身份是否合法,存在被中间人攻击的风险。为此 frp 支持 frpc 和 frps 之间的流量通过 TLS 协议加密,并且支持客户端或服务端单向验证,双向验证等功能。

当 frps.ini 的 common 中 tls_only = true 时,表示 server 端只接受 TLS 连接的客户端,这也是 frps 验证 frpc 身份的前提条件。如果 frps.ini 的 common 中 tls_trusted_ca_file 内容是有效的话,那么默认就会开启 tls_only = true

注意:启用此功能后除 xtcp 且 xtcp 的 protocol 配置为 kcp 外,可以不用再设置 use_encryption 重复加密

TLS 默认开启方式

从 v0.50.0 开始,tls_enable 的默认值将会为 true,默认开启 TLS 协议加密。

如果 frps 端没有配置证书,则会使用随机生成的证书来加密流量。

默认情况下,frpc 开启 TLS 加密功能,但是不校验 frps 的证书。

frpc 单向校验 frps 身份

# frpc.ini
[common]
tls_trusted_ca_file = /to/ca/path/ca.crt

# frps.ini
[common]
tls_cert_file = /to/cert/path/server.crt
tls_key_file = /to/key/path/server.key

frpc 需要额外加载 ca 证书,frps 需要额外指定 TLS 配置。frpc 通过 ca 证书单向验证 frps 的身份。这就要求 frps 的 server.crt 对 frpc 的 ca 是合法的。

合法: 如果证书是 ca 签发的,或者证书是在 ca 的信任链中,那即认为: 该证书对 ca 而言是合法的。

frps 单向验证 frpc 的身份

# frpc.ini
[common]
tls_cert_file = /to/cert/path/client.crt
tls_key_file = /to/key/path/client.key

# frps.ini
[common]
tls_trusted_ca_file = /to/ca/path/ca.crt

frpc 需要额外加载 TLS 配置,frps 需要额外加载 ca 证书。frps 通过 ca 证书单向验证 frpc 的身份。这就要求 frpc 的 client.crt 对 frps 的 ca 是合法的。

双向验证

# frpc.ini
[common]
tls_cert_file = /to/cert/path/client.crt
tls_key_file = /to/key/path/client.key
tls_trusted_ca_file = /to/ca/path/ca.crt

# frps.ini
[common]
tls_cert_file = /to/cert/path/server.crt
tls_key_file = /to/key/path/server.key
tls_trusted_ca_file = /to/ca/path/ca.crt

双向验证即 frpc 和 frps 通过本地 ca 证书去验证对方的身份。理论上 frpc 和 frps 的 ca 证书可以不同,只要能验证对方身份即可。

OpenSSL 生成证书示例

x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

如果出现上述报错,是因为 go 1.15 版本开始废弃 CommonName,因此推荐使用 SAN 证书。

下面简单示例如何用 openssl 生成 ca 和双方 SAN 证书。

准备默认 OpenSSL 配置文件于当前目录。此配置文件在 linux 系统下通常位于 /etc/pki/tls/openssl.cnf,在 mac 系统下通常位于 /System/Library/OpenSSL/openssl.cnf

如果存在,则直接拷贝到当前目录,例如 cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf。如果不存在可以使用下面的命令来创建。

cat > my-openssl.cnf << EOF
[ ca ]
default_ca = CA_default
[ CA_default ]
x509_extensions = usr_cert
[ req ]
default_bits        = 2048
default_md          = sha256
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes          = req_attributes
x509_extensions     = v3_ca
string_mask         = utf8only
[ req_distinguished_name ]
[ req_attributes ]
[ usr_cert ]
basicConstraints       = CA:FALSE
nsComment              = "OpenSSL Generated Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = CA:true
EOF

生成默认 ca:

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt

生成 frps 证书:

openssl genrsa -out server.key 2048

openssl req -new -sha256 -key server.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")) \
    -out server.csr

openssl x509 -req -days 365 -sha256 \
	-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com") \
	-out server.crt

生成 frpc 的证书:

openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
    -out client.csr

openssl x509 -req -days 365 -sha256 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") \
	-out client.crt

在本例中,server.crt 和 client.crt 都是由默认 ca 签发的,因此他们对默认 ca 是合法的。

相关内容

Actix_web服务器获...
在Actix-web服务器中获取自己的TLS证书可以通过以下步骤完...
2024-05-23 00:22:53
ActiveMQ TLS主...
要实现ActiveMQ TLS主机名验证,可以使用Java的SSL...
2024-05-21 00:51:10
acme/autocert...
问题描述:当使用 acme/autocert 包创建一个 TLS ...
2024-05-19 00:56:17
AADSTS1002016...
2024-05-14 00:15:37
frp内网穿透自定义 TL...
自定义 TLS 协议加密 use_encryption ...
2023-08-14 21:20:39
Fedora 38 使用内...
随着 Fedora 37 即将在 10 月底发布,明年春天 Fed...
2023-08-04 12:01:47

热门资讯

QQ音乐提示代理模式可能无法正... QQ音乐提示代理模式可能无法正常访问,如上图所示,是怎么回事呢? 这个可能和你的网络设置有关系,首先...
frp内网穿透配置 HTTP ... HTTP 类型的代理相比于 TCP 类型,不仅在服务端只需要监听一个额外的端口 vhost_http...
当前安全设置不允许下载该文件的... 今天新装了一台服务器 在服务器上准备安装下载chrome浏览器,结果发现不能下载,提示当前安全设置不...
premiere提示“项目看来... 有可能是pr的版本不一致造成的 可以选择 换个pr的版本就好了,或者换台电脑,千万不要乱删 或者新建...
为什么我的局域网传输最高速度只... 网络传输的最高速度取决于你网络中瓶颈最小值。 比如传输的两台电脑 路由器等一切传输设备的限制。 这个...
经常被陌生人拉进一堆莫名奇妙的... 经常莫名其妙拉进去陌生的QQ群,大部分都是炒股之类的。 这个怎么屏蔽? 首先打开手机QQ群,进入设置...
安装CAD提示错误1327 驱... 安装的cad中出现错误1327,安装中出现问题,停止安装,请插入某驱动器“错误1327驱动器无效:D...
电脑上如何更新视频号 微信推出视频号之后,受到不少的关注,之前一直没有重视。现在打算测试一下。 正好最近视频号助手也开始内...
QQ不能登录,提示号码被回收,... 今天登陆之前注册的一个QQ号码提示 QQ被回收了,真实气死人,之前都没有回收这回事,不知道什么时候,...
安装AutoCAD提示错误13... 今天安装AutoCAD提示错误1327,驱动器F:无效 第一次遇到这种情况 上网搜索了很多解决办法都...