KurrentDB 协议安全(Protocol Security)完全指南:TLS/HTTPS 证书配置、生成与集群部署实战
数据库后端流处理【免费下载链接】EventStoreKurrentDB is a database thats engineered for modern software applications and event-driven architectures. Its event-native design simplifies data modeling and preserves data integrity while the integrated streaming engine solves distributed messaging challenges and ensures data consistency.项目地址https://gitcode.com/gh_mirrors/ev/EventStore点击查看免费下载导读KurrentDB 的 gRPC、专有 TCP 协议及管理类 HTTP 端点全部支持 TLS/SSL 加密传输节点间互信建立在严格的双向证书校验之上。本文基于官方协议安全文档结合仓库源码src/KurrentDB.Core/Configuration/ClusterVNodeOptions.cs、src/KurrentDB.Core/Certificates/OptionsCertificateProvider.cs等系统讲解证书配置参数、es-gencert-cli证书生成工具、客户端信任安装与中间 CA 证书处理帮助你为生产集群正确部署带完整安全链的 KurrentDB。一、KurrentDB 协议安全全景哪些协议需要保护KurrentDB 面向高吞吐实时通信提供 gRPC 与专有 TCP 协议同时也保留部分用于管理操作的 HTTP 端点如垃圾回收 scavenging、创建投影 projection 等。集群 gossip 种子端点同样使用 HTTP它既服务于集群节点之间的 gossip也服务于使用 discovery 模式连接集群的客户端。所有这些协议都支持 TLS/SSL 加密。无论 TLS 还是 HTTPSKurrentDB 只使用同一套证书这意味着你只需为节点准备一套证书即可同时覆盖客户端应用 / 其他节点连接到本节点时的服务端认证server authentication本节点主动连接其他节点时的客户端认证client authentication。协议安全的配置与部署拓扑、运行平台强相关。官方提供交互式配置工具外部链接仅作背景说明其中包含如何生成、安装证书并配置节点的完整指引。::: note 非生产场景的快速通道 对于非生产环境有两个运行模式可以跳过本页大部分配置--insecure完全禁用 TLS同时关闭认证与授权所有数据明文传输详见 security-options.md 中的 Running without security--dev开发模式自动生成自签名证书供本地使用默认有效期一个月详见 security-options.md 中的 Development mode。 :::在仓库源码中上述仅一例证书、双重用途的设计可以直接验证。例如 CertificateExtensions.cs 中IsServerCertificate(...)当节点以服务端身份被连接时校验证书要求具备serverAuthEKUOID1.3.6.1.5.5.7.3.1并在默认情况下同时要求clientAuthEKUOID1.3.6.1.5.5.7.3.2IsClientCertificate(...)当节点以客户端身份连接其他节点时校验同样要求clientAuthEKU 以及Digital SignatureKey Encipherment/Key Agreement的 Key Usage。二、证书配置参数详解本节是证书配置的核心。所有配置项均支持命令行、YAML 与环境变量三种方式仓库中的选项定义位于 ClusterVNodeOptions.csCertificateFileOptions、CertificateOptions、CertificateStoreOptions三个 option group。2.1 Certificate common name节点证书通用名SSL 证书的 Common NameCN可以是任意字符串通常包含证书签发的 DNS 名。KurrentDB 节点之间互连时需要确认对方确实是集群节点而非冒名顶替者。为此每个节点在认证入站节点时要求对方提供受信任的客户端证书且其 CN 必须与本节点证书的 CN 完全一致这意味着默认情况下所有节点证书的 CN 必须相同。例如使用证书生成工具时所有节点证书的 CN 统一为eventstoredb-node。自动配置与显式覆盖KurrentDB 默认会自动读取节点证书的 CN 并用作CertificateReservedNodeCommonName但如果你在配置中显式指定了该选项则以显式值为准显式值优先。从源码看这一逻辑实现在 OptionsCertificateProvider.cs若配置了CertificateReservedNodeCommonName则校验节点自身证书 CN 是否与该值匹配不匹配则加载失败若未配置则自动取节点证书的 CN。通配符场景实践中并非总能拿到所有节点 CN 相同的证书。例如使用公共 CA 时单域名证书每个证书只对一个主机有效非常普遍无法跨节点复用。此时可将CertificateReservedNodeCommonName配置为通配符假设节点域名为node1.kurrentdb.mycompany.org、node2.kurrentdb.mycompany.org、node3.kurrentdb.mycompany.org则CertificateReservedNodeCommonName: *.kurrentdb.mycompany.org格式语法命令行--certificate-reserved-node-common-nameYAMLCertificateReservedNodeCommonName环境变量KURRENTDB_CERTIFICATE_RESERVED_NODE_COMMON_NAMECN 匹配的细节可进一步参考 CertificateExtensions.cs 的ClientCertificateMatchesName通配符 CN如*.test.com与配置名做精确的忽略大小写匹配普通 CN 则按 RFC 6125 规范匹配部分通配符已弃用且暂不支持 SRV-ID / URI-ID 类型。::: warning 节点服务端证书必须包含内部与外部 IP 地址ReplicationIp与NodeIp或 DNS 名作为 Subject Alternative NamesSAN否则节点间连接会被拒绝。 :::这一点在节点认证实现中同样可见NodeCertificateAuthenticationProvider.cs 会检查入站证书是否包含 IP 或 DNS 类型的 SAN并在缺失时拒绝连接并记录错误日志。2.2 Disable client authentication EKU validation禁用客户端认证 EKU 校验如前所述KurrentDB 节点使用同一张 TLS 证书承担两种角色客户端应用或其他节点连接它时它作为服务端进行认证它连接其他节点时作为客户端进行认证。当一个节点认证入站的另一个节点时默认遵循 RFC 5280 第 4.2.1.12 节要求连接节点的证书包含clientAuth扩展密钥用法EKU或者证书完全不使用 EKU。将DisableClientAuthEkuValidation设为true可以跳过对clientAuthEKU 的强制要求但链信任、有效期和 CN 校验仍然会执行。请结合自身部署情况评估是否启用。该选项的典型使用场景允许 KurrentDB 使用由公共 CA 签发的证书。受 Chrome Root Program 政策变化驱动公共 CA 正在逐步停止签发带clientAuthEKU 的证书。重要边界该设置不影响用户证书对用户的认证——用户证书仍然必须包含clientAuthEKU。格式语法命令行--disable-client-auth-eku-validationYAMLDisableClientAuthEkuValidation环境变量KURRENTDB_DISABLE_CLIENT_AUTH_EKU_VALIDATION默认值false源码佐证EKU 校验逻辑集中在 CertificateExtensions.cs 的IsServerCertificate(certificate, disableClientAuthEkuValidation, ...)——当证书带有 EKU 扩展时除要求serverAuth外仅当disableClientAuthEkuValidation为false时才要求clientAuth。而IsClientCertificate用于用户证书则始终要求clientAuthEKU见同一文件 第 308-320 行。测试用例 key_usages.cs 也验证了该行为仅含serverAuthEKU 的证书在DisableClientAuthEkuValidationfalse时不能作为服务端证书失败信息中会提示查看该配置项在true时则可以。2.3 Trusted root certificates受信任的根证书路径服务器在收到入站连接时需要判断连接所用的证书是否可信因此必须知道受信任根证书的位置在Linux上KurrentDB 默认使用/etc/ssl/certs源码中该默认值定义于 Locations.cs 的DefaultTrustedRootCertificateDirectory在Windows或默认证书位置不同的平台上需要显式告知节点使用 OS 默认根证书存储对于私有 CA 签发的证书只需提供 CA 证书文件所在目录路径注意是目录不是文件名。若在 Windows 上运行还可以从 Windows 证书存储加载受信任根证书具体选项见下文证书存储Windows。格式语法命令行--trusted-root-certificates-pathsYAMLTrustedRootCertificatesPath环境变量KURRENTDB_TRUSTED_ROOT_CERTIFICATES_PATH默认值Windows 上无默认值Linux 上为/etc/ssl/certs。2.4 证书文件加载CertificateFile 系列CertificateFile指向集群节点将使用的证书文件格式语法命令行--certificate-fileYAMLCertificateFile环境变量KURRENTDB_CERTIFICATE_FILE如果证书文件受密码保护需要设置CertificatePassword以便服务器加载证书格式语法命令行--certificate-passwordYAMLCertificatePassword环境变量KURRENTDB_CERTIFICATE_PASSWORD如果证书文件本身不包含私钥需要用CertificatePrivateKeyFile指定私钥文件位置私钥支持 RSA 或 PKCS#8 格式格式语法命令行--certificate-private-key-fileYAMLCertificatePrivateKeyFile环境变量KURRENTDB_CERTIFICATE_PRIVATE_KEY_FILE如果私钥文件是加密的 PKCS#8文件还需用CertificatePrivateKeyPassword提供密码格式语法命令行--certificate-private-key-passwordYAMLCertificatePrivateKeyPassword环境变量KURRENTDB_CERTIFICATE_PRIVATE_KEY_PASSWORD源码补充ClusterVNodeOptions.cs 中明确CertificateFile支持 PKCS#12.p12/.pfx或 X.509.pem、.crt、.cer、.der证书若包含中间证书应将其与节点证书捆绑在同一 PEM 或 PKCS#12 文件中节点证书在前中间证书在后。CertificatePassword与CertificatePrivateKeyPassword均标记为[Sensitive]属于敏感配置项。2.5 证书存储WindowsWindows 上可通过证书存储加载节点证书。证书存储位置store location例如CurrentUser格式语法命令行--certificate-store-locationYAMLCertificateStoreLocation环境变量KURRENTDB_CERTIFICATE_STORE_LOCATION证书存储名称store name例如My格式语法命令行--certificate-store-nameYAMLCertificateStoreName环境变量KURRENTDB_CERTIFICATE_STORE_NAME可以通过**指纹thumbprint或主题名subject name**加载证书使用指纹时服务器期望证书存储中只有一个证书与该指纹匹配格式语法命令行--certificate-thumbprintYAMLCertificateThumbprint环境变量KURRENTDB_CERTIFICATE_THUMBPRINT主题名会匹配所有包含指定名称的证书因此可能找到多个匹配。要匹配es-gencert-cli工具生成的任意证书可将主题名设为eventstoredb-node。若找到多个匹配证书则选择到期日期最晚的那一个格式语法命令行--certificate-subject-nameYAMLCertificateSubjectName环境变量KURRENTDB_CERTIFICATE_SUBJECT_NAME当从 Windows 证书存储加载节点证书时通常也希望从证书存储加载受信任根证书相关选项与节点证书的选项类似受信任根证书的存储位置例如CurrentUser格式语法命令行--trusted-root-certificate-store-locationYAMLTrustedRootCertificateStoreLocation环境变量KURRENTDB_TRUSTED_ROOT_CERTIFICATE_STORE_LOCATION受信任根证书的存储名称例如Root格式语法命令行--trusted-root-certificate-store-nameYAMLTrustedRootCertificateStoreName环境变量KURRENTDB_TRUSTED_ROOT_CERTIFICATE_STORE_NAME受信任根证书同样可以用指纹或主题名加载使用指纹时服务器期望证书存储中只有一个根证书与该指纹匹配格式语法命令行--trusted-root-certificate-thumbprintYAMLTrustedRootCertificateThumbprint环境变量KURRENTDB_TRUSTED_ROOT_CERTIFICATE_THUMBPRINT主题名匹配所有包含指定名称的证书。要匹配通过es-gencert-cli生成的根证书可将主题名设为EventStoreDB CA。若找到多个匹配的根证书则选择到期日期最晚的那一个格式语法命令行--trusted-root-certificate-subject-nameYAMLTrustedRootCertificateSubjectName环境变量KURRENTDB_TRUSTED_ROOT_CERTIFICATE_SUBJECT_NAME2.6 一个完整的节点配置示例把上面的参数串起来一个典型的 Linux 节点使用私有 CA 文件目录 PEM 证书 分离私钥配置如下CertificateFile: /etc/kurrentdb/certs/node.crt CertificatePrivateKeyFile: /etc/kurrentdb/certs/node.key TrustedRootCertificatesPath: /etc/kurrentdb/certs/ca CertificateReservedNodeCommonName: eventstoredb-node DisableClientAuthEkuValidation: false在 Docker Compose 部署中这些参数通常以环境变量形式注入仓库自带的三节点安全集群样例 docker-compose-cluster.yaml 就展示了这一组合environment: - KURRENTDB_REPLICATION_IP172.30.240.11 - KURRENTDB_GOSSIP_SEED172.30.240.12:2113,172.30.240.13:2113 - KURRENTDB_TRUSTED_ROOT_CERTIFICATES_PATH/certs/ca - KURRENTDB_CERTIFICATE_FILE/certs/node1/node.crt - KURRENTDB_CERTIFICATE_PRIVATE_KEY_FILE/certs/node1/node.key三、启动时的证书校验节点如何自检证书配置正确与否KurrentDB 会在启动时进行严格自检。从 OptionsCertificateProvider.cs 可以看到完整的加载流程TLS 关闭时跳过加载如果应用设置了TlsDisabled直接返回Skipped加载节点证书与中间证书读取CertificateFile指定的证书及其捆绑的中间证书确定保留节点 CN显式配置的CertificateReservedNodeCommonName优先并校验其与节点自身证书 CN 一致否则自动取节点证书 CN加载受信任根证书从TrustedRootCertificatesPath或 Windows 证书存储加载逐项校验节点证书必须是有效节点证书IsValidNodeCertificate中间证书只能捆绑中间 CA不能混入根证书且必须存在受信任根证书否则加载失败构建证书链用节点自身证书、中间证书、受信任根证书构建完整链BuildChain任何链错误都会导致校验失败并输出详细错误信息。这个自检机制意味着中间证书遗漏、根证书误捆绑、SAN 缺失、EKU 不匹配等问题都会在启动阶段被尽早发现而不是等到节点间首次建连时才暴露。四、证书生成工具es-gencert-cliKurrent 提供交互式证书生成 CLI用于创建由私有、自动生成的 CA签发的 KurrentDB 证书。官方配置向导会直接给出与你配置匹配的精确 CLI 命令。4.1 获取与基本用法该 CLI 在 GitHub 仓库EventStore/es-gencert-cli发布提供 Windows、Linux、macOS 二进制同时发布 Docker 镜像。外部链接仅作背景说明本仓库不包含该工具的源码。基本用法./es-gencert-cli [options] command [args]查看某个具体命令的帮助./es-gencert-cli -help command::: warning 在 Linux 上运行 KurrentDB 时所有证书文件的权限必须严格受限否则操作系统不允许使用会出现 permissions are too open 错误。通常需要对每个证书文件执行chmod 600 [file]:::4.2 生成 CA 证书第一步是生成 CA 证书。它需要在每个节点和客户端环境中被信任。默认情况下工具会在你创建的certs目录下创建ca子目录生成两个密钥文件ca.crt公共文件节点和客户端配置都需要使用ca.key私钥文件只能用于节点配置切勿复制到客户端环境。CA 证书会以预定义的 CNeventstoredb-node生成。生成 CA 证书./es-gencert-cli create-ca可自定义参数参数说明-days证书有效期天默认 5 年-out输出目录默认./ca示例./es-gencert-cli create-ca -out ./kurrentdb-ca4.3 生成节点证书需要为每个节点生成由 CA 签名的证书且只应安装在对应节点机器上。默认情况下工具会在certs目录下为每个节点创建子目录生成两个密钥文件node.crt公共文件节点和客户端配置都需要使用node.key私钥文件只能用于节点配置切勿复制到客户端环境。生成节点证书前先查看帮助./es-gencert-cli -help create_node可自定义参数参数说明-ca-certificateCA 证书文件路径默认./ca/ca.crt-ca-keyCA 密钥文件路径默认./ca/ca.key-days证书有效期天-out输出目录默认./nodeXX 为自动生成的编号-ip-addresses节点的 IP 地址列表逗号分隔-dns-names节点的 DNS 名列表逗号分隔::: warning 生成证书时必须同时把内部和外部地址传给工具IP 地址传给-ip-addresses例如127.0.0.1,172.20.240.1DNS 名传给-dns-names例如localhost,node1.kurrentdb它们必须与访问 KurrentDB 节点时使用的 URL 匹配即作为证书的 SAN。 :::示例./es-gencert-cli create-node \ -ca-certificate ./kurrentdb-ca/ca.crt \ -ca-key ./kurrentdb-ca/ca.key \ -out ./node1 \ -ip-addresses 127.0.0.1,172.20.240.1 \ -dns-names localhost,node1.kurrentdb4.4 用 Docker 运行证书生成工具也可以使用 Docker 交互式容器运行该工具docker run --rm -i eventstore/es-gencert-cli command options一个非常实用的场景是在启动集群节点之前用 Docker Compose 一次性生成所有必要证书。仓库中的 docker-compose-cluster.yaml 正是官方三节点安全集群的完整实现services: setup: image: eventstore/es-gencert-cli:1.0.2 entrypoint: bash user: 1000:1000 command: -c mkdir -p ./certs cd /certs es-gencert-cli create-ca es-gencert-cli create-node -out ./node1 -ip-addresses 127.0.0.1,172.30.240.11 -dns-names localhost es-gencert-cli create-node -out ./node2 -ip-addresses 127.0.0.1,172.30.240.12 -dns-names localhost es-gencert-cli create-node -out ./node3 -ip-addresses 127.0.0.1,172.30.240.13 -dns-names localhost find . -type f -print0 | xargs -0 chmod 666 container_name: setup volumes: - certs:/certs启动前需要手动创建certs目录否则容器无法获得写权限mkdir certs docker compose up完整的三节点安全集群 Docker Compose 配置见 samples/server/docker-compose-cluster.yaml共享环境变量见 samples/server/vars.env更多细节可参考 安装指南中的 Use Docker Compose 章节。集群启动完成后各节点 HTTP 端口对应关系见 installation.md节点HTTP 端口node12111node22112node32113客户端需使用安全连接gRPCkurrentdb://localhost:2111,localhost:2112,localhost:2113?tlstruetlsVerifyCertfalse其中tlsVerifyCertfalse仅用于跳过私有 CA 的证书校验错误生产环境不建议使用正确做法是把 CA 证书加入客户端受信任根存储见下文。五、客户端环境安装证书要连接 KurrentDB需要将自动生成的 CA 证书文件安装到客户端机器例如客户端所在主机或你的开发环境。Linux将自动生成的 CA 文件复制到/usr/local/share/ca-certificates/sudo cp ca.crt /usr/local/share/ca-certificates/event_store_ca.crt更新 CA 存储sudo update-ca-certificatesWindows通过证书本地计算机管理控制台手动导入到本地 CA 证书存储从开始菜单选择运行输入certmgr.msc然后将证书导入到Trusted Root Certification受信任的根证书颁发机构。或者运行 PowerShell 脚本Import-Certificate -FilePath .\certs\ca\ca.crt -CertStoreLocation Cert:\CurrentUser\RootmacOS在 Mac 的钥匙串访问Keychain Access应用中选择登录钥匙串或系统钥匙串将证书文件拖入钥匙串访问窗口。如果提示输入名称和密码请输入管理员账户的名称和密码。也可以运行 bash 脚本sudo security add-certificates -k /Library/Keychains/System.keychain ca.crt六、中间 CA 证书处理KurrentDB 支持中间 CA 证书做法是把它们打包进由CertificateFile配置参数指定的PEM 或 PKCS#12 bundle中。为保证配置正确节点启动时会用节点自身证书校验整个证书链。什么情况下会用到中间 CA如果使用证书生成工具的默认设置生成 CA 和节点证书则不会使用中间 CA如果使用公共 CA例如 Lets Encrypt签发节点证书则很可能在不知情的情况下使用了中间 CA。这是因为 Authority Information Access (AIA) 扩展允许中间证书从远程服务器获取。如何确认证书使用了 AIA 扩展检查证书中是否存在名为Authority Information Access的字段Linux 上用 openssl 查看openssl x509 -in /path/to/node.crt -text | grep Authority Information Access -A 1Windows 上打开证书进入Details详细信息标签页查找Authority Information Access字段。如果存在该扩展可以从CA Issuers条目中的 URL 手动下载中间证书。注意通常需要把下载的证书从DER格式转换为PEM格式openssl x509 -inform der -in /path/to/cert.der /path/to/cert.pem链中可能存在多个中间 CA需要检查刚下载的证书是否也使用了 AIA 扩展如果是重复上述过程下载链中的下一个中间 CA 证书直到最终到达公共受信任的根证书此时Subject与Issuer字段一致。实践中链中通常最多有两个中间证书。6.1 打包中间证书节点证书必须位于 bundle 的首位之后是中间证书。中间证书之间的顺序可以任意但按惯例最好从叶到根排列。根证书不应被打包进 bundle。以下示例中中间证书从叶开始向上编号为 1 到 N。PEM 格式如果节点证书与中间 CA 证书都是 PEM 格式以-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾直接把中间证书文件内容追加到节点证书文件末尾即可Linuxcat /path/to/intermediate1.crt /path/to/node.crt ... cat /path/to/intermediateN.crt /path/to/node.crtWindowstype C:\path\to\intermediate1.crt C:\path\to\node.crt ... type C:\path\to\intermediateN.crt C:\path\to\node.crtPKCS#12 格式从 PEM 证书生成 PKCS#12 bundle 的步骤如下cat /path/to/intermediate1.crt ./ca_bundle.crt ... cat /path/to/intermediateN.crt ./ca_bundle.crt openssl pkcs12 -export -in /path/to/node.crt -inkey /path/to/node.key -certfile ./ca_bundle.crt -out /path/to/node.p12 -passout pass:password6.2 将中间证书加入证书存储中间证书也需要加入当前用户的证书存储原因有二TLS 连接建立时需要发送完整证书链如果证书使用 AIA 扩展加入存储可避免连接时下载证书从而提升性能。Linux以下脚本假设 KurrentDB 以kurrent账户运行sudo su kurrent --shell /bin/bash dotnet tool install --global dotnet-certificate-tool ~/.dotnet/tools/certificate-tool add -s CertificateAuthority -l CurrentUser --file /path/to/intermediate.crtWindows在 KurrentDB 运行的同一账户下将中间证书导入Intermediate Certification Authorities中间证书颁发机构存储Import-Certificate -FilePath .\path\to\intermediate.crt -CertStoreLocation Cert:\CurrentUser\CA可选以管理员身份将中间证书导入Local Computer存储Import-Certificate -FilePath .\ca.crt -CertStoreLocation Cert:\LocalMachine\CA七、常见问题与排查建议结合本文与源码梳理几个高频问题permissions are too openLinux 上证书文件权限过宽对每个证书文件执行chmod 600见上文警告。节点间连接被拒绝日志提示 CN 不匹配检查CertificateReservedNodeCommonName是否在所有节点上一致或使用了正确的通配符参考 NodeCertificateAuthenticationProvider.cs 中的错误日志。证书缺少 SAN 导致拒绝生成节点证书时务必同时传-ip-addresses含ReplicationIp与NodeIp和-dns-names。使用公共 CA 证书报 EKU 错误确认是否缺少clientAuthEKU评估后可将DisableClientAuthEkuValidation设为true但用户证书认证不受该选项影响仍要求clientAuthEKU。中间证书缺失导致链不完整把中间证书按叶 → 根顺序追加进CertificateFile指向的 PEM/PKCS#12 bundle根证书不要打包并加入当前用户的证书存储启动日志中的链构建错误信息可帮助定位OptionsCertificateProvider.cs。Windows 上从证书存储加载若找不到节点证书检查CertificateStoreLocation/CertificateStoreName是否正确指纹匹配要求存储中唯一主题名匹配时多张证书会选取最晚到期者。八、关联文档与源码索引协议安全官方文档主体本文对应的 protocol-security.md安全选项总览--insecure、--dev、DisableTls、FIPS、加密静态数据等security-options.md配置项定义与默认值ClusterVNodeOptions.cs证书加载与启动自检OptionsCertificateProvider.csCN/SAN/EKU 校验实现CertificateExtensions.cs节点证书认证HTTP 传输层NodeCertificateAuthenticationProvider.csEKU 相关单元测试key_usages.cs三节点安全集群 Docker Compose 样例docker-compose-cluster.yaml、vars.env快速安装与连接串说明installation.md赞分享数据库后端流处理【免费下载链接】EventStoreKurrentDB is a database thats engineered for modern software applications and event-driven architectures. Its event-native design simplifies data modeling and preserves data integrity while the integrated streaming engine solves distributed messaging challenges and ensures data consistency.项目地址https://gitcode.com/gh_mirrors/ev/EventStore点击查看免费下载相关推荐Nomad TLS 演示配置完全指南从证书生成到 HTTPS 加密部署Nomad TLS 演示配置完全指南从证书生成到 HTTPS 加密部署 导读 本文基于 Nomad 仓库中的 demo/tls https://link.gi任务调度云原生运维后端OkHttp HTTPS安全TLS配置与证书管理OkHttp HTTPS安全TLS配置与证书管理 本文全面介绍了OkHttp在HTTPS安全通信方面的核心功能包括TLS版本与密码套件支持、四种连接规范的配后端通信移动开发网络Sanic TLS/SSL/HTTPS 完全指南从单证书配置到 SNI 多域名部署Sanic TLS/SSL/HTTPS 完全指南从单证书配置到 SNI 多域名部署 本文基于当前仓库 guide/content/en/guide/how t后端Web框架上一篇TestDisk PhotoRec开源数据恢复终极指南从分区修复到文件拯救的完整解决方案下一篇WebToEpub3分钟将网页小说转为EPUB电子书的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考