Azure Application Gateway+APIM架构下实现SSL pinning的方案咨询
场景下SSL Pinning实现可行性与方案
你所描述的架构完全可以在自研Android应用中实现SSL Pinning。公网用户与你的服务的SSL握手是在最外层的Azure Application Gateway层面完成的,内部私有APIM、AKS的证书属于集群内部链路凭证,不会暴露到公网,App侧无需感知。
常用实现方案
1. SPKI公钥哈希钉选(最推荐)
直接提取Application Gateway绑定的公网域名SSL证书的SPKI哈希值,将哈希值预设到Android应用代码中,SSL握手时校验服务端返回证书的SPKI哈希与预设值匹配即可放行。该方案不需要内置完整证书,证书续期时只要公钥不变就无需更新App。
以OkHttp网络库为例,实现代码参考:
// 替换为你的实际API域名和对应证书的SPKI SHA256哈希 val certPinner = CertificatePinner.Builder() .add("api.yourdomain.com", "sha256/abcdefghijklmnopqrstuvwxyz1234567890ABCDEFG=") // 可同时添加多个备用哈希,适配证书轮换场景 .add("api.yourdomain.com", "sha256/hijklmnopqrstuvwxyz1234567890ABCDEFGabcdefg=") .build() val okHttpClient = OkHttpClient.Builder() .certificatePinner(certPinner) .build()
2. 完整证书钉选
将Application Gateway的叶子证书内置到App的assets目录中,握手时对比服务端返回的证书与内置证书的内容完全一致才允许通信。该方案安全性最高,但证书更新时必须同步推送App新版本,灵活度最低。
3. CA证书钉选
钉住签发Application Gateway证书的根CA或中间CA的公钥,只要后续更新的证书是同一家CA签发就无需修改App配置,适合证书更换频率较高的场景,安全性略低于前两种方案。
注意事项
- 配置时建议至少同时录入当前在用证书和备用待轮换证书的哈希,避免证书到期切换时老版本App直接无法访问
- 如果后续开启APIM端到端加密配置,也不会影响公网侧的Pinning逻辑,只要Application Gateway对外的服务证书没有变化,原有Pinning规则即可正常生效
内容的提问来源于stack exchange,提问作者Vaibhav Singla
相关产品推荐
相关产品推荐

