当前位置: 首页 > 知识库问答 >
问题:

被Google Play拒绝的应用

劳英华
2023-03-14

我正在开发一个包含社交网络登录的Android应用程序。在这个问题之后,我删除了包含“WebViewClient.onReceivedSslError”的类。但当我在Google Play Store上传应用程序时,它被拒绝了,并出现以下错误。

“如何在应用程序中处理WebView SSL错误处理程序警报。”

我也使用这个类在后台发送邮件。这使用了“SSL”和“TrustManagerFactory”。X509”。这会是拒绝的理由吗?我想如果这是拒绝的原因,那么我可能会得到一些其他错误,如“由于X509TrustManager的不安全实现,应用程序被谷歌Play商店拒绝”。

寻求支持。提前致谢。

这是我从谷歌播放得到的消息。

你好,谷歌游戏开发者,

我们拒绝了包名为com.avonmobility.visapp的VISApp,因为它违反了我们的恶意行为或用户数据政策。如果您提交了更新,您的应用的旧版本仍然可以在Google Play上使用。

此应用程序使用的软件包含用户的安全漏洞,或允许在不进行适当披露的情况下收集用户数据。

以下是在您最近提交的问题列表和相应的 APK 版本。请尽快升级您的应用,并递增已升级 APK 的版本号。

漏洞APK版本SSL错误处理程序有关如何解决WebView SSL错误处理程序警报的更多信息,请参阅此Google帮助中心文章。

15要确认您已正确升级,请将应用程序的更新版本提交到开发者控制台,并在五小时后再次检查以确保警告消失。

虽然这些漏洞可能不会影响使用此软件的每个应用程序,但最好及时了解所有安全补丁。确保更新应用程序中已知存在安全问题的任何库,即使您不确定这些问题与您的应用程序相关。

应用程序还必须遵守开发商分销协议和开发商计划政策。

如果您认为我们做出的这一决定是错误的,请联系我们的开发人员支持团队。

最好的

谷歌游戏团队

共有3个答案

赵正雅
2023-03-14

我也有同样的问题,在你的项目中添加这个,创建一个类。

                  import org.apache.http.HttpVersion;
       import org.apache.http.conn.ClientConnectionManager;
        import org.apache.http.conn.scheme.PlainSocketFactory;
        import org.apache.http.conn.scheme.Scheme;
       import org.apache.http.conn.scheme.SchemeRegistry;
     import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
        import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
      import org.apache.http.params.BasicHttpParams;
                                import org.apache.http.params.HttpParams;
    import org.apache.http.params.HttpProtocolParams;
       import org.apache.http.protocol.HTTP;

          import java.io.BufferedInputStream;
     import java.io.IOException;
      import java.io.InputStream;
     import java.net.Socket;
     import java.security.KeyManagementException;
     import java.security.KeyStore;
   import java.security.KeyStoreException;
   import java.security.NoSuchAlgorithmException;
   import java.security.UnrecoverableKeyException;
     import java.security.cert.Certificate;
       import java.security.cert.CertificateException;
     import java.security.cert.CertificateFactory;
       import java.security.cert.X509Certificate;

        import javax.net.ssl.HttpsURLConnection;
         import javax.net.ssl.SSLContext;
     import javax.net.ssl.TrustManager;
     import javax.net.ssl.X509TrustManager;


       public class MySSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");


public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
    super(truststore);

    X509TrustManager tm = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    sslContext.init(null, new TrustManager[]{tm}, null);
}

@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
    return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}

@Override
public Socket createSocket() throws IOException {
    return sslContext.getSocketFactory().createSocket();
}

/**
 * Makes HttpsURLConnection trusts a set of certificates specified by the KeyStore
 */
public void fixHttpsURLConnection() {
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}

/**
 * Gets a KeyStore containing the Certificate
 *
 * @param cert InputStream of the Certificate
 * @return KeyStore
 */
public static KeyStore getKeystoreOfCA(InputStream cert) {

    // Load CAs from an InputStream
    InputStream caInput = null;
    Certificate ca = null;
    try {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        caInput = new BufferedInputStream(cert);
        ca = cf.generateCertificate(caInput);
    } catch (CertificateException e1) {
        e1.printStackTrace();
    } finally {
        try {
            if (caInput != null) {
                caInput.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // Create a KeyStore containing our trusted CAs
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = null;
    try {
        keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return keyStore;
}

/**
 * Gets a Default KeyStore
 *
 * @return KeyStore
 */
public static KeyStore getKeystore() {
    KeyStore trustStore = null;
    try {
        trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);
    } catch (Throwable t) {
        t.printStackTrace();
    }
    return trustStore;
}

/**
 * Returns a SSlSocketFactory which trusts all certificates
 *
 * @return SSLSocketFactory
 */
public static SSLSocketFactory getFixedSocketFactory() {
    SSLSocketFactory socketFactory;
    try {
        socketFactory = new MySSLSocketFactory(getKeystore());
        socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    } catch (Throwable t) {
        t.printStackTrace();
        socketFactory = SSLSocketFactory.getSocketFactory();
    }
    return socketFactory;
}

/**
 * Gets a DefaultHttpClient which trusts a set of certificates specified by the KeyStore
 *
 * @param keyStore custom provided KeyStore instance
 * @return DefaultHttpClient
 */
public static DefaultHttpClient getNewHttpClient(KeyStore keyStore) {

    try {
        SSLSocketFactory sf = new MySSLSocketFactory(keyStore);
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}

}

柯栋
2023-03-14
I also had SSLCertification issue at the time uploading singed apk.
you have to return true for all your trusted http hosts including 3rd party libraries http.

在这里我把我是如何解决这个问题的,对不起,安全我没有把原来的链接路径,这些链接帮助我。

     TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            X509Certificate[] myTrustedAnchors = new X509Certificate[0];
            return myTrustedAnchors;
        }

        @Override
        public void checkClientTrusted(X509Certificate[] certs, String authType) {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] certs, String authType) {
        }
      }};
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession arg1) {
                if (hostname.equalsIgnoreCase("demo.mysite.com") ||
                        hostname.equalsIgnoreCase("prod.mysite.com") ||
                        hostname.equalsIgnoreCase("22.2.202.22:3333") ||
                        hostname.equalsIgnoreCase("cloud.cloudDeveSite.net") ||                            
                        hostname.equalsIgnoreCase("11.2.222.22:2222") ||
                        hostname.equalsIgnoreCase("multispidr.3rdPartyLibrary.io")) {
                    return true;
                } else {
                    return false;
                }
            }
        });

提到了所有有SSLCertification问题的api,你还必须提到第三方api,当你运行这些代码时,你会得到错误的HTTP链接。

叶琦
2023-03-14

要解决Google Play警告:WebViewClient。onReceivedSslError处理程序

不总是强制处理程序。.但你还必须包括处理程序。因此,用户可以避免取消加载内容。

处理WebViewClient.onReceivedSslError处理程序的不安全实现

使用以下代码

 webView.setWebViewClient(new SSLTolerentWebViewClient());
 webView.loadUrl(myhttps url);

 private class SSLTolerentWebViewClient extends WebViewClient {
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {

    AlertDialog.Builder builder = new AlertDialog.Builder(Tab1Activity.this);
    AlertDialog alertDialog = builder.create();
    String message = "SSL Certificate error.";
    switch (error.getPrimaryError()) {
        case SslError.SSL_UNTRUSTED:
            message = "The certificate authority is not trusted.";
            break;
        case SslError.SSL_EXPIRED:
            message = "The certificate has expired.";
            break;
        case SslError.SSL_IDMISMATCH:
            message = "The certificate Hostname mismatch.";
            break;
        case SslError.SSL_NOTYETVALID:
            message = "The certificate is not yet valid.";
            break;
    }

    message += " Do you want to continue anyway?";
    alertDialog.setTitle("SSL Certificate Error");
    alertDialog.setMessage(message);
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Ignore SSL certificate errors
            handler.proceed();
        }
    });

    alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            handler.cancel();
        }
    });
    alertDialog.show();
}
}

您必须提醒用户SSL,以便Google将允许您的应用程序执行此操作

 类似资料:
  • 我有一个带有Python脚本的Node.js应用程序,我正试图将它部署到Heroku。 每次尝试添加buildpack,都会被拒绝。 远程:找不到满足要求的版本pywin32==224(来自-r/tmp/build_ebad00F3B8D3C9B4B03965F0D0924E7a/requirement.txt(第57行))(来自版本:)远程:找不到与pywin32==224(来自-r/tmp/b

  • 我有一个问题。我有操作系统CentOS 5.8。我已经在httpd.conf文件中编写了这个配置: 听 85 在文件末尾: selinux是许可的。 以下是apache使用的目录和文件: 当我打电话的时候 '服务器ip':85/wsgi 从浏览器,有我的服务器的ip而不是'服务器ip ',我得到消息:(403)禁止:你没有权限访问/wsgi在这个服务器上。 和/var/log/httpd/erro

  • 我按照这个链接创建我的第一个docker映像,它成功了,现在我正试图从这个链接将这个映像推送到我的docker存储库中。但每当我试图将此图像推入存储库时,就会出现这种类型的错误。 有人能给我一些关于这个问题的提示吗?任何帮助都将不胜感激。 注意:我已成功登录docker

  • 在google play商店完成必要的手续后,我为我的应用程序上传了一个apk文件。 几分钟后,我查看了我的帐户,该帐户显示以下消息, 您的 APK 因包含违反恶意行为政策的安全漏洞而被拒绝。“警报”页包含有关如何解决此问题的详细信息。 如果您提交了更新,则您之前版本的应用仍会在 Google Play 上线。 我收到一封邮件,上面写着:“以下是在您最近提交的文件中发现的问题列表和相应的APK版本

  • 我正在按照这个链接创建我的第一个docker映像,它成功了,现在我正在尝试从这个链接将此映像推送到我的docker存储库中。但是每当我试图将此映像推送到存储库时,我都会遇到此类错误。 注意:我已成功登录docker

  • 我正在使用另一个容器中的DockerizeSpring启动应用程序和redis。 我使用docker comush在同一个网络中运行两个容器,这是我的docker-compose.yml: 这是我的application.yml文件: 我也尝试了redis hots=redis,但结果是一样的。 我的问题是,我得到这个java.net.连接异常:拒绝连接(拒绝连接)”,即使容器在同一个网络中。 我