自定义 TLS 协议加密

    frpc.inicommontls_enable = true 时,表示开启 TLS 协议加密。

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

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

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

    1. # frpc.ini
    2. [common]
    3. tls_enable = true
    4. tls_trusted_ca_file = /to/ca/path/ca.crt
    5. [common]
    6. tls_key_file = /to/key/path/server.key

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

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

    1. # frpc.ini
    2. [common]
    3. tls_enable = true
    4. tls_cert_file = /to/cert/path/client.crt
    5. tls_key_file = /to/key/path/client.key
    6. tls_trusted_ca_file = /to/ca/path/ca.crt
    7. # frps.ini
    8. [common]
    9. tls_cert_file = /to/cert/path/server.crt
    10. tls_key_file = /to/key/path/server.key

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

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

    如果出现上述报错,是因为 go 1.15 版本开始,因此推荐使用 SAN 证书。 如果想兼容之前的方式,需要设置环境变量 GODEBUGx509ignoreCN=0

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

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

    生成默认 ca:

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

    生成 frps 证书:

    生成 frpc 的证书:

    1. openssl genrsa -out client.key 2048
    2. openssl req -new -sha256 -key client.key \
    3. -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
    4. -reqexts SAN \
    5. -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
    6. -out client.csr
    7. openssl x509 -req -days 365 -sha256 \
    8. -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \

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