使用 FPA SDK 进行基于 HTTPS 协议的加速时,由于声网加速链路中 TLS 握手的影响,导致加速效果不明显。针对这个问题,声网提供了服务端 SSL 建连优化方案,即基于端侧数据加密的情况,将 TLS 交互后移,减少了 TLS 握手阶段的两个 RTT(TLS 1.2),降低整体建连时延。
参考以下步骤开通并使用服务端 SSL 连接优化方案。
联系技术支持开通服务端 SSL 建连优化方案。
修改客户端 SDK 的集成逻辑,将发送的 HTTPS 协议改为 HTTP 协议。
// Java
okHttpClient = new OkHttpClient.Builder()
.readTimeout(300,TimeUnit.SECONDS)
.writeTimeout(300,TimeUnit.SECONDS)
.proxy(new Proxy(HTTP, new InetSocketAddress("127.0.0.1", FpaProxyService.getInstance().getHttpProxyPort())))
.build();
// Objective-C
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.connectionProxyDictionary = @{
(id)kCFNetworkProxiesHTTPEnable:@YES,
(id)kCFNetworkProxiesHTTPProxy:@"127.0.0.1",
(id)kCFNetworkProxiesHTTPPort:@([[FpaProxyService sharedFpaProxyService] httpProxyPort]),
};
由于你将 HTTPS 协议修改为了 HTTP 协议,如果你的目标域名和端口需要 TLS 加密,则连接失败时会无法正常回退到本地连接,因为 SDK 的连接回退是基于 HTTP 协议的。
因此,声网建议你在使用服务端 SSL 连接优化方案的同时开启加密传输回退。同时,需要将源站端口改为你在服务端定义的加密端口。
你需要获取应用连接目标 IP 或域名所需的 CA 根证书。本文假设你已经将 CA 根证书安装在了开发环境,且你的开发环境是 macOS 操作系统:
在应用程序>>实用工具中打开钥匙串访问。
选择系统根证书,找到需要导出的根证书,右键点击并选择导出。本文以 Go Daddy Root Certificate Authority - G2 为例。
在弹出的对话框中将文件格式设置为增强保密邮件 (.pem)。
通过文本编辑器获取 .pem
文件的文本内容。类似以下结构:
----- BEGIN CERTIFICATE -----
<CERTIFICATE TEXT>
----- END CERTIFICATE -----
参考以下示例代码开启加密传输回退。你需要将上一步导出的 CA 根证书 .pem
文件的文本内容传入 FpaChainInfo
的 userCas
参数。
// Java
FpaHttpProxyChainConfig.Builder builder = new FpaHttpProxyChainConfig.Builder();
String[] cas = new String["PEM_CERTIFICATE"];
// 是否开启加密传输回退。true 为开启
builder.addChainInfo(123, "<Your IP or domain>", 443, true, true, cas, "hostname")
.fallbackWhenNoChainAvailable(true);
FpaProxyService.getInstance().setOrUpdateHttpProxyChainConfig(builder.build());
// Objective-C
FpaHttpProxyChainConfig *httpConfig = [[FpaHttpProxyChainConfig alloc] init];
NSArray *casArray = @[@"PEM_CERTIFICATE"];
NSMutableArray *array = [NSMutableArray array];
// 设置源站 IP 地址或域名与 chain ID 的映射表。
// 设置 FPA 服务的 chain ID,例如 123
FpaChainInfo *info = [FpaChainInfo fpaChainInfoWithChainId:201
// 源站 IP 地址或域名
address:@"<Your domain or IP>"
// 源站端口,需要将源站端口改为你在服务端定义的加密端口,例如 443
port:443
// 设置是否允许此加速通道在 FPA 代理连接失败时回退到本地连接
enableFallback:YES
// 是否开启加密传输回退。YES 为开启
enableCrypto:YES
userCas:casArray
verifyHost:@"HOSTNAME"];
[array addObject:info];
httpConfig.chainArray = [array copy];
// 开启 HTTP 代理在 FPA SDK 找不到源站对应的 chain ID 时的回退机制
httpConfig.fallbackWhenNoChainAvailable = YES;
// 调用 setOrUpdateHttpProxyChainConfig 开启设置
[[FpaProxyService sharedFpaProxyService] setOrUpdateHttpProxyChainConfig:httpConfig];
除此之外,你还可以在服务端开启一个支持对应业务的 HTTP 域名端口,并传入到 FPA SDK 相应加速链路的目标域名和端口参数。这样在回退之后,客户端与服务端依然可以保持 HTTP 连接。
// Java
FpaHttpProxyChainConfig.Builder builder = new FpaHttpProxyChainConfig.Builder();
String[] cas = new String[];
// 支持对应业务的 HTTP 域名或 IP
// 支持对应业务的源站端口
builder.addChainInfo(123, "<Your IP or domain>", 80, true, false, cas, "")
.fallbackWhenNoChainAvailable(true);
FpaProxyService.getInstance().setOrUpdateHttpProxyChainConfig(builder.build());
// Objective-C
FpaHttpProxyChainConfig *httpConfig = [[FpaHttpProxyChainConfig alloc] init];
NSArray *casArray = @[@""];
NSMutableArray *array = [NSMutableArray array];
// 设置源站 IP 地址或域名与 chain ID 的映射表。
// 设置 FPA 服务的 chain ID,例如 123
FpaChainInfo *info = [FpaChainInfo fpaChainInfoWithChainId:201
// 支持对应业务的 HTTP 域名或 IP
address:@"<Your domain or IP>"
// 支持对应业务的源站端口
port:8081
// 设置是否允许此加速通道在 FPA 代理连接失败时回退到本地连接
enableFallback:YES
// 是否开启加密传输回退。NO 为关闭
enableCrypto:NO
userCas:casArray
verifyHost:@""];