Android设备上OkHttp自定义随机数生成器失效问题问询
Android系统SSL实现的底层差异
Android采用BoringSSL(早期版本为OpenSSL)作为SSL/TLS栈,和Oracle JDK的SSL实现逻辑完全不同。在Android环境下,SSLContext.init()传入的自定义SecureRandom大概率会被系统忽略——SSL握手所需的随机数由系统底层安全模块生成,优先使用系统级的安全随机源,而非应用层传入的自定义实现。OkHttp在Android平台的适配逻辑
OkHttp针对Android做了专属平台适配,当系统版本满足特定条件时,会自动使用系统默认的SSLSocketFactory或者自身优化的实现,可能直接绕过你自定义的CustomSSLSocketFactory。比如在Android 7.0+版本中,OkHttp会适配系统原生的TLS配置,导致你设置的自定义随机数生成器无法生效。Android安全策略的强制约束
Android为保障应用安全性,对SSL相关的随机数生成有严格限制。如果应用传入的自定义SecureRandom不符合系统的安全标准(比如熵值不足、实现逻辑不安全),系统会自动替换为符合要求的随机源,避免引入安全风险。SSLContext初始化逻辑的平台差异
原生Java中SSLContext.getInstance("TLS")返回的是遵循JDK规范的SSL实现,会严格尊重init()方法传入的SecureRandom参数;而Android中该方法返回的BoringSSL实现,其init()方法对传入的随机数生成器参数处理逻辑不同,直接忽略该参数、使用内部默认实现是常见情况。
内容的提问来源于stack exchange,提问作者Frank Müller

