You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅忽略单一服务器证书链的代码是否可用于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:08:12