Flutter中SSL固定最佳实践:证书存储与动态获取的安全性探讨
Flutter中SSL固定的常见疑问解答
1. 将.pem证书文件存储在assets中是否安全?若不安全,应存储在何处?
把.pem证书存在assets里不算安全——APK/IPA安装包可以被轻松反编译,assets目录下的文件能直接被提取出来,攻击者拿到证书后就能模拟合法服务器发起中间人攻击。
更稳妥的处理方式:
- 硬编码证书内容到Dart代码:把.pem文件的内容转换成字符串常量直接写进代码里,虽然反编译后仍能找到,但相比直接提取文件,攻击者需要额外步骤去定位、识别这段字符串,提升了攻击成本;
- 配合代码混淆:开启Flutter的代码混淆(Android端还可以加native层混淆),混淆后硬编码的证书字符串会被打乱,进一步增加逆向难度;
- 没有绝对安全的存储方案,以上做法都是通过提升攻击成本来增强安全性,这也是SSL固定场景下的通用思路。
2. 在应用启动时请求服务器获取证书,而非预先存储在应用内,是否更安全且更符合最佳实践?
这种做法反而存在严重安全漏洞,不符合最佳实践。
核心问题在于:首次启动请求服务器拿证书的过程没有SSL固定保护,攻击者可以通过中间人攻击篡改请求返回结果,给应用返回伪造的证书。之后应用会基于这个伪造证书进行SSL固定,相当于把信任权完全交给攻击者,所有后续请求都会被劫持。
如果需要实现证书动态更新,正确姿势是:预先在应用内存储至少一个信任锚证书(比如你的CA根证书),之后通过这个信任锚保护的安全通道去获取新的业务证书,确保初始请求的安全性。动态更新仅适合证书轮换场景,不能完全替代预先存储的信任基础。
另外针对你当前的做法:把证书存在assets,通过GlobalConfiguration().getValue()从app_settings.json获取路径,建议尽快改成硬编码证书内容加混淆的方式,降低证书被提取的风险。
内容的提问来源于stack exchange,提问作者Alazaizeh
相关产品推荐
相关产品推荐

