React Native对接Heroku托管API的SSL公钥固定方案咨询
Heroku 环境 React Native 公钥模式 SSL Pinning 落地方案
公钥哈希固定操作步骤
你不需要自己签发证书,直接固定Heroku证书链上层CA的公钥哈希即可,完全可以实现证书轮换无感知,具体操作如下:
- 第一步拉取你Heroku域名的完整证书链,计算各级证书的SPKI(公钥信息)SHA256哈希。直接在本地终端执行命令拉取证书链:
openssl s_client -connect myapp.herokuapp.com:443 -servername myapp.herokuapp.com -showcerts < /dev/null
输出结果里会包含从叶子证书、中间CA到根CA的完整证书链,把每一段-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----的内容单独存为pem文件,分别执行以下命令计算公钥哈希:openssl x509 -in 对应证书文件.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64 - 不要固定最外层叶子证书的哈希——Heroku默认域名的叶子证书每90天会自动轮换,固定叶子会导致证书轮换后所有请求失败。你只需要选中间CA、根CA两个及以上层级的公钥哈希存入客户端即可,这类上层CA的公钥通常3-5年以上才会变更,完全满足平滑轮换的需求。
- React Native端选择支持SPKI公钥哈希固定的网络库即可,不要用仅支持固定证书文件的方案。以常用的
react-native-ssl-pinning库为例,配置示例如下:
import { fetch } from 'react-native-ssl-pinning'; // 业务请求配置 fetch('https://myapp.herokuapp.com/api/your-path', { method: 'POST', body: {}, sslPinning: { pk256: [ // 填入你之前计算好的中间CA公钥哈希 "中间CA的base64格式sha256哈希", // 填入你之前计算好的根CA公钥哈希 "根CA的base64格式sha256哈希" ] } })
- 建议额外做公钥哈希的远程下发配置,不要把哈希值硬编码死在客户端,万一后续CA变更可以直接远程更新哈希列表,不需要发版。
旧版本兼容方案
完全不会影响现有线上旧版本用户,核心逻辑如下:
- SSL Pinning是客户端本地的校验逻辑,你不需要对Heroku服务端做任何HTTPS配置调整。所有未集成Pinning逻辑的旧版本App,发起请求时还是走系统默认的证书信任校验流程,和你上线Pinning之前的逻辑完全一致,不会出现请求失败的问题。
- 上线时按灰度节奏推进即可:
- 第一个集成Pinning的版本,默认加远程开关控制Pinning逻辑是否启用,初始版本默认关闭校验,先小范围安装测试,确认哈希配置正确、请求无异常后再逐步放量开启。
- 等集成Pinning能力的新版本覆盖率达到你的业务要求阈值后,再考虑全量开启,全程旧版本用户无感知。
- 远程开关同时保留降级能力,如果出现证书链异常、CA变更等突发情况,可以临时关闭Pinning校验,先保障业务可用性再做修复。
内容的提问来源于stack exchange,提问作者Gigalink
相关产品推荐
相关产品推荐

