【问题标题】:Android cannot resolve hostname on internal network - but I can't use IP addressAndroid 无法解析内部网络上的主机名 - 但我无法使用 IP 地址
【发布时间】:2021-08-10 11:40:51
【问题描述】:

我的 Android 应用程序用于客户的内部网络,部分配置涉及他们输入 Web 服务的 URL。

Android 从一开始就似乎无法看到内部网络中的主机名,所以直到现在我一直建议人们使用他们服务器的 IP 地址。最近出现的一个问题是客户已将 SSL 应用到他们的服务器,这意味着 URL 只能通过 https 访问,并且自签名证书当然匹配主机名而不是 IP 地址。通过 IP 地址对 URL 的请求不再有效,无论您指定 http 还是 https。

谷歌搜索了几天,建议要么根设备并修改主机文件,要么提供内部 DNS-over-TLS 服务器,但我无法使用这两个选项。

解析内部主机名肯定不会这么难吗?

我不完全确定这是一个代码问题,因为该问题在 Chrome 中可以重现,但这是我的代码:

protected JSONObject doInBackground(String... params) {
            try {
                URL url = new URL("http://officeserver/PTSWeb/PTSCommsServer.asmx");
                HttpURLConnection huc = (HttpURLConnection) url.openConnection();
                HttpURLConnection.setFollowRedirects(false);
                huc.setConnectTimeout(5 * 1000);
                huc.setRequestMethod("GET");
                huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
                huc.connect(); //FAILS HERE WITH UNABLE TO RESOLVE HOST
                BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream()));
                String result = "";
                StringBuilder total = new StringBuilder();
                for (String line; (line = in.readLine()) != null; ) {
                    total.append(line).append('\n');
                }
                in.close();
                result = total.toString();
                return new JSONObject(result);
            } catch (Exception e) {
                try {
                    JSONObject MyErrorJSON = new JSONObject();
                    MyErrorJSON.accumulate("WasError", "True");
                    MyErrorJSON.accumulate("ResponseText", e.toString());
                    return MyErrorJSON;
                } catch (Exception x) {
                    return null;
                }
            }
        }

【问题讨论】:

  • 您应该能够使用客户网络上的 DNS 服务的详细信息配置 Android 设备;例如androidpolice.com/2020/03/26/make-android-use-dns-server-choice
  • 不幸的是,他们没有与 DNS-over-TLS 兼容的服务器。或者他们告诉我
  • 这里有一些其他选择:android.stackexchange.com/questions/78320。 1) 编辑/etc/hosts 文件。 2)在设备本身上安装本地DNS服务器...
  • 在设备上安装证书怎么样?
  • “Android 从一开始就似乎无法看到内部网络中的主机名”——这个主机名是在哪里定义的?这是真实 DNS 服务器上的真实 DNS 条目,还是某些特定于 Windows 的东西? “客户已将 SSL 应用到他们的服务器,这意味着 URL 只能通过 https 访问,并且自签名证书当然与主机名匹配,而不是 IP 地址”——然后您将遇到其他问题,因为 Android 将拒绝该证书, 如果它是自签名的。

标签: java android httpurlconnection hostname


【解决方案1】:

您实际上可以通过简单的 http 与 IP 地址进行连接,将其放入清单中以允许明文流量:

<application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2016-09-14
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2021-01-04
    • 2017-12-20
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多