You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native iOS模块使用Jetfire实现WSS SSL固定时崩溃排查

React Native iOS WSS SSL Pinning(Jetfire库)EXC_BAD_ACCESS错误修复

错误原因排查

EXC_BAD_ACCESS在SecTrustCreateWithCertificates处触发,核心原因是传入的参数无效:

  • 证书数据cert格式错误或未正确加载
  • 安全策略policy为nil或已被提前释放

针对性修复步骤

1. 确保证书格式与加载逻辑正确

Jetfire的JFRSSLCert initWithData:要求证书为DER格式(.cer通常默认是DER,但如果是PEM格式需转换)。如果你的证书是PEM格式,需先转成DER:

NSString *certString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 移除PEM头尾标记和空白字符
certString = [certString stringByReplacingOccurrencesOfString:@"-----BEGIN CERTIFICATE-----" withString:@""];
certString = [certString stringByReplacingOccurrencesOfString:@"-----END CERTIFICATE-----" withString:@""];
certString = [certString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// Base64解码得到DER格式数据
NSData *data = [[NSData alloc] initWithBase64EncodedString:certString options:NSDataBase64DecodingIgnoreUnknownCharacters];

2. 完善证书加载的错误拦截

当前代码在证书加载失败后仍继续执行后续逻辑,会导致无效数据流入JFRSecurity,必须提前终止流程:

NSString *path = [[NSBundle mainBundle] pathForResource:@"rootCA_public" ofType:@"cer"];
NSData *data = [NSData dataWithContentsOfFile:path];

if (!data) {
    NSLog(@"Failed to load certificate. Check the file path.");
    callback(@[ @"Failed to load certificate.", [NSNull null]]);
    return; // 终止后续逻辑,避免使用无效数据
}
NSLog(@"Certificate loaded successfully!");

3. 手动指定安全策略(规避Jetfire内部可能的policy异常)

如果上述步骤无效,可手动创建SSL策略并传入JFRSecurity,替换默认逻辑:

// 创建SSL/TLS安全策略
SecPolicyRef policy = SecPolicyCreateSSL(true, (__bridge CFStringRef)url.host);
// 初始化安全配置并绑定自定义策略
JFRSecurity *security = [[JFRSecurity alloc] initWithCerts:@[[[JFRSSLCert alloc] initWithData:data]] publicKeys:YES];
security.policy = policy;
self.socket.security = security;
CFRelease(policy); // 手动释放CF类型对象

4. 验证证书是否正确加入项目Bundle

确认rootCA_public.cer已正确添加到Xcode项目:

  • 右键项目 -> 选择Add Files to "YourProject"
  • 勾选Copy items if needed和对应Target
  • 在Build Phases -> Copy Bundle Resources中确认证书存在

额外注意事项

  • Objective-C中CF类型对象(如SecPolicyRef、SecTrustRef)需手动管理内存,避免内存泄漏或野指针
  • 测试时可先关闭SSL Pinning(设置publicKeys:NO),确认WSS连接正常后再逐步开启Pinning排查问题

内容的提问来源于stack exchange,提问作者R_Shobu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:07:18