React Native SSL Pinning 安卓iOS双端哈希密钥校验失败问题咨询
核心结论
哈希密钥不需要服务端做任何对应配置,所有公钥哈希校验逻辑都在客户端侧执行,你遇到的双端校验失败问题,是本地计算的哈希值错误、配置格式有误或者网络栈适配问题导致的。
具体排查解决步骤
- 计算正确的公钥哈希
iOS要求的哈希值是证书公钥的SHA-256哈希的Base64编码值,不是整个PEM证书文件的哈希,直接对PEM文件做哈希计算会得到错误结果。你可以在终端运行以下命令得到正确值,替换命令中的证书文件路径为你自己的PEM文件路径:openssl x509 -in your_cert.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64 - 校验双端配置格式
- 安卓端:在
network_security_config.xml中按以下格式配置,确保哈希值没有多写空格、换行,digest属性指定为SHA-256:
<domain-config> <domain includeSubdomains="true">你的业务域名</domain> <pin-set> <pin digest="SHA-256">上一步计算得到的哈希值</pin> <!-- 建议额外配置一个备用哈希,对应备用证书/CA,避免证书更新后应用无法联网 --> </pin-set> </domain-config>- iOS端:在Info.plist的ATS配置中,注意如果是锚定CA证书就填在
NSPinnedCAIdentities字段下,如果是锚定叶子证书就填在NSPinnedLeafIdentities字段下,不要填错字段:
<key>NSAppTransportSecurity</key> <dict> <key>NSPinnedDomains</key> <dict> <key>你的业务域名</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSPinnedCAIdentities</key> <array> <dict> <key>SPKI-SHA256-BASE64</key> <string>上一步计算得到的哈希值</string> </dict> </array> </dict> </dict> </dict> - 安卓端:在
- 排查React Native网络栈适配问题
如果你在RN中使用了自定义网络栈的第三方请求库,部分这类库不会读取系统层的Network Configuration和ATS配置,需要单独给对应的库配置SSL pinning规则才会生效。
报错说明
你遇到的Text handshake failed; returned -1, SSL error code 1, net_error -202报错就是典型的客户端校验服务端返回的证书公钥哈希与本地配置不匹配,导致SSL握手直接中断。
内容的提问来源于stack exchange,提问作者Kamil Fuz
相关产品推荐
相关产品推荐

