仅忽略单一服务器证书链的代码是否可用于Google Play上架应用?
Google Play对SSL证书忽略代码的审核疑问
我了解Google Play会拒绝使用信任所有SSL证书代码的应用,但下述仅忽略单个服务器证书链的代码是否会被Google Play允许?
public class ServiceGenerator { public static String PREF_COOKIES = "pref_cookies"; private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); private static Retrofit.Builder builder; public static <S> S createService(Class<S> serviceClass) { return createService(serviceClass, null); } public static <S> S createService(Class<S> serviceClass, final HashMap<String, String> headers) { builder = new Retrofit.Builder() .baseUrl("your service address") .addConverterFactory(GsonConverterFactory.create()); httpClient.sslSocketFactory(getSSLSocketFactory()); httpClient.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); OkHttpClient client = httpClient.build(); Retrofit retrofit = builder.client(client).build(); return retrofit.create(serviceClass); } private static SSLSocketFactory getSSLSocketFactory() { try { // Create a trust manager that does not validate certificate chains final TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } } }; // Install the all-trusting trust manager final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); return sslSocketFactory; } catch (KeyManagementException | NoSuchAlgorithmException e) { return null; } } }
我在Stack Overflow的另一篇帖子中找到这段代码,但因声望低于50无法评论。
我的解答
嘿,我来帮你理清楚这个问题——你贴的这段代码其实并不是只忽略单个服务器的证书链,它本质上是完全信任所有SSL证书,所以很大概率会被Google Play拒绝上架。
为什么这么说?我们拆解下代码里的核心问题:
- 你看
getSSLSocketFactory()里的X509TrustManager实现,checkServerTrusted方法是空的,这意味着不管服务器返回什么证书(哪怕是恶意伪造的),应用都会无条件信任,根本没有做任何“单个服务器”的限制。 - 另外那个
HostnameVerifier直接返回true,等于跳过了主机名和证书匹配的关键验证步骤,这进一步让应用暴露在中间人攻击的风险里。
Google Play对应用的安全合规要求非常严格,这类全盘绕过SSL证书验证的代码属于不安全的网络实践,会被视为高风险行为,审核阶段几乎肯定会被打回。
如果你的需求是信任某个特定服务器的自签名证书,正确的做法是:把该服务器的证书文件打包到应用中,然后创建仅信任这个特定证书的TrustManager,而不是用这种全盘禁用验证的方式。这样既满足了你的需求,又符合Google Play的安全政策。
内容的提问来源于stack exchange,提问作者Bwalya
相关产品推荐
相关产品推荐

