React Native应用实现SSL固定:iOS Identity Pinning与Android方案
React Native 无第三方包实现SSL证书固定(iOS/Android)
由于react-native-ssl-pinning已停止维护,我们可以直接通过iOS和Android的原生配置实现SSL证书固定,且该配置会自动覆盖React Native的网络请求(包括fetch、axios等)。
iOS 14+ 实现步骤
1. 获取证书的SPKI SHA-256哈希
使用OpenSSL命令获取目标域名证书的哈希值:
openssl s_client -connect your-domain.com:443 | openssl x509 -outform der | openssl dgst -sha256 -binary | openssl enc -base64
执行后会得到一串base64编码的哈希值,保存下来。
2. 配置Info.plist
在iOS项目的Info.plist文件中,添加或修改NSAppTransportSecurity字典,配置固定规则:
<key>NSAppTransportSecurity</key> <dict> <key>NSPinnedDomains</key> <dict> <key>your-domain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSPinnedCAIdentities</key> <array> <dict> <key>SPKI-SHA256</key> <string>这里替换成你获取的SHA-256哈希值</string> </dict> </array> </dict> </dict> </dict>
NSIncludesSubdomains:设为true时,子域名也会应用该固定规则- 可以添加多个
SPKI-SHA256条目,实现多证书备份(避免证书过期导致请求失败)
Android 实现步骤
1. 创建网络安全配置文件
在Android项目的res/xml目录下,新建network_security_config.xml文件(若xml目录不存在则手动创建),内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">your-domain.com</domain> <pin-set> <pin digest="SHA-256">这里替换成你获取的SHA-256哈希值</pin> <!-- 可选:添加备份证书的哈希值 --> <!-- <pin digest="SHA-256">备份证书的哈希值</pin> --> </pin-set> </domain-config> </network-security-config>
cleartextTrafficPermitted="false":禁止明文HTTP请求includeSubdomains="true":子域名同样应用规则- 建议添加至少一个备份证书哈希,防止主证书过期后应用无法访问服务
2. 关联配置到Manifest文件
打开AndroidManifest.xml,在application标签中添加networkSecurityConfig属性:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
注意事项
- 证书更新时,务必同步更新配置中的哈希值,否则应用会无法建立连接
- 测试阶段可以暂时关闭固定规则(iOS注释掉NSPinnedDomains,Android移除pin-set),方便调试
- 该方案依赖原生网络栈,React Native的所有网络请求都会自动遵循配置规则
内容的提问来源于stack exchange,提问作者Sandeep Sidhardhan -
相关产品推荐
相关产品推荐

