已上线Android应用SSL证书更新及Retrofit适配相关问题咨询
Retrofit Android 应用SSL证书相关问题解答
一、已投入使用的应用如何更新SSL证书
根据你应用之前的SSL校验配置不同,更新方式分为两类:
- 未配置证书绑定(使用系统默认CA信任链)
无需修改任何客户端代码,仅需要在服务端部署由受信任CA机构签发的新SSL证书即可,终端用户无感知,Retrofit默认会信任由正规CA签发的有效证书。 - 已配置证书绑定(含公钥绑定、证书文件绑定、自签名证书信任)
分两种处理方案:- 提前预埋方案:每次发版时提前在代码中预埋未来要更换的新证书公钥哈希/证书文件,比如使用OkHttp的
CertificatePinner时同时保留新旧证书的哈希值,等服务端完成新证书切换后,再在后续版本中逐步移除旧证书的配置即可,用户无需紧急升级。 - 紧急更新方案:如果未提前预埋新证书信息,需要立即修改客户端中的证书绑定配置,替换为新证书的相关信息,重新打包发版后引导用户升级,否则旧版本应用在服务端切换证书后会直接报SSL校验失败,无法正常请求接口。
参考更新配置代码示例:
// 证书公钥绑定更新示例 val certificatePinner = CertificatePinner.Builder() .add("你的业务域名", "sha256/旧证书公钥哈希") // 过渡期保留旧证书配置 .add("你的业务域名", "sha256/新证书公钥哈希") // 新增新证书配置 .build() // 配置到OkHttp后传给Retrofit即可 val okHttpClient = OkHttpClient.Builder() .certificatePinner(certificatePinner) .build() val retrofit = Retrofit.Builder() .baseUrl("你的接口根地址") .client(okHttpClient) .build() - 提前预埋方案:每次发版时提前在代码中预埋未来要更换的新证书公钥哈希/证书文件,比如使用OkHttp的
二、是否每次SSL证书到期都需要执行更新操作
不一定,需要结合你的配置判断:
- 未配置证书绑定的场景:只要服务端每次更换的是正规CA签发的有效证书,客户端不需要做任何更新操作,也不需要修改代码发版。
- 已配置证书绑定的场景:
- 如果绑定的是根CA/中间CA的公钥:只要新的域名证书是同一个CA机构签发,公钥没有变更,就不需要更新客户端配置,到期仅需要服务端换证书即可。
- 如果绑定的是单张域名证书的公钥/文件,或者用的是自签名证书:每次证书到期更换新证书时,都需要按上面的更新流程提前预埋新证书信息、发版更新客户端,否则会出现SSL校验错误。
内容的提问来源于stack exchange,提问作者Karthik Ravi
相关产品推荐
相关产品推荐

