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

根据Googe Play Store提供的应用程序中正确的主机名验证器

司马振国
2023-03-14

到目前为止,我使用以下代码来调用应用程序中的“https”API。

 public class HttpsTrustManager implements X509TrustManager {

private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{};

@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException {

}

@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException {

}

public boolean isClientTrusted(X509Certificate[] chain) {
    return true;
}

public boolean isServerTrusted(X509Certificate[] chain) {
    return true;
}

@Override
public X509Certificate[] getAcceptedIssuers() {
    return _AcceptedIssuers;
}

public static void allowAllSSL() {
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {

        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }

    });

    SSLContext context = null;
    if (trustManagers == null) {
        trustManagers = new TrustManager[]{new HttpsTrustManager()};
    }

    try {
        context = SSLContext.getInstance("TLS");
        context.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyManagementException e) {
        e.printStackTrace();
    }

    HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
}

}

我对谷歌play Store所做的android安全更改感到陌生。我从play Store收到了以下警告:

更改自定义HostnameVerifier接口中的verify方法,使其在服务器的主机名不符合您的期望时返回false。

我想知道我应该在应用程序或服务器中做什么样的改变??我已经尝试了堆栈溢出中存在的其他链接,但我不想澄清这一点,我应该修改应用程序还是只是在服务器中创建签名证书?

我能找到但不确定是否有效的解决方案

如果添加以下代码:

 `HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession arg1) {
            if (hostname.equalsIgnoreCase("https://xxxxxx.xx") ){

                return true;
            } else {
                return false;
            }
        }});`

那么在play Store里不会有什么问题吗?

共有1个答案

利俊迈
2023-03-14

这不是SSL的有效或安全实现,也不是您建议的解决方案。

正确的解决方案是删除所有这些代码。

您的allowAllSSL方法所做的唯一事情是完全禁用所有SSL安全性。这样做将使用户容易受到基于网络的窃听和攻击

 类似资料:
  • 我正在尝试使用pact jvm进行用户驱动合约测试,并且能够生成用户端合约文件。在提供者端验证过程中,如何提供公共API而不是localhost大多数示例只使用localhost作为提供者,请提供帮助

  • 出于某种原因,即使在我打开Vk provider并填写所有ID/clientsecrets之后,页面返回未找到的。有关于如何使Vk身份验证提供程序工作的完整教程吗?

  • 现在,我们有了集成执行器。我希望我的执行器endpoint可以通过基本认证在浏览器中访问。 为此,我用@order(1)添加了WebSecurityConfigurerAdapter的一个实现。它在浏览器上工作得很好。但是,当我从angualar应用程序调用登录url时,它为/oauth/token url给出了401个未经授权的错误,因此我无法从ui应用程序登录。 任何帮助将感谢解决此错误。 类

  • 在测试我的客户机-服务器分布式系统时,我最初惊讶地得知TLS的默认JSSE实现不进行主机名验证。我在这个问题中尝试了公认的答案,但我的用例有点不同。我使用RabbitMQ的连接工厂,它抽象了SSLSocket的构造。我只是为连接工厂提供了一个SSLContext。我确实找到了很多关于HTTPS的信息,甚至还有一些其他协议,但并不是总能使用的通用协议,即使是自定义协议。 但是,除了使用之外,关于创建

  • 我正在尝试使用Docker的uWSGI为Django应用程序提供服务。我正在使用supervisord在Dockerfile的末尾为我启动流程。当我运行图像时,它说uWSGI进程启动并成功,但我无法在我认为会显示它的URL处查看应用程序。也许我没有正确设置/配置东西? 我现在没有启动nginx,因为我目前正在通过Amazon S3提供静态文件,并且希望首先专注于启动和运行wsgi。 通过执行,我成

  • > 我通过terraform创建了一个自签名tls证书和私钥。这些文件称为服务器。密钥和服务器。crt 我用这个证书和私钥创建了一个kubernetes tls机密:kubectl create secret tls dpaas secret-n dpaas prod-key server。密钥--cert server.crt 这工作正常,nginx入口ssl终止工作,以下kubectl命令:k